diff --git a/.changeset/beige-chicken-type.md b/.changeset/beige-chicken-type.md deleted file mode 100644 index d73500a7f9..0000000000 --- a/.changeset/beige-chicken-type.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'yarn-plugin-backstage': patch ---- - -Use yarn's built-in http utilities for fetching release manifests diff --git a/.changeset/big-seals-drum.md b/.changeset/big-seals-drum.md new file mode 100644 index 0000000000..9b4ab16701 --- /dev/null +++ b/.changeset/big-seals-drum.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-home': patch +--- + +Exported `QuickStartCard` component. diff --git a/.changeset/brave-maps-deliver.md b/.changeset/brave-maps-deliver.md deleted file mode 100644 index 51b60af153..0000000000 --- a/.changeset/brave-maps-deliver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index 22f768b441..0000000000 --- a/.changeset/brave-teachers-mate.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@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/breezy-coats-sort.md b/.changeset/breezy-coats-sort.md new file mode 100644 index 0000000000..862d60e4fc --- /dev/null +++ b/.changeset/breezy-coats-sort.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-github': patch +--- + +Updates to allow users to subscribe to the newly created repository within GitHub to mimic similar functionality found within the GitHub UI. diff --git a/.changeset/brown-monkeys-ring.md b/.changeset/brown-monkeys-ring.md deleted file mode 100644 index 5aaf738d38..0000000000 --- a/.changeset/brown-monkeys-ring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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/calm-tigers-boil.md b/.changeset/calm-tigers-boil.md new file mode 100644 index 0000000000..0e19371805 --- /dev/null +++ b/.changeset/calm-tigers-boil.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Fixed incompatible `@typescript-eslint` versions with current `eslint@8.x.x` diff --git a/.changeset/chatty-weeks-impress.md b/.changeset/chatty-weeks-impress.md deleted file mode 100644 index 21beb168e9..0000000000 --- a/.changeset/chatty-weeks-impress.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -'@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/cold-icons-worry.md b/.changeset/cold-icons-worry.md deleted file mode 100644 index 4e0b461b24..0000000000 --- a/.changeset/cold-icons-worry.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@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 deleted file mode 100644 index c0356db3ad..0000000000 --- a/.changeset/cold-jeans-stare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Updated the template to use `@backstage/cli/config/prettier` instead of `@spotify/prettier-config`. diff --git a/.changeset/create-app-1735034814.md b/.changeset/create-app-1735034814.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1735034814.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/create-app-1736262177.md b/.changeset/create-app-1736262177.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1736262177.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/cuddly-chicken-wink.md b/.changeset/cuddly-chicken-wink.md deleted file mode 100644 index 79843ba64d..0000000000 --- a/.changeset/cuddly-chicken-wink.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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-lions-knock.md b/.changeset/cuddly-lions-knock.md new file mode 100644 index 0000000000..dd5a6b31e7 --- /dev/null +++ b/.changeset/cuddly-lions-knock.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-openapi': patch +--- + +Refactor to no longer use backend-common diff --git a/.changeset/cuddly-schools-scream.md b/.changeset/cuddly-schools-scream.md deleted file mode 100644 index 533d3d1d4e..0000000000 --- a/.changeset/cuddly-schools-scream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index c0e061c99b..0000000000 --- a/.changeset/curly-hats-tell.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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/cyan-frogs-count.md b/.changeset/cyan-frogs-count.md new file mode 100644 index 0000000000..b06a07468a --- /dev/null +++ b/.changeset/cyan-frogs-count.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +'@backstage/plugin-devtools-backend': patch +--- + +Remove the error handler middleware, since that is now provided by the framework diff --git a/.changeset/cyan-rocks-divide.md b/.changeset/cyan-rocks-divide.md deleted file mode 100644 index 8576e515d8..0000000000 --- a/.changeset/cyan-rocks-divide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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/dry-hounds-study.md b/.changeset/dry-hounds-study.md new file mode 100644 index 0000000000..0d58431439 --- /dev/null +++ b/.changeset/dry-hounds-study.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-signals-backend': minor +--- + +Removed support for the old backend system. If you were using the old `createRouter` export, please migrate to [the new backend system](https://backstage.io/docs/backend-system/). diff --git a/.changeset/dry-needles-taste.md b/.changeset/dry-needles-taste.md deleted file mode 100644 index 472bc0edb3..0000000000 --- a/.changeset/dry-needles-taste.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@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/empty-bugs-deliver.md b/.changeset/empty-bugs-deliver.md deleted file mode 100644 index 5b26f4eaca..0000000000 --- a/.changeset/empty-bugs-deliver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-defaults': patch ---- - -Export `DefaultHttpAuthService` to allow for custom token extraction logic. diff --git a/.changeset/empty-ways-push.md b/.changeset/empty-ways-push.md deleted file mode 100644 index 11a67985d8..0000000000 --- a/.changeset/empty-ways-push.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-search-backend-module-elasticsearch': patch ---- - -Update the ElasticSearchSearchEngine translator to handle phrase searches. diff --git a/.changeset/famous-balloons-punch.md b/.changeset/famous-balloons-punch.md new file mode 100644 index 0000000000..a6e7072974 --- /dev/null +++ b/.changeset/famous-balloons-punch.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +'@backstage/backend-defaults': patch +--- + +Go back to using `node-fetch` for gitlab diff --git a/.changeset/famous-dryers-protect.md b/.changeset/famous-dryers-protect.md new file mode 100644 index 0000000000..b015a562aa --- /dev/null +++ b/.changeset/famous-dryers-protect.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +'@backstage/plugin-scaffolder-node': patch +--- + +Added the ability to use `${{ context.task.id }}` in nunjucks templating, as well as `ctx.task.id` in actions to get the current task ID. diff --git a/.changeset/fast-cheetahs-deliver.md b/.changeset/fast-cheetahs-deliver.md deleted file mode 100644 index ce87a68409..0000000000 --- a/.changeset/fast-cheetahs-deliver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index 1dc6becad1..0000000000 --- a/.changeset/few-colts-train.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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-pillows-remember.md b/.changeset/few-pillows-remember.md deleted file mode 100644 index 8f13651a70..0000000000 --- a/.changeset/few-pillows-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-react': patch ---- - -Fixed an issue causing the `EntityOwnerPicker` to reset scrolling when more elements are loaded. diff --git a/.changeset/five-goats-travel.md b/.changeset/five-goats-travel.md deleted file mode 100644 index 361c530fca..0000000000 --- a/.changeset/five-goats-travel.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@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/fluffy-cobras-sort.md b/.changeset/fluffy-cobras-sort.md deleted file mode 100644 index 363281a6c5..0000000000 --- a/.changeset/fluffy-cobras-sort.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index 7cdce8229c..0000000000 --- a/.changeset/fluffy-falcons-shout.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@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 deleted file mode 100644 index 308f12d10a..0000000000 --- a/.changeset/fluffy-zebras-cheer.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@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 deleted file mode 100644 index 5aa177a63f..0000000000 --- a/.changeset/forty-apples-complain.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/backend-plugin-api': patch -'@backstage/backend-app-api': patch ---- - -Removed unused `express` dependencies. diff --git a/.changeset/friendly-dots-thank.md b/.changeset/friendly-dots-thank.md deleted file mode 100644 index 50337c0a0f..0000000000 --- a/.changeset/friendly-dots-thank.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@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/gentle-deers-return.md b/.changeset/gentle-deers-return.md new file mode 100644 index 0000000000..5784226b1d --- /dev/null +++ b/.changeset/gentle-deers-return.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Allow passing down `withSearch` prop to `EntityTechdocsContent` component since it was `true` by default, now user can use the `EntityTechdocsContent` component _without_ showing the search field on top of the content. diff --git a/.changeset/gold-stingrays-cross.md b/.changeset/gold-stingrays-cross.md deleted file mode 100644 index f2a8da99b3..0000000000 --- a/.changeset/gold-stingrays-cross.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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-zebras-tan.md b/.changeset/gorgeous-zebras-tan.md new file mode 100644 index 0000000000..7a71d9c724 --- /dev/null +++ b/.changeset/gorgeous-zebras-tan.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend-module-email': patch +--- + +Added more examples of the plugin configuration diff --git a/.changeset/great-buttons-cross.md b/.changeset/great-buttons-cross.md deleted file mode 100644 index 02247b94bf..0000000000 --- a/.changeset/great-buttons-cross.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-app-backend': patch ---- - -Fixed a bug where config would not be injected on the `/` and `/index.html` paths. diff --git a/.changeset/happy-forks-listen.md b/.changeset/happy-forks-listen.md deleted file mode 100644 index 4274c830f1..0000000000 --- a/.changeset/happy-forks-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/release-manifests': patch ---- - -Switch to native fetch for loading release manifests diff --git a/.changeset/healthy-years-begin.md b/.changeset/healthy-years-begin.md deleted file mode 100644 index a1952b6648..0000000000 --- a/.changeset/healthy-years-begin.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@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-needles-poke.md b/.changeset/heavy-needles-poke.md deleted file mode 100644 index 91a98a9102..0000000000 --- a/.changeset/heavy-needles-poke.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@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 deleted file mode 100644 index 6c2bffa5af..0000000000 --- a/.changeset/honest-hornets-double.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-node': minor ---- - -Updated the `catalogServiceMock` return type to match both `CatalogService` and `CatalogApi` diff --git a/.changeset/hungry-hairs-wait.md b/.changeset/hungry-hairs-wait.md deleted file mode 100644 index ed4cd01ac7..0000000000 --- a/.changeset/hungry-hairs-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -Generated OpenAPI clients now support paths with tags. diff --git a/.changeset/itchy-rats-pump.md b/.changeset/itchy-rats-pump.md deleted file mode 100644 index 3b9073da77..0000000000 --- a/.changeset/itchy-rats-pump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Compute deltas more efficiently, which generally leads to less wasted processing cycles diff --git a/.changeset/khaki-fireants-begin.md b/.changeset/khaki-fireants-begin.md new file mode 100644 index 0000000000..6b9b5257f0 --- /dev/null +++ b/.changeset/khaki-fireants-begin.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend-module-catalog': patch +--- + +Internal refactor to use cursor based pagination diff --git a/.changeset/khaki-ladybugs-swim.md b/.changeset/khaki-ladybugs-swim.md deleted file mode 100644 index 79cc1358df..0000000000 --- a/.changeset/khaki-ladybugs-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-node': patch ---- - -Clarified purpose of subscriber ID in TSDoc for `EventsServiceSubscribeOptions`. diff --git a/.changeset/khaki-shrimps-tease.md b/.changeset/khaki-shrimps-tease.md deleted file mode 100644 index a4dd3bc8e0..0000000000 --- a/.changeset/khaki-shrimps-tease.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@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/lazy-pants-attack.md b/.changeset/lazy-pants-attack.md deleted file mode 100644 index 87a5fadb45..0000000000 --- a/.changeset/lazy-pants-attack.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index 23bd77a0bb..0000000000 --- a/.changeset/lazy-years-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-react': patch ---- - -Fix catalog filtering to allow searching entities by display name diff --git a/.changeset/lemon-students-care.md b/.changeset/lemon-students-care.md new file mode 100644 index 0000000000..951430f06a --- /dev/null +++ b/.changeset/lemon-students-care.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Corrected spelling mistake in error message diff --git a/.changeset/light-wasps-unite.md b/.changeset/light-wasps-unite.md new file mode 100644 index 0000000000..1075633f04 --- /dev/null +++ b/.changeset/light-wasps-unite.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-techdocs-backend': patch +--- + +fix(config): add missing parameters in config schema diff --git a/.changeset/little-scissors-fold.md b/.changeset/little-scissors-fold.md new file mode 100644 index 0000000000..1b70e3977d --- /dev/null +++ b/.changeset/little-scissors-fold.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': patch +--- + +Fix field extension validation not working when field is in dependencies in an array field diff --git a/.changeset/long-parrots-hide.md b/.changeset/long-parrots-hide.md new file mode 100644 index 0000000000..ac6c08b809 --- /dev/null +++ b/.changeset/long-parrots-hide.md @@ -0,0 +1,7 @@ +--- +'@backstage/frontend-plugin-api': patch +'@backstage/core-plugin-api': patch +'@backstage/types': patch +--- + +Move `Expand` and `ExpandRecursive` to `@backstage/types` diff --git a/.changeset/mean-shirts-design.md b/.changeset/mean-shirts-design.md deleted file mode 100644 index ea89c6ecfd..0000000000 --- a/.changeset/mean-shirts-design.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli-node': patch ---- - -add PackageManager and Lockfile interfaces for future use diff --git a/.changeset/metal-ravens-hammer.md b/.changeset/metal-ravens-hammer.md new file mode 100644 index 0000000000..e8a97f412c --- /dev/null +++ b/.changeset/metal-ravens-hammer.md @@ -0,0 +1,6 @@ +--- +'@backstage/config-loader': patch +'@backstage/backend-defaults': patch +--- + +Exclude `@backstage/backend-common` from schema collection if `@backstage/backend-defaults` is present diff --git a/.changeset/nasty-pears-taste.md b/.changeset/nasty-pears-taste.md new file mode 100644 index 0000000000..667e85d9d4 --- /dev/null +++ b/.changeset/nasty-pears-taste.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Fixed an issue where the `` in `offset` mode would unnecessarily re-fetch data when the filter didn't change, causing a flicker effect. diff --git a/.changeset/neat-insects-cough.md b/.changeset/neat-insects-cough.md deleted file mode 100644 index fbdf214edb..0000000000 --- a/.changeset/neat-insects-cough.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Be more aggressive in dequeueing entities for stitching diff --git a/.changeset/nervous-bottles-occur.md b/.changeset/nervous-bottles-occur.md new file mode 100644 index 0000000000..c489661645 --- /dev/null +++ b/.changeset/nervous-bottles-occur.md @@ -0,0 +1,11 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab-org': patch +'@backstage/plugin-permission-backend': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-permission-node': patch +'@backstage/plugin-events-backend': patch +'@backstage/plugin-app-backend': patch +'@backstage/plugin-auth-node': patch +--- + +Remove some internal usages of the backend-common package diff --git a/.changeset/new-pandas-perform.md b/.changeset/new-pandas-perform.md deleted file mode 100644 index 797f34d6df..0000000000 --- a/.changeset/new-pandas-perform.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index cae0215bfc..0000000000 --- a/.changeset/new-rules-teach.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@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/nice-waves-count.md b/.changeset/nice-waves-count.md new file mode 100644 index 0000000000..37d9a739b3 --- /dev/null +++ b/.changeset/nice-waves-count.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend': patch +--- + +Remove `@backstage/backend-common` dependency diff --git a/.changeset/odd-apples-explain.md b/.changeset/odd-apples-explain.md deleted file mode 100644 index 324d98b0f6..0000000000 --- a/.changeset/odd-apples-explain.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@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 deleted file mode 100644 index 90e05f1e51..0000000000 --- a/.changeset/odd-worms-peel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Correctly report stitching queue length diff --git a/.changeset/old-taxis-exist.md b/.changeset/old-taxis-exist.md deleted file mode 100644 index f2c7ac1f02..0000000000 --- a/.changeset/old-taxis-exist.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@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 deleted file mode 100644 index d8e9fb1da6..0000000000 --- a/.changeset/olive-berries-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index 8e8aefb096..0000000000 --- a/.changeset/orange-coins-confess.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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-icons-sell.md b/.changeset/orange-icons-sell.md new file mode 100644 index 0000000000..e1f663a9ae --- /dev/null +++ b/.changeset/orange-icons-sell.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Added `-j 2` to `dev` script to help cases where the backend does not start up during local development diff --git a/.changeset/orange-moles-kick.md b/.changeset/orange-moles-kick.md deleted file mode 100644 index 6e6054418e..0000000000 --- a/.changeset/orange-moles-kick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': minor ---- - -Emit scaffolder events using the optional `EventsService` diff --git a/.changeset/pink-bees-shake.md b/.changeset/pink-bees-shake.md deleted file mode 100644 index 2d87b7ef6c..0000000000 --- a/.changeset/pink-bees-shake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index d9bb97e36e..0000000000 --- a/.changeset/pink-pets-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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/polite-foxes-buy.md b/.changeset/polite-foxes-buy.md deleted file mode 100644 index a67af204e0..0000000000 --- a/.changeset/polite-foxes-buy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Add fs:readdir to scaffolder startup diff --git a/.changeset/poor-hounds-jump.md b/.changeset/poor-hounds-jump.md deleted file mode 100644 index 2f1abb8ce8..0000000000 --- a/.changeset/poor-hounds-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index 90195ff999..0000000000 --- a/.changeset/popular-donkeys-rhyme.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 f5f6c0f781..47232c15e9 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -2,277 +2,235 @@ "mode": "pre", "tag": "next", "initialVersions": { - "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", + "example-app": "0.2.104", + "@backstage/app-defaults": "1.5.15", + "example-app-next": "0.0.18", + "app-next-example-plugin": "0.0.18", + "example-backend": "0.0.33", + "@backstage/backend-app-api": "1.1.0", + "@backstage/backend-defaults": "0.6.0", "@backstage/backend-dev-utils": "0.1.5", - "@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/backend-dynamic-feature-service": "0.5.2", + "example-backend-legacy": "0.2.105", + "@backstage/backend-openapi-utils": "0.4.0", + "@backstage/backend-plugin-api": "1.1.0", + "@backstage/backend-test-utils": "1.2.0", + "@backstage/canon": "0.0.0", + "@backstage/catalog-client": "1.9.0", + "@backstage/catalog-model": "1.7.2", + "@backstage/cli": "0.29.4", "@backstage/cli-common": "0.1.15", - "@backstage/cli-node": "0.2.10", + "@backstage/cli-node": "0.2.11", "@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/config": "1.3.1", + "@backstage/config-loader": "1.9.3", + "@backstage/core-app-api": "1.15.3", + "@backstage/core-compat-api": "0.3.4", + "@backstage/core-components": "0.16.2", + "@backstage/core-plugin-api": "1.10.2", + "@backstage/create-app": "0.5.23", + "@backstage/dev-utils": "1.1.5", + "e2e-test": "0.2.23", "@backstage/e2e-test-utils": "0.1.1", - "@backstage/errors": "1.2.5", + "@backstage/errors": "1.2.6", "@backstage/eslint-plugin": "0.1.10", - "@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", + "@backstage/frontend-app-api": "0.10.3", + "@backstage/frontend-defaults": "0.1.4", + "@internal/frontend": "0.0.4", + "@backstage/frontend-plugin-api": "0.9.3", + "@backstage/frontend-test-utils": "0.2.4", + "@backstage/integration": "1.16.0", + "@backstage/integration-aws-node": "0.1.14", + "@backstage/integration-react": "1.2.2", "@internal/opaque": "0.0.1", - "@backstage/release-manifests": "0.0.11", - "@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/release-manifests": "0.0.12", + "@backstage/repo-tools": "0.12.0", + "@internal/scaffolder": "0.0.4", + "@techdocs/cli": "1.8.24", + "techdocs-cli-embedded-app": "0.2.103", + "@backstage/test-utils": "1.7.3", + "@backstage/theme": "0.6.3", "@backstage/types": "1.2.0", "@backstage/version-bridge": "1.0.10", - "yarn-plugin-backstage": "0.0.3", - "@backstage/plugin-api-docs": "0.12.0", + "yarn-plugin-backstage": "0.0.4", + "@backstage/plugin-api-docs": "0.12.2", "@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.8", - "@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-app": "0.1.4", + "@backstage/plugin-app-backend": "0.4.3", + "@backstage/plugin-app-node": "0.1.28", + "@backstage/plugin-app-visualizer": "0.1.14", + "@backstage/plugin-auth-backend": "0.24.1", + "@backstage/plugin-auth-backend-module-atlassian-provider": "0.3.3", + "@backstage/plugin-auth-backend-module-auth0-provider": "0.1.3", + "@backstage/plugin-auth-backend-module-aws-alb-provider": "0.3.1", + "@backstage/plugin-auth-backend-module-azure-easyauth-provider": "0.2.3", + "@backstage/plugin-auth-backend-module-bitbucket-provider": "0.2.3", + "@backstage/plugin-auth-backend-module-bitbucket-server-provider": "0.1.3", + "@backstage/plugin-auth-backend-module-cloudflare-access-provider": "0.3.3", + "@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.3.3", + "@backstage/plugin-auth-backend-module-github-provider": "0.2.3", + "@backstage/plugin-auth-backend-module-gitlab-provider": "0.2.3", + "@backstage/plugin-auth-backend-module-google-provider": "0.2.3", + "@backstage/plugin-auth-backend-module-guest-provider": "0.2.3", + "@backstage/plugin-auth-backend-module-microsoft-provider": "0.2.3", + "@backstage/plugin-auth-backend-module-oauth2-provider": "0.3.3", + "@backstage/plugin-auth-backend-module-oauth2-proxy-provider": "0.2.3", + "@backstage/plugin-auth-backend-module-oidc-provider": "0.3.3", + "@backstage/plugin-auth-backend-module-okta-provider": "0.1.3", + "@backstage/plugin-auth-backend-module-onelogin-provider": "0.2.3", + "@backstage/plugin-auth-backend-module-pinniped-provider": "0.2.3", + "@backstage/plugin-auth-backend-module-vmware-cloud-provider": "0.4.2", + "@backstage/plugin-auth-node": "0.5.5", + "@backstage/plugin-auth-react": "0.1.10", + "@backstage/plugin-bitbucket-cloud-common": "0.2.26", + "@backstage/plugin-catalog": "1.26.0", + "@backstage/plugin-catalog-backend": "1.29.0", + "@backstage/plugin-catalog-backend-module-aws": "0.4.6", + "@backstage/plugin-catalog-backend-module-azure": "0.3.0", + "@backstage/plugin-catalog-backend-module-backstage-openapi": "0.4.3", + "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.4.3", + "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.3.0", + "@backstage/plugin-catalog-backend-module-gcp": "0.3.3", + "@backstage/plugin-catalog-backend-module-gerrit": "0.2.5", + "@backstage/plugin-catalog-backend-module-github": "0.7.8", + "@backstage/plugin-catalog-backend-module-github-org": "0.3.5", + "@backstage/plugin-catalog-backend-module-gitlab": "0.6.0", + "@backstage/plugin-catalog-backend-module-gitlab-org": "0.2.4", + "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.6.1", + "@backstage/plugin-catalog-backend-module-ldap": "0.11.0", + "@backstage/plugin-catalog-backend-module-logs": "0.1.5", + "@backstage/plugin-catalog-backend-module-msgraph": "0.6.5", + "@backstage/plugin-catalog-backend-module-openapi": "0.2.5", + "@backstage/plugin-catalog-backend-module-puppetdb": "0.2.5", + "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.2.3", + "@backstage/plugin-catalog-backend-module-unprocessed": "0.5.3", + "@backstage/plugin-catalog-common": "1.1.2", + "@backstage/plugin-catalog-graph": "0.4.14", + "@backstage/plugin-catalog-import": "0.12.8", + "@backstage/plugin-catalog-node": "1.15.0", + "@backstage/plugin-catalog-react": "1.15.0", + "@backstage/plugin-catalog-unprocessed-entities": "0.2.12", + "@backstage/plugin-catalog-unprocessed-entities-common": "0.0.6", + "@backstage/plugin-config-schema": "0.1.63", + "@backstage/plugin-devtools": "0.1.22", + "@backstage/plugin-devtools-backend": "0.5.0", + "@backstage/plugin-devtools-common": "0.1.14", + "@backstage/plugin-events-backend": "0.4.0", + "@backstage/plugin-events-backend-module-aws-sqs": "0.4.6", + "@backstage/plugin-events-backend-module-azure": "0.2.15", + "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.2.15", + "@backstage/plugin-events-backend-module-gerrit": "0.2.15", + "@backstage/plugin-events-backend-module-github": "0.2.15", + "@backstage/plugin-events-backend-module-gitlab": "0.2.15", + "@backstage/plugin-events-backend-test-utils": "0.1.39", + "@backstage/plugin-events-node": "0.4.6", + "@internal/plugin-todo-list": "1.0.34", + "@internal/plugin-todo-list-backend": "1.0.34", + "@internal/plugin-todo-list-common": "1.0.23", + "@backstage/plugin-home": "0.8.3", + "@backstage/plugin-home-react": "0.1.21", + "@backstage/plugin-kubernetes": "0.12.2", + "@backstage/plugin-kubernetes-backend": "0.19.1", + "@backstage/plugin-kubernetes-cluster": "0.0.20", + "@backstage/plugin-kubernetes-common": "0.9.1", + "@backstage/plugin-kubernetes-node": "0.2.1", + "@backstage/plugin-kubernetes-react": "0.5.2", + "@backstage/plugin-notifications": "0.5.0", + "@backstage/plugin-notifications-backend": "0.5.0", + "@backstage/plugin-notifications-backend-module-email": "0.3.4", + "@backstage/plugin-notifications-common": "0.0.7", + "@backstage/plugin-notifications-node": "0.2.10", + "@backstage/plugin-org": "0.6.34", + "@backstage/plugin-org-react": "0.1.33", + "@backstage/plugin-permission-backend": "0.5.52", + "@backstage/plugin-permission-backend-module-allow-all-policy": "0.2.3", + "@backstage/plugin-permission-common": "0.8.3", + "@backstage/plugin-permission-node": "0.8.6", + "@backstage/plugin-permission-react": "0.4.29", + "@backstage/plugin-proxy-backend": "0.5.9", + "@backstage/plugin-scaffolder": "1.27.2", + "@backstage/plugin-scaffolder-backend": "1.28.0", + "@backstage/plugin-scaffolder-backend-module-azure": "0.2.4", + "@backstage/plugin-scaffolder-backend-module-bitbucket": "0.3.5", + "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud": "0.2.4", + "@backstage/plugin-scaffolder-backend-module-bitbucket-server": "0.2.4", + "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.3.4", + "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.3.5", + "@backstage/plugin-scaffolder-backend-module-gcp": "0.2.4", + "@backstage/plugin-scaffolder-backend-module-gerrit": "0.2.4", + "@backstage/plugin-scaffolder-backend-module-gitea": "0.2.4", + "@backstage/plugin-scaffolder-backend-module-github": "0.5.4", + "@backstage/plugin-scaffolder-backend-module-gitlab": "0.7.0", + "@backstage/plugin-scaffolder-backend-module-notifications": "0.1.5", + "@backstage/plugin-scaffolder-backend-module-rails": "0.5.4", + "@backstage/plugin-scaffolder-backend-module-sentry": "0.2.4", + "@backstage/plugin-scaffolder-backend-module-yeoman": "0.4.5", + "@backstage/plugin-scaffolder-common": "1.5.8", + "@backstage/plugin-scaffolder-node": "0.6.2", + "@backstage/plugin-scaffolder-node-test-utils": "0.1.17", + "@backstage/plugin-scaffolder-react": "1.14.2", + "@backstage/plugin-search": "1.4.21", + "@backstage/plugin-search-backend": "1.8.0", + "@backstage/plugin-search-backend-module-catalog": "0.2.6", + "@backstage/plugin-search-backend-module-elasticsearch": "1.6.3", + "@backstage/plugin-search-backend-module-explore": "0.2.6", + "@backstage/plugin-search-backend-module-pg": "0.5.39", + "@backstage/plugin-search-backend-module-stack-overflow-collator": "0.3.4", + "@backstage/plugin-search-backend-module-techdocs": "0.3.4", + "@backstage/plugin-search-backend-node": "1.3.6", + "@backstage/plugin-search-common": "1.2.16", + "@backstage/plugin-search-react": "1.8.4", + "@backstage/plugin-signals": "0.0.14", + "@backstage/plugin-signals-backend": "0.2.4", + "@backstage/plugin-signals-node": "0.1.15", + "@backstage/plugin-signals-react": "0.0.8", + "@backstage/plugin-techdocs": "1.12.0", + "@backstage/plugin-techdocs-addons-test-utils": "1.0.43", + "@backstage/plugin-techdocs-backend": "1.11.4", "@backstage/plugin-techdocs-common": "0.1.0", - "@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" + "@backstage/plugin-techdocs-module-addons-contrib": "1.1.19", + "@backstage/plugin-techdocs-node": "1.12.15", + "@backstage/plugin-techdocs-react": "1.2.12", + "@backstage/plugin-user-settings": "0.8.17", + "@backstage/plugin-user-settings-backend": "0.2.28", + "@backstage/plugin-user-settings-common": "0.0.1" }, "changesets": [ - "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" + "big-seals-drum", + "breezy-coats-sort", + "calm-tigers-boil", + "create-app-1735034814", + "create-app-1736262177", + "cuddly-lions-knock", + "cyan-frogs-count", + "dry-hounds-study", + "famous-balloons-punch", + "famous-dryers-protect", + "gentle-deers-return", + "gorgeous-zebras-tan", + "khaki-fireants-begin", + "lemon-students-care", + "light-wasps-unite", + "little-scissors-fold", + "long-parrots-hide", + "metal-ravens-hammer", + "nasty-pears-taste", + "nervous-bottles-occur", + "nice-waves-count", + "orange-icons-sell", + "quick-poems-cover", + "red-hotels-sneeze", + "renovate-dcf1169", + "rich-penguins-stare", + "rich-vans-hope", + "shiny-walls-press", + "silly-bottles-raise", + "smart-plants-sip", + "spicy-tomatoes-hammer", + "strong-students-beg", + "tall-actors-clap", + "twenty-laws-tie", + "two-wasps-mix", + "weak-frogs-nail" ] } diff --git a/.changeset/quick-poems-cover.md b/.changeset/quick-poems-cover.md new file mode 100644 index 0000000000..099bb550fb --- /dev/null +++ b/.changeset/quick-poems-cover.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-search-backend-module-catalog': minor +--- + +**BREAKING**: Removed support for the old backend system. Please [migrate to the new backend system](https://backstage.io/docs/backend-system/) and enable [the catalog collator](https://backstage.io/docs/features/search/collators#catalog) there. + +As part of this, the `/alpha` export path is gone too. Just import the module from the root of the package as usual instead. diff --git a/.changeset/real-shirts-cry.md b/.changeset/real-shirts-cry.md deleted file mode 100644 index 78056368ae..0000000000 --- a/.changeset/real-shirts-cry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli-node': patch ---- - -Internal refactor diff --git a/.changeset/red-hotels-sneeze.md b/.changeset/red-hotels-sneeze.md new file mode 100644 index 0000000000..a1ce4d7bd6 --- /dev/null +++ b/.changeset/red-hotels-sneeze.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Fixing spelling mistake in translation diff --git a/.changeset/renovate-998a490.md b/.changeset/renovate-998a490.md deleted file mode 100644 index 8def7d49cd..0000000000 --- a/.changeset/renovate-998a490.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -Updated dependency `flatted` to `3.3.2`. diff --git a/.changeset/renovate-a5f3bd6.md b/.changeset/renovate-a5f3bd6.md deleted file mode 100644 index 9911fd311f..0000000000 --- a/.changeset/renovate-a5f3bd6.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@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-dcf1169.md b/.changeset/renovate-dcf1169.md new file mode 100644 index 0000000000..b23fd46c77 --- /dev/null +++ b/.changeset/renovate-dcf1169.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.2`. +Updated dependency `@rjsf/core` to `5.23.2`. +Updated dependency `@rjsf/material-ui` to `5.23.2`. +Updated dependency `@rjsf/validator-ajv8` to `5.23.2`. diff --git a/.changeset/rich-beers-eat.md b/.changeset/rich-beers-eat.md deleted file mode 100644 index 55115e929e..0000000000 --- a/.changeset/rich-beers-eat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch ---- - -Wire up the events together in the new backend system diff --git a/.changeset/rich-penguins-stare.md b/.changeset/rich-penguins-stare.md new file mode 100644 index 0000000000..0993b0fb55 --- /dev/null +++ b/.changeset/rich-penguins-stare.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': patch +--- + +Fixed scaffolder form fields not resolving correctly in the `useCustomFieldExtensions` hook. diff --git a/.changeset/rich-vans-hope.md b/.changeset/rich-vans-hope.md new file mode 100644 index 0000000000..3e219a13b6 --- /dev/null +++ b/.changeset/rich-vans-hope.md @@ -0,0 +1,12 @@ +--- +'@backstage/backend-dynamic-feature-service': patch +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/backend-defaults': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-app-backend': patch +'@backstage/plugin-auth-node': patch +--- + +Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types diff --git a/.changeset/rollup-fix-forward.md b/.changeset/rollup-fix-forward.md deleted file mode 100644 index 681812a134..0000000000 --- a/.changeset/rollup-fix-forward.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index f13d7d2de7..0000000000 --- a/.changeset/rollup-release-borked-packages.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@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/seven-bulldogs-count.md b/.changeset/seven-bulldogs-count.md deleted file mode 100644 index 9fa888767b..0000000000 --- a/.changeset/seven-bulldogs-count.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Add support for `--output-file` option from ESLint to `package lint` and `repo lint` commands. diff --git a/.changeset/shiny-walls-press.md b/.changeset/shiny-walls-press.md new file mode 100644 index 0000000000..29fe54afa2 --- /dev/null +++ b/.changeset/shiny-walls-press.md @@ -0,0 +1,7 @@ +--- +'@backstage/backend-defaults': minor +--- + +Ensure that an error handler middleware exists at the end of each plugin `httpRouter` handler chain. This makes it so that exceptions thrown by plugin routes are caught and encoded in the standard error format. + +If you were using the standard `MiddlewareFactory` just to put an `error` middleware in you router, you can now remove that at your earliest convenience since it's redundant. If you have custom error handlers in your plugin router, those will continue to function as previously. If you were relying on thrown errors propagating all the way down to the root HTTP router, you will find that they no longer do that, and may want to hoist your error handling up to the plugin level instead. diff --git a/.changeset/short-baboons-search.md b/.changeset/short-baboons-search.md deleted file mode 100644 index 9855ad6df7..0000000000 --- a/.changeset/short-baboons-search.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-defaults': minor ---- - -All middleware used by the default `coreServices.http` is now exported for use by custom implementations. diff --git a/.changeset/shy-teachers-count.md b/.changeset/shy-teachers-count.md deleted file mode 100644 index 7723fe377b..0000000000 --- a/.changeset/shy-teachers-count.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index 9010605ffb..0000000000 --- a/.changeset/silent-pigs-collect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-search-backend-node': patch ---- - -Removed unnecessary dependency on `@backstage/backend-defaults`. diff --git a/.changeset/silly-bottles-raise.md b/.changeset/silly-bottles-raise.md new file mode 100644 index 0000000000..880d976680 --- /dev/null +++ b/.changeset/silly-bottles-raise.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Improved concurrency of the `entities` endpoint when using the streamed query mode behind the `catalog.disableRelationsCompatibility` flag. diff --git a/.changeset/six-eels-add.md b/.changeset/six-eels-add.md deleted file mode 100644 index fa0481b757..0000000000 --- a/.changeset/six-eels-add.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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-shirts-rescue.md b/.changeset/sixty-shirts-rescue.md deleted file mode 100644 index b6c1443eea..0000000000 --- a/.changeset/sixty-shirts-rescue.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -'@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/slow-horses-destroy.md b/.changeset/slow-horses-destroy.md deleted file mode 100644 index fe23d6cf27..0000000000 --- a/.changeset/slow-horses-destroy.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@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-singers-jump.md b/.changeset/slow-singers-jump.md deleted file mode 100644 index 2eef032d7b..0000000000 --- a/.changeset/slow-singers-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': minor ---- - -Fetch all facets in a single database query diff --git a/.changeset/smart-plants-sip.md b/.changeset/smart-plants-sip.md new file mode 100644 index 0000000000..1a5d456a9b --- /dev/null +++ b/.changeset/smart-plants-sip.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs': patch +--- + +Fix typo in default path of api docs definition route diff --git a/.changeset/spicy-tomatoes-hammer.md b/.changeset/spicy-tomatoes-hammer.md new file mode 100644 index 0000000000..20564b9a05 --- /dev/null +++ b/.changeset/spicy-tomatoes-hammer.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +Removed the long-deprecated `DefaultCatalogCollatorFactory` and `DefaultCatalogCollatorFactoryOptions` exports, which now no longer exist in the search plugin's offerings. If you were using these, you want to migrate to [the new backend system](https://backstage.io/docs/backend-system/) and use the [catalog collator](https://backstage.io/docs/features/search/collators#catalog) directly. diff --git a/.changeset/spotty-shoes-exercise.md b/.changeset/spotty-shoes-exercise.md deleted file mode 100644 index 92e0825c9f..0000000000 --- a/.changeset/spotty-shoes-exercise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Support changing location keys on existing entities, in delta mutations diff --git a/.changeset/stale-rats-tease.md b/.changeset/stale-rats-tease.md deleted file mode 100644 index 3564742cc6..0000000000 --- a/.changeset/stale-rats-tease.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index b6cb897170..0000000000 --- a/.changeset/strange-brooms-check.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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/strong-papayas-remember.md b/.changeset/strong-papayas-remember.md deleted file mode 100644 index 7787258c58..0000000000 --- a/.changeset/strong-papayas-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-api-docs': patch ---- - -Fix link styling in ProvidedApisCard component so it aligns with other card components. diff --git a/.changeset/strong-students-beg.md b/.changeset/strong-students-beg.md new file mode 100644 index 0000000000..5b3653d389 --- /dev/null +++ b/.changeset/strong-students-beg.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-node': patch +--- + +Deprecate the `logStream` option in `executeShellCommand`, replacing it with a logger instance. diff --git a/.changeset/swift-kangaroos-drop.md b/.changeset/swift-kangaroos-drop.md deleted file mode 100644 index 77d837deba..0000000000 --- a/.changeset/swift-kangaroos-drop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/catalog-client': patch ---- - -Fixed a bug in the `queryEntities` method where errors were not being handled properly. diff --git a/.changeset/tall-actors-clap.md b/.changeset/tall-actors-clap.md new file mode 100644 index 0000000000..594918a362 --- /dev/null +++ b/.changeset/tall-actors-clap.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Fix issue with `secrets` not being forwarded properly to the backend when creating a task diff --git a/.changeset/tall-comics-heal.md b/.changeset/tall-comics-heal.md deleted file mode 100644 index 3d65caee67..0000000000 --- a/.changeset/tall-comics-heal.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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-keys-nail.md b/.changeset/ten-keys-nail.md deleted file mode 100644 index 0662e4a346..0000000000 --- a/.changeset/ten-keys-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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/thick-items-bathe.md b/.changeset/thick-items-bathe.md deleted file mode 100644 index 455718ed1c..0000000000 --- a/.changeset/thick-items-bathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Added data-testid to placeholder rendered by Progress component to simplify assertions in tests diff --git a/.changeset/tiny-mice-run.md b/.changeset/tiny-mice-run.md deleted file mode 100644 index 4829ef7390..0000000000 --- a/.changeset/tiny-mice-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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/twenty-laws-tie.md b/.changeset/twenty-laws-tie.md new file mode 100644 index 0000000000..02e6fca70c --- /dev/null +++ b/.changeset/twenty-laws-tie.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Updated condition in `resolveCodeOwner` to fix a bug where `normalizeCodeOwner` could potentially be called with an invalid argument causing an error in `CodeOwnersProcessor` diff --git a/.changeset/twenty-parents-judge.md b/.changeset/twenty-parents-judge.md deleted file mode 100644 index a639f83ba1..0000000000 --- a/.changeset/twenty-parents-judge.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-app-backend': patch ---- - -Fix root route handling when query parameters are present diff --git a/.changeset/two-wasps-mix.md b/.changeset/two-wasps-mix.md new file mode 100644 index 0000000000..47d8a8a89b --- /dev/null +++ b/.changeset/two-wasps-mix.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-module-addons-contrib': patch +--- + +Internal refactor for safer handling of possible null value. diff --git a/.changeset/violet-snakes-laugh.md b/.changeset/violet-snakes-laugh.md deleted file mode 100644 index 7002cfeaf0..0000000000 --- a/.changeset/violet-snakes-laugh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/release-manifests': patch ---- - -Allow overriding the fetch function used inside getManifestByVersion diff --git a/.changeset/warm-pumpkins-bathe.md b/.changeset/warm-pumpkins-bathe.md deleted file mode 100644 index 93fa603342..0000000000 --- a/.changeset/warm-pumpkins-bathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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/weak-avocados-suffer.md b/.changeset/weak-avocados-suffer.md deleted file mode 100644 index 01142aa927..0000000000 --- a/.changeset/weak-avocados-suffer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-ldap': minor ---- - -Add new ldap vendor config 'LLDAP' diff --git a/.changeset/weak-frogs-nail.md b/.changeset/weak-frogs-nail.md new file mode 100644 index 0000000000..cf6c5d3048 --- /dev/null +++ b/.changeset/weak-frogs-nail.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-github': patch +--- + +Fixes an issue in `GithubMultiOrgEntityProvider` that caused an error when processing teams without a parent. diff --git a/.changeset/weak-meals-doubt.md b/.changeset/weak-meals-doubt.md deleted file mode 100644 index 42199ed296..0000000000 --- a/.changeset/weak-meals-doubt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index 08bcc1c28f..0000000000 --- a/.changeset/wet-rats-exist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-app-api': patch ---- - -Decrease OAuth2 token refresh grace period diff --git a/.changeset/young-carrots-collect.md b/.changeset/young-carrots-collect.md deleted file mode 100644 index 1350400d39..0000000000 --- a/.changeset/young-carrots-collect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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 deleted file mode 100644 index a2062b3f88..0000000000 --- a/.changeset/young-months-admire.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@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/.github/CODEOWNERS b/.github/CODEOWNERS index c7326c5f4e..b31cca1080 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -12,10 +12,12 @@ yarn.lock @backstage/maintainers @backst /docs @backstage/maintainers @backstage/documentation-maintainers /docs/assets/search @backstage/search-maintainers /docs/features/search @backstage/search-maintainers +/docs/dls @backstage/design-system-maintainers /docs/features/techdocs @backstage/techdocs-maintainers /docs/plugins/integrating-search-into-plugins.md @backstage/search-maintainers /packages/cli/src/commands/onboard @backstage/sharks /packages/backend-openapi-utils @backstage/maintainers @backstage/reviewers @backstage/openapi-tooling-maintainers +/packages/canon @backstage/design-system-maintainers /packages/techdocs-cli @backstage/techdocs-maintainers /packages/techdocs-cli-embedded-app @backstage/techdocs-maintainers /plugins/api-docs @backstage/maintainers @backstage/reviewers @backstage/sda-se-reviewers diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt index 4f5d3e338d..091b999dd7 100644 --- a/.github/vale/config/vocabularies/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -72,6 +72,7 @@ config Config configmaps configs +conformant const cookiecutter corepack @@ -80,6 +81,8 @@ cron cronjobs crontab css +cve +CVEs daemonsets Datadog dataflow @@ -95,6 +98,7 @@ deliverables denormalized dependabot deps +deserialization destructured destructuring Deutsche @@ -339,6 +343,8 @@ rebase rebasing Recharts Redash +redis +reimplement renderer renderers replicasets @@ -378,6 +384,7 @@ sdks seb semlas semver +sendmail serializable Serverless shoutout @@ -402,6 +409,7 @@ src statefulsets stdout storable +storages stringified stringify subcommand diff --git a/.github/workflows/api-breaking-changes-comment.yml b/.github/workflows/api-breaking-changes-comment.yml index 15b13810f5..1210db0ccf 100644 --- a/.github/workflows/api-breaking-changes-comment.yml +++ b/.github/workflows/api-breaking-changes-comment.yml @@ -22,7 +22,7 @@ jobs: action: ${{ steps.event.outputs.ACTION }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/api-breaking-changes.yml b/.github/workflows/api-breaking-changes.yml index a6ba0e393b..dbb5096839 100644 --- a/.github/workflows/api-breaking-changes.yml +++ b/.github/workflows/api-breaking-changes.yml @@ -14,7 +14,7 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -33,7 +33,7 @@ jobs: registry-url: https://registry.npmjs.org/ - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: linux-v20 @@ -46,7 +46,7 @@ jobs: cat ${{ github.event_path }} > event.json - name: Upload Artifacts - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4 with: name: preview-spec path: | diff --git a/.github/workflows/automate_area-labels.yml b/.github/workflows/automate_area-labels.yml index 89e1adc3c3..4529b54c16 100644 --- a/.github/workflows/automate_area-labels.yml +++ b/.github/workflows/automate_area-labels.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/automate_changeset_feedback.yml b/.github/workflows/automate_changeset_feedback.yml index d7e2b56b39..8c46ed2984 100644 --- a/.github/workflows/automate_changeset_feedback.yml +++ b/.github/workflows/automate_changeset_feedback.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -34,7 +34,7 @@ jobs: ref: 'refs/pull/${{ github.event.pull_request.number }}/merge' - name: fetch base run: git fetch --depth 1 origin ${{ github.base_ref }} - - uses: backstage/actions/changeset-feedback@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + - uses: backstage/actions/changeset-feedback@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 name: Generate feedback with: diff-ref: 'origin/master' diff --git a/.github/workflows/automate_merge_message.yml b/.github/workflows/automate_merge_message.yml index ece1331730..7923496b3f 100644 --- a/.github/workflows/automate_merge_message.yml +++ b/.github/workflows/automate_merge_message.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/automate_stale.yml b/.github/workflows/automate_stale.yml index b7adc5235a..e61ca20620 100644 --- a/.github/workflows/automate_stale.yml +++ b/.github/workflows/automate_stale.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/ci-noop.yml b/.github/workflows/ci-noop.yml index af7199ede6..a769ce7d50 100644 --- a/.github/workflows/ci-noop.yml +++ b/.github/workflows/ci-noop.yml @@ -40,7 +40,7 @@ jobs: name: Test ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a959b7aa9a..e8bf57cc95 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: name: Install ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -41,7 +41,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -64,7 +64,7 @@ jobs: name: Verify ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -77,7 +77,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -225,7 +225,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -235,7 +235,7 @@ jobs: # Use the lower-level cache actions for the success cache, so that we can store the cache even on failed builds - name: restore backstage-cli cache - uses: actions/cache/restore@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4 + uses: actions/cache/restore@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4 with: path: .cache/backstage-cli key: ${{ runner.os }}-v${{ matrix.node-version }}-backstage-cli-${{ github.run_id }} @@ -256,7 +256,7 @@ jobs: # Always save success cache even if there were failures, that way it can be used in re-triggered builds - name: save backstage-cli cache - uses: actions/cache/save@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4 + uses: actions/cache/save@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4 if: always() with: path: .cache/backstage-cli diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml index 48ac1db289..3e944a3795 100644 --- a/.github/workflows/cron.yml +++ b/.github/workflows/cron.yml @@ -10,11 +10,11 @@ jobs: timeout-minutes: 10 steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit - - uses: backstage/actions/cron@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + - uses: backstage/actions/cron@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index f0d8d0048d..2285f61f48 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -37,7 +37,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -59,10 +59,10 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Set up Docker Buildx - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 + uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 - name: Build and push - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 + uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355 # v6.10.0 with: context: './example-app' file: ./example-app/packages/backend/Dockerfile diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index 9fe2728256..dc85f23e50 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -65,7 +65,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v20.x @@ -73,7 +73,7 @@ jobs: run: yarn build:api-docs - name: upload API reference - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4 with: name: stable-reference path: docs/reference/ @@ -91,7 +91,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -105,7 +105,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v20.x @@ -113,7 +113,7 @@ jobs: run: yarn build:api-docs - name: upload API reference - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4 with: name: next-reference path: docs/reference/ @@ -130,7 +130,7 @@ jobs: working-directory: storybook - name: storybook upload - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4 with: name: storybook path: storybook/dist/ @@ -158,7 +158,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index b95a6f9341..d1d7d3fd7c 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -76,7 +76,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -94,7 +94,7 @@ jobs: run: yarn backstage-cli config:check --lax - name: backstage-cli cache - uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4 with: path: .cache/backstage-cli key: ${{ runner.os }}-v${{ matrix.node-version }}-backstage-cli-${{ github.run_id }} @@ -147,7 +147,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml index 2cd355b75e..c10f248f6d 100644 --- a/.github/workflows/issue.yaml +++ b/.github/workflows/issue.yaml @@ -16,7 +16,7 @@ jobs: if: github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/pr-review-comment-trigger.yaml b/.github/workflows/pr-review-comment-trigger.yaml index 9ebfbee3b0..344425ca52 100644 --- a/.github/workflows/pr-review-comment-trigger.yaml +++ b/.github/workflows/pr-review-comment-trigger.yaml @@ -20,7 +20,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -30,7 +30,7 @@ jobs: run: | mkdir -p ./pr echo $PR_NUMBER > ./pr/pr_number - - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 with: name: pr_number-${{ github.event.pull_request.number }} path: pr/ diff --git a/.github/workflows/pr-review-comment.yaml b/.github/workflows/pr-review-comment.yaml index 517a978a83..447b6e1e13 100644 --- a/.github/workflows/pr-review-comment.yaml +++ b/.github/workflows/pr-review-comment.yaml @@ -17,7 +17,7 @@ jobs: steps: # Inspired by https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#using-data-from-the-triggering-workflow - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -40,7 +40,7 @@ jobs: const prNumber = artifact.name.slice('pr_number-'.length) core.setOutput('pr-number', prNumber); - - uses: backstage/actions/re-review@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + - uses: backstage/actions/re-review@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 7639ac14db..186c011797 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -18,12 +18,12 @@ jobs: if: github.repository == 'backstage/backstage' && ( github.event.pull_request || github.event.issue.pull_request ) steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit - name: PR sync - uses: backstage/actions/pr-sync@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/pr-sync@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index a379772722..fc5323af63 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -58,7 +58,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: 'Upload artifact' - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 with: name: SARIF file path: results.sarif @@ -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@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/upload-sarif@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: sarif_file: results.sarif diff --git a/.github/workflows/sync_canon.yml b/.github/workflows/sync_canon.yml index 9cedb9fc24..29a0ae2ce4 100644 --- a/.github/workflows/sync_canon.yml +++ b/.github/workflows/sync_canon.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -22,7 +22,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v20.x diff --git a/.github/workflows/sync_code-formatting.yml b/.github/workflows/sync_code-formatting.yml index 4de42669e4..7516b3cfe0 100644 --- a/.github/workflows/sync_code-formatting.yml +++ b/.github/workflows/sync_code-formatting.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -25,7 +25,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/sync_dependabot-changesets.yml b/.github/workflows/sync_dependabot-changesets.yml index 31db319229..2c2d5a51d0 100644 --- a/.github/workflows/sync_dependabot-changesets.yml +++ b/.github/workflows/sync_dependabot-changesets.yml @@ -11,7 +11,7 @@ jobs: if: github.actor == 'dependabot[bot]' && github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index f2f9e1d819..436db10e9c 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -25,7 +25,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v20.x diff --git a/.github/workflows/sync_renovate-changesets.yml b/.github/workflows/sync_renovate-changesets.yml index 9331dbdb05..e4d60777cd 100644 --- a/.github/workflows/sync_renovate-changesets.yml +++ b/.github/workflows/sync_renovate-changesets.yml @@ -11,7 +11,7 @@ jobs: if: github.actor == 'renovate[bot]' && github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index 20d4f0f144..bbdde7e9d6 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -24,7 +24,7 @@ jobs: 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 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v20.x diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml index 0c0148e047..ef7ad65b37 100644 --- a/.github/workflows/sync_snyk-monitor.yml +++ b/.github/workflows/sync_snyk-monitor.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -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@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/upload-sarif@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: sarif_file: snyk.sarif diff --git a/.github/workflows/sync_version-packages.yml b/.github/workflows/sync_version-packages.yml index 970a5e0e3f..479f65a53a 100644 --- a/.github/workflows/sync_version-packages.yml +++ b/.github/workflows/sync_version-packages.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_accessibility-noop.yml b/.github/workflows/verify_accessibility-noop.yml index 37ce3513e9..9af85ec2d1 100644 --- a/.github/workflows/verify_accessibility-noop.yml +++ b/.github/workflows/verify_accessibility-noop.yml @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_accessibility.yml b/.github/workflows/verify_accessibility.yml index 41d549cc7a..9803616b53 100644 --- a/.github/workflows/verify_accessibility.yml +++ b/.github/workflows/verify_accessibility.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -30,7 +30,7 @@ jobs: with: node-version: 20.x - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v20.x - name: run Lighthouse CI diff --git a/.github/workflows/verify_codeql.yml b/.github/workflows/verify_codeql.yml index be301559ec..6720e4d852 100644 --- a/.github/workflows/verify_codeql.yml +++ b/.github/workflows/verify_codeql.yml @@ -42,7 +42,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -55,7 +55,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/init@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 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@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/autobuild@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 # ℹ️ 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@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/analyze@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index 766d289f4c..9a93be4090 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-linux-noop.yml b/.github/workflows/verify_e2e-linux-noop.yml index 1afcd3fe17..4e3eeb2a8c 100644 --- a/.github/workflows/verify_e2e-linux-noop.yml +++ b/.github/workflows/verify_e2e-linux-noop.yml @@ -29,7 +29,7 @@ jobs: name: E2E Linux ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index 055350a7cf..30887980a4 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -43,7 +43,7 @@ jobs: name: E2E Linux ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -60,7 +60,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml index 03c07e716a..454c4c011e 100644 --- a/.github/workflows/verify_e2e-techdocs.yml +++ b/.github/workflows/verify_e2e-techdocs.yml @@ -32,7 +32,7 @@ jobs: name: Techdocs steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-windows-noop.yml b/.github/workflows/verify_e2e-windows-noop.yml index 3e415b82c6..78d4c1e37f 100644 --- a/.github/workflows/verify_e2e-windows-noop.yml +++ b/.github/workflows/verify_e2e-windows-noop.yml @@ -25,7 +25,7 @@ jobs: name: E2E Windows ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml index bb1612a0f5..3ce85f371b 100644 --- a/.github/workflows/verify_e2e-windows.yml +++ b/.github/workflows/verify_e2e-windows.yml @@ -33,7 +33,7 @@ jobs: name: E2E Windows ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -80,7 +80,7 @@ jobs: uses: browser-actions/setup-chrome@803ef6dfb4fdf22089c9563225d95e4a515820a0 # latest - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_fossa.yml b/.github/workflows/verify_fossa.yml index e99ad22a9b..126d70b9c8 100644 --- a/.github/workflows/verify_fossa.yml +++ b/.github/workflows/verify_fossa.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite-noop.yml b/.github/workflows/verify_microsite-noop.yml index f4c5ea4104..85cb1e3fee 100644 --- a/.github/workflows/verify_microsite-noop.yml +++ b/.github/workflows/verify_microsite-noop.yml @@ -21,7 +21,7 @@ jobs: name: Microsite steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index 26c2414589..2507428ec8 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -24,7 +24,7 @@ jobs: name: Microsite steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite_accessibility-noop.yml b/.github/workflows/verify_microsite_accessibility-noop.yml index 49721e7f51..7d4028e2dd 100644 --- a/.github/workflows/verify_microsite_accessibility-noop.yml +++ b/.github/workflows/verify_microsite_accessibility-noop.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite_accessibility.yml b/.github/workflows/verify_microsite_accessibility.yml index bdf9e56556..e22241b3e3 100644 --- a/.github/workflows/verify_microsite_accessibility.yml +++ b/.github/workflows/verify_microsite_accessibility.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_storybook-noop.yml b/.github/workflows/verify_storybook-noop.yml index 115c79c9c3..5b41d76e4c 100644 --- a/.github/workflows/verify_storybook-noop.yml +++ b/.github/workflows/verify_storybook-noop.yml @@ -28,7 +28,7 @@ jobs: name: Storybook steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml index 082142be82..b919db658d 100644 --- a/.github/workflows/verify_storybook.yml +++ b/.github/workflows/verify_storybook.yml @@ -28,7 +28,7 @@ jobs: name: Storybook steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit @@ -42,20 +42,23 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 + uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} - name: storybook yarn install run: yarn install --immutable working-directory: storybook + # Only for verification, the canon one is what we upload to Chromatic - run: yarn build-storybook - - uses: chromaui/action@0efa3230f403b7848d5d65c6ce140b617fb68380 # v11 + - run: yarn --cwd packages/canon build-storybook + + - uses: chromaui/action@64a9c0ca3bfb724389b0d536e544f56b7b5ff5b3 # v11 with: token: ${{ secrets.GITHUB_TOKEN }} # projectToken intentionally shared to allow collaborators to run Chromatic on forks # https://www.chromatic.com/docs/custom-ci-provider#run-chromatic-on-external-forks-of-open-source-projects - projectToken: 9tzak77m9nj - workingDir: storybook - storybookBuildDir: dist + projectToken: chpt_dab72dc0f97d55b + workingDir: packages/canon + storybookBuildDir: storybook-static diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml index 189bcb09cd..e3f6959929 100644 --- a/.github/workflows/verify_windows.yml +++ b/.github/workflows/verify_windows.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/ADOPTERS.md b/ADOPTERS.md index 1653f8ea88..1eacd4c104 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -279,3 +279,7 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [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. +| [Axelerant](https://www.axelerant.com/) | [Zeshan Ziya](https://github.com/zeshanziya) | Developer portal, main gateway to infrastructure, documentation, internal tooling, and service catalog with a focus on project visibility. +| [KnowBe4](https://www.knowbe4.com) | [Brandon Vicinus](https://www.linkedin.com/in/bvicinus/) | Internal Developer Portal managed by the Developer Experience Team. IDP hosts many different internal tools as plugins created by multiple teams, many of which are directly integrated with the Service Catalog. | +| [Scalepoint](https://scalepoint.com) | [Yuriy Ostapenko](https://github.com/yuriyostapenko), [Dmytro Pasko](https://github.com/dimapasko), [Yuri Sedykh ](https://github.com/yuiri-sedykh), [Bartosz Wisniewski](https://github.com/Epgor) | Internal Developer Portal: Software Catalog with infrastructure resources and dependencies, Software Templates, TechDocs, Tech Radar, Kubernetes and Observability, as well as custom CI/CD components | + diff --git a/OWNERS.md b/OWNERS.md index 6f6fea1d67..0932d3386b 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -10,7 +10,6 @@ Team: @backstage/maintainers | Patrik Oldsberg | Spotify | [Rugvip](https://github.com/Rugvip) | `Rugvip#0019` | | Fredrik Adelöw | Spotify | [freben](https://github.com/freben) | `freben#3926` | | Ben Lambert | Spotify | [benjdlambert](https://github.com/benjdlambert) | `blam#2159` | -| Johan Haals | Spotify | [jhaals](https://github.com/jhaals) | `Johan#0679` | ## Project Areas @@ -27,11 +26,21 @@ Scope: The catalog plugin and catalog model | Ben Lambert | Spotify | Cubic Belugas | [benjdlambert](https://github.com/benjdlambert) | `blam#2159` | | Camila Loiola | Spotify | Cubic Belugas | [camilaibs](http://github.com/camilaibs) | `camilal#0226` | | Fredrik Adelöw | Spotify | Cubic Belugas | [freben](https://github.com/freben) | `freben#3926` | -| Johan Haals | Spotify | Cubic Belugas | [jhaals](https://github.com/jhaals) | `Johan#0679` | | Mihai Tabara | Spotify | Cubic Belugas | [MihaiTabara](http://github.com/MihaiTabara) | `mihait#3107` | | Patrik Oldsberg | Spotify | Cubic Belugas | [Rugvip](https://github.com/Rugvip) | `Rugvip#0019` | | Vincenzo Scamporlino | Spotify | Cubic Belugas | [vinzscam](http://github.com/vinzscam) | `vinzscam#6944` | +### Design System + +Team: @backstage/design-system-maintainers + +Scope: The Backstage design system, component library, as well as surrounding tooling such as Storybook. + +| Name | Organization | Team | GitHub | Discord | +| ------------------- | ------------ | ------------- | --------------------------------------------- | ------------- | +| Charles de Dreuille | Spotify | | [cdedreuille](https://github.com/cdedreuille) | `cdedreuille` | +| Patrik Oldsberg | Spotify | Cubic Belugas | [Rugvip](https://github.com/Rugvip) | `Rugvip` | + ### Home Team: @backstage/home-maintainers @@ -91,7 +100,6 @@ Scope: The Permission Framework and plugins integrating with the permission fram | Ben Lambert | Spotify | Cubic Belugas | [benjdlambert](https://github.com/benjdlambert) | `blam#2159` | | Camila Loiola | Spotify | Cubic Belugas | [camilaibs](http://github.com/camilaibs) | `camilal#0226` | | Fredrik Adelöw | Spotify | Cubic Belugas | [freben](https://github.com/freben) | `freben#3926` | -| Johan Haals | Spotify | Cubic Belugas | [jhaals](https://github.com/jhaals) | `Johan#0679` | | Mihai Tabara | Spotify | Cubic Belugas | [MihaiTabara](http://github.com/MihaiTabara) | `mihait#3107` | | Patrik Oldsberg | Spotify | Cubic Belugas | [Rugvip](https://github.com/Rugvip) | `Rugvip#0019` | | Vincenzo Scamporlino | Spotify | Cubic Belugas | [vinzscam](http://github.com/vinzscam) | `vinzscam#6944` | @@ -218,6 +226,7 @@ Scope: The Backstage Documentation | Maintainer | Organization | GitHub | Discord | | ------------ | ------------ | --------------------------------------------- | -------------- | | Stefan Ålund | Spotify | [stefanalund](https://github.com/stefanalund) | `stalund#9602` | +| Johan Haals | Spotify | [jhaals](https://github.com/jhaals) | `Johan#0679` | ## Emeritus End User Sponsors diff --git a/docs/auth/atlassian/provider.md b/docs/auth/atlassian/provider.md index f4793d4f51..a1009b586e 100644 --- a/docs/auth/atlassian/provider.md +++ b/docs/auth/atlassian/provider.md @@ -22,13 +22,13 @@ To add Atlassian authentication, you must create an OAuth 2.0 (3LO) app. Go to `https://developer.atlassian.com/console/myapps/`. -Click on the drop down `Create`, and choose `OAuth 2.0 integration`. +Click on the drop-down `Create` and choose `OAuth 2.0 integration`. Name your integration and click on the `Create` button. Settings for local development: -- Callback URL: `http://localhost:7007/api/auth/atlassian` +- Callback URL: `http://localhost:7007/api/auth/atlassian/handler/frame` - Use rotating refresh tokens - For permissions, you **must** enable `View user profile` for the currently logged-in user, under `User identity API` @@ -46,40 +46,46 @@ auth: development: clientId: ${AUTH_ATLASSIAN_CLIENT_ID} clientSecret: ${AUTH_ATLASSIAN_CLIENT_SECRET} - scope: ${AUTH_ATLASSIAN_SCOPES} + audience: 'https://api.atlassian.com' + callbackUrl: 'https://backstage.example.com/api/auth/atlassian/handler/frame' + additionalScopes: + - 'read:jira-user' + - 'read:jira-work' signIn: resolvers: # See https://backstage.io/docs/auth/atlassian/provider#resolvers for more resolvers - resolver: usernameMatchingUserEntityName ``` -The Atlassian provider is a structure with three configuration keys: +The Atlassian provider is a structure with the following configuration keys: - `clientId`: The Key you generated in the developer console. - `clientSecret`: The Secret tied to the generated Key. -- `scope`: List of scopes the app has permissions for, separated by spaces. +- `audience`: (Optional) Specifies the intended recipient of the tokens. +- `callbackUrl`: (Optional) Must match the redirect URL set in Atlassian OAuth settings. +- `additionalScopes` : (Optional) Additional permissions requested from Atlassian. -**NOTE:** the scopes `offline_access`, `read:jira-work`, and `read:jira-user` are provided by default. +**NOTE:** The scopes `offline_access`, `read:jira-work`, and `read:jira-user` are provided by default. ### Resolvers This provider includes several resolvers out of the box that you can use: -- `emailMatchingUserEntityProfileEmail`: Matches the email address from the auth provider with the User entity that has a matching `spec.profile.email`. If no match is found it will throw a `NotFoundError`. -- `emailLocalPartMatchingUserEntityName`: Matches the [local part](https://en.wikipedia.org/wiki/Email_address#Local-part) of the email address from the auth provider with the User entity that has a matching `name`. If no match is found it will throw a `NotFoundError`. -- `usernameMatchingUserEntityName`: Matches the username from the auth provider with the User entity that has a matching `name`. If no match is found it will throw a `NotFoundError`. +- `emailMatchingUserEntityProfileEmail`: Matches the email address from the auth provider with the User entity that has a matching `spec.profile.email`. If no match is found, it will throw a `NotFoundError`. +- `emailLocalPartMatchingUserEntityName`: Matches the [local part](https://en.wikipedia.org/wiki/Email_address#Local-part) of the email address from the auth provider with the User entity that has a matching `name`. If no match is found, it will throw a `NotFoundError`. +- `usernameMatchingUserEntityName`: Matches the username from the auth provider with the User entity that has a matching `name`. If no match is found, it will throw a `NotFoundError`. :::note Note -The resolvers will be tried in order, but will only be skipped if they throw a `NotFoundError`. +The resolvers will be tried in order but will only be skipped if they throw a `NotFoundError`. ::: -If these resolvers do not fit your needs you can build a custom resolver, this is covered in the [Building Custom Resolvers](../identity-resolver.md#building-custom-resolvers) section of the Sign-in Identities and Resolvers documentation. +If these resolvers do not fit your needs, you can build a custom resolver, this is covered in the [Building Custom Resolvers](../identity-resolver.md#building-custom-resolvers) section of the Sign-in Identities and Resolvers documentation. ## Backend Installation -To add the provider to the backend we will first need to install the package by running this command: +To add the provider to the backend, we will first need to install the package by running this command: ```bash title="from your Backstage root directory" yarn --cwd packages/backend add @backstage/plugin-auth-backend-module-atlassian-provider diff --git a/docs/auth/auth0/provider.md b/docs/auth/auth0/provider.md index bc2a02fe1f..2873a2cace 100644 --- a/docs/auth/auth0/provider.md +++ b/docs/auth/auth0/provider.md @@ -22,10 +22,10 @@ provider that can authenticate users using OAuth. 3. Create an Application - Name: Backstage (or your custom app name) - Application type: Single Page Web Application -4. Click on the Settings tab +4. Click on the Settings tab. 5. Add under `Application URIs` > `Allowed Callback URLs`: `http://localhost:7007/api/auth/auth0/handler/frame` -6. Click `Save Changes` +6. Click `Save Changes`. ## Configuration @@ -50,10 +50,10 @@ auth: The Auth0 provider is a structure with these configuration keys: -- `clientId`: The Application client ID, found on the Auth0 Application page +- `clientId`: The Application client ID, found on the Auth0 Application page. - `clientSecret`: The Application client secret, found on the Auth0 Application - page -- `domain`: The Application domain, found on the Auth0 Application page + page. +- `domain`: The Application domain, found on the Auth0 Application page. It additionally relies on the following configuration to function: @@ -63,16 +63,16 @@ Auth0 requires a session, so you need to give the session a secret key. ### Optional -- `audience`: The intended recipients of the token +- `audience`: The intended recipients of the token. - `connection`: Social identity provider name. To check the available social connections, please visit [Auth0 Social Connections](https://marketplace.auth0.com/features/social-connections). -- `connectionScope`: Additional scopes in the interactive token request. It should always be used in combination with the `connection` parameter +- `connectionScope`: Additional scopes in the interactive token request. It should always be used in combination with the `connection` parameter. ### Resolvers This provider includes several resolvers out of the box that you can use: -- `emailMatchingUserEntityProfileEmail`: Matches the email address from the auth provider with the User entity that has a matching `spec.profile.email`. If no match is found it will throw a `NotFoundError`. -- `emailLocalPartMatchingUserEntityName`: Matches the [local part](https://en.wikipedia.org/wiki/Email_address#Local-part) of the email address from the auth provider with the User entity that has a matching `name`. If no match is found it will throw a `NotFoundError`. +- `emailMatchingUserEntityProfileEmail`: Matches the email address from the auth provider with the User entity that has a matching `spec.profile.email`. If no match is found, it will throw a `NotFoundError`. +- `emailLocalPartMatchingUserEntityName`: Matches the [local part](https://en.wikipedia.org/wiki/Email_address#Local-part) of the email address from the auth provider with the User entity that has a matching `name`. If no match is found, it will throw a `NotFoundError`. :::note Note @@ -80,11 +80,11 @@ The resolvers will be tried in order, but will only be skipped if they throw a ` ::: -If these resolvers do not fit your needs you can build a custom resolver, this is covered in the [Building Custom Resolvers](../identity-resolver.md#building-custom-resolvers) section of the Sign-in Identities and Resolvers documentation. +If these resolvers do not fit your needs, you can build a custom resolver, this is covered in the [Building Custom Resolvers](../identity-resolver.md#building-custom-resolvers) section of the Sign-in Identities and Resolvers documentation. ## Backend Installation -To add the provider to the backend we will first need to install the package by running this command: +To add the provider to the backend, we will first need to install the package by running this command: ```bash title="from your Backstage root directory" yarn --cwd packages/backend add @backstage/plugin-auth-backend-module-auth0-provider diff --git a/docs/auth/aws-alb/provider.md b/docs/auth/aws-alb/provider.md index 8ce1eba5ab..5380877f86 100644 --- a/docs/auth/aws-alb/provider.md +++ b/docs/auth/aws-alb/provider.md @@ -5,7 +5,7 @@ sidebar_label: AWS ALB description: Adding AWS ALB as an authentication provider in Backstage --- -Backstage can de deployed behind [AWS Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) +Backstage can be deployed behind [AWS Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) and get the user seamlessly authenticated. ## Configuration @@ -35,20 +35,20 @@ Ensure that you have set the signer correctly. It is also recommended that you r This provider includes several resolvers out of the box that you can use: -- `emailMatchingUserEntityProfileEmail`: Matches the email address from the auth provider with the User entity that has a matching `spec.profile.email`. If no match is found it will throw a `NotFoundError`. -- `emailLocalPartMatchingUserEntityName`: Matches the [local part](https://en.wikipedia.org/wiki/Email_address#Local-part) of the email address from the auth provider with the User entity that has a matching `name`. If no match is found it will throw a `NotFoundError`. +- `emailMatchingUserEntityProfileEmail`: Matches the email address from the auth provider with the User entity that has a matching `spec.profile.email`. If no match is found, it will throw a `NotFoundError`. +- `emailLocalPartMatchingUserEntityName`: Matches the [local part](https://en.wikipedia.org/wiki/Email_address#Local-part) of the email address from the auth provider with the User entity that has a matching `name`. If no match is found, it will throw a `NotFoundError`. :::note Note -The resolvers will be tried in order, but will only be skipped if they throw a `NotFoundError`. +The resolvers will be tried in order but will only be skipped if they throw a `NotFoundError`. ::: -If these resolvers do not fit your needs you can build a custom resolver, this is covered in the [Building Custom Resolvers](../identity-resolver.md#building-custom-resolvers) section of the Sign-in Identities and Resolvers documentation. +If these resolvers do not fit your needs, you can build a custom resolver, this is covered in the [Building Custom Resolvers](../identity-resolver.md#building-custom-resolvers) section of the Sign-in Identities and Resolvers documentation. ## Backend Installation -To add the provider to the backend we will first need to install the package by running this command: +To add the provider to the backend, we will first need to install the package by running this command: ```bash title="from your Backstage root directory" yarn --cwd packages/backend add @backstage/plugin-auth-backend-module-aws-alb-provider @@ -65,6 +65,6 @@ backend.add(import('@backstage/plugin-auth-backend-module-aws-alb-provider')); ## Adding the provider to the Backstage frontend -See [Sign-In with Proxy Providers](../index.md#sign-in-with-proxy-providers) for pointers on how to set up the sign-in page, and to also make it work smoothly for local development. You'll use `awsalb` as the provider name. +See [Sign-In with Proxy Providers](../index.md#sign-in-with-proxy-providers) for pointers on how to set up the sign-in page and also make it work smoothly for local development. You'll use `awsalb` as the provider name. If you [provide a custom sign in resolver](https://backstage.io/docs/auth/identity-resolver#building-custom-resolvers), you can skip the `signIn` block entirely. diff --git a/docs/backend-system/architecture/07-feature-loaders.md b/docs/backend-system/architecture/07-feature-loaders.md index 43954ec443..b2cc574bf9 100644 --- a/docs/backend-system/architecture/07-feature-loaders.md +++ b/docs/backend-system/architecture/07-feature-loaders.md @@ -73,6 +73,29 @@ export default createBackendFeatureLoader({ }); ``` +### Overriding service factories + +Service factories registered by feature loaders have lower priority than ones added directly via `backend.add`. This allows you to use a feature loader for a larger number of service implementations, but still override individual services. + +The ordering in which different feature loaders or service factories are added does not matter. There is also no priority between feature loaders, if two different feature loaders add a factory for the same service, the backend will fail to start. + +```ts +const backend = createBackend(); + +backend.add( + createBackendFeatureLoader({ + async *loader() { + yield import('./commonDiscoveryService'); // discovery service + yield import('./commonRootLoggerService'); // root logger service + }, + }), +); + +backend.add(import('./myDiscoveryService')); // discovery service +``` + +The result of the above example is that the backend starts up with `./myDiscoveryService` as the discovery service implementation, while `./commonDiscoveryService` is ignored. The `./commonRootLoggerService` will still be used. + ### Dynamic logic A feature loader can also be asynchronous, and for example fetch data from an external source to determine which features to load: diff --git a/docs/backend-system/core-services/http-router.md b/docs/backend-system/core-services/http-router.md index c354f4fceb..d7658d9a67 100644 --- a/docs/backend-system/core-services/http-router.md +++ b/docs/backend-system/core-services/http-router.md @@ -113,7 +113,7 @@ backend.add( }); router.use(createAuthIntegrationRouter({ auth })); - router.use(createLifecycleMiddleware({ lifecycle })); + router.use(createLifecycleMiddleware({ config, lifecycle })); router.use(credentialsBarrier.middleware); router.use(createCookieAuthRefreshMiddleware({ auth, httpAuth })); 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/root-http-router.md b/docs/backend-system/core-services/root-http-router.md index a2316b957b..9ee8599eb5 100644 --- a/docs/backend-system/core-services/root-http-router.md +++ b/docs/backend-system/core-services/root-http-router.md @@ -42,6 +42,29 @@ createBackendPlugin({ ## Configuring the service +### Via `app-config.yaml` + +The `app-config.yaml` file provides configurable options that can be adjusted to meet your `RootHttpRouterService` specific requirements: + +```yaml +backend: + lifecycle: + # (Optional) The maximum time that paused requests will wait for the service to start, before returning an error (defaults to 5 seconds). + # Supported formats: + # - A string in the format of '1d', '2 seconds' etc. as supported by the `ms` library. + # - A standard ISO formatted duration string, e.g. 'P2DT6H' or 'PT1M'. + # - An object with individual units (in plural) as keys, e.g. `{ days: 2, hours: 6 }`. + startupRequestPauseTimeout: { seconds: 10 } + # (Optional) The minimum time that the HTTP server will delay the shutdown of the backend. During this delay health checks will be set to failing, allowing traffic to drain (defaults to 0 seconds). + # Supported formats: + # - A string in the format of '1d', '2 seconds' etc. as supported by the `ms` library. + # - A standard ISO formatted duration string, e.g. 'P2DT6H' or 'PT1M'. + # - An object with individual units (in plural) as keys, e.g. `{ days: 2, hours: 6 }`. + serverShutdownTimeout: { seconds: 20 } +``` + +### Via Code + There's additional options that you can pass to configure the root HTTP Router service. These options are passed when you call `createBackend`. - `indexPath` - optional path to forward all unmatched requests to. Defaults to `/api/app` which is the `app-backend` plugin responsible for serving the frontend application through the backend. diff --git a/docs/conf/writing.md b/docs/conf/writing.md index 6e827c075e..85a719e1d0 100644 --- a/docs/conf/writing.md +++ b/docs/conf/writing.md @@ -239,4 +239,7 @@ privateKey: | -----END RSA PRIVATE KEY----- ``` -**Warning: Sensitive information, such as private keys, should not be hard coded**. We recommend that this entire file should be a secret and stored as such in a secure storage solution like Vault, to ensure they are neither exposed nor misused. This example key part only shows the format on how to use the yaml | syntax to make sure that the key is valid. +> [!WARNING] +> Sensitive information, such as private keys, should not be hard coded. + +We recommend that this entire file should be a secret and stored as such in a secure storage solution like Vault, to ensure they are neither exposed nor misused. This example key part only shows the format on how to use the yaml | syntax to make sure that the key is valid. diff --git a/docs/deployment/k8s.md b/docs/deployment/k8s.md index 46ba273e14..1a225d6d12 100644 --- a/docs/deployment/k8s.md +++ b/docs/deployment/k8s.md @@ -210,6 +210,11 @@ spec: envFrom: - secretRef: name: postgres-secrets + env: + - name: POSTGRES_HOST + value: postgres.backstage + - name: POSTGRES_PORT + value: '5432' volumeMounts: - mountPath: /var/lib/postgresql/data name: postgresdb @@ -387,8 +392,8 @@ $ yarn build-image --tag backstage:1.0.0 ``` There is no special wiring needed to access the PostgreSQL service. Since it's -running on the same cluster, Kubernetes will inject `POSTGRES_SERVICE_HOST` and -`POSTGRES_SERVICE_PORT` environment variables into our Backstage container. +running on the same cluster, Kubernetes will inject `POSTGRES_HOST` and +`POSTGRES_PORT` environment variables into our Backstage container. These can be used in the Backstage `app-config.yaml` along with the secrets. Apply this to `app-config.production.yaml` as well if you have one: ```yaml @@ -396,8 +401,8 @@ backend: database: client: pg connection: - host: ${POSTGRES_SERVICE_HOST} - port: ${POSTGRES_SERVICE_PORT} + host: ${POSTGRES_HOST} + port: ${POSTGRES_PORT} user: ${POSTGRES_USER} password: ${POSTGRES_PASSWORD} ``` diff --git a/docs/features/search/getting-started.md b/docs/features/search/getting-started.md index a4b5348dbb..e543df5ab8 100644 --- a/docs/features/search/getting-started.md +++ b/docs/features/search/getting-started.md @@ -301,12 +301,16 @@ indexBuilder.addCollator({ }); ``` -Note: if you are using the in-memory Lunr search engine, you probably want to +:::note Note + +if you are using the in-memory Lunr search engine, you probably want to implement a non-distributed `SchedulerServiceTaskRunner` like the following to ensure consistency if you're running multiple search backend nodes (alternatively, you can configure the search plugin to use a non-distributed database such as [SQLite](../../tutorials/configuring-plugin-databases.md#postgresql-and-sqlite-3)): +::: + ```typescript import { SchedulerServiceTaskRunner, diff --git a/docs/features/software-catalog/catalog-customization.md b/docs/features/software-catalog/catalog-customization.md index 0c8eb7bcda..c56f763a4e 100644 --- a/docs/features/software-catalog/catalog-customization.md +++ b/docs/features/software-catalog/catalog-customization.md @@ -63,7 +63,87 @@ There are many options that can be set using `tableOptions`, the full list of se ## Customize Columns -By default the columns you see in the `CatalogIndexPage` were selected to be a good starting point for most but there may be reasons that you would like to customize these with more or less columns. One primary use case for this customization is if you added a custom Kind. Support for this was added in v1.23.0 of Backstage, make sure you are on that version or newer to use this feature. Here's an example of how to make this customization: +The columns you see in the `CatalogIndexPage` were selected to be a good starting point for most, but there may be cases where you would like to add or remove columns from existing or custom Kinds. + +### Adding a column to an existing Kind + +Suppose we want to add a new User Email column to the `User` kind in the Catalog. We can do this by overriding the `columns` that we pass into the `CatalogIndexPage` component in our `App.tsx`. First, we need to match the entity kind that we want to override, and then define the columns to show: + +```tsx title="packages/app/src/App.tsx" +{ + /* highlight-add-start */ +} +const myColumnsFunc: CatalogTableColumnsFunc = entityListContext => { + if (entityListContext.filters.kind?.value === 'user') { + return [ + // Render existing columns + ...CatalogTable.defaultColumnsFunc(entityListContext), + // Add new columns here + ]; + } + + return CatalogTable.defaultColumnsFunc(entityListContext); +}; +{ + /* highlight-add-end */ +} +``` + +Then, we can implement the `createUserEmailColumn` function and add it to the list of columns. `field` is used to access the data from the entity, while `render` lets us customize how we display the data: + +```tsx title="packages/app/src/App.tsx" +{/* highlight-add-start */} +const createUserEmailColumn = (): TableColumn => ({ + title: 'User Email', + field: 'entity.spec.profile.email', + render: ({ entity }) => ( + + ), +}); +{/* highlight-add-end */} + +const myColumnsFunc: CatalogTableColumnsFunc = entityListContext => { + if (entityListContext.filters.kind?.value === 'user') { + return [ + return [ + // Render existing columns + ...CatalogTable.defaultColumnsFunc(entityListContext), + // Add new columns here + {/* highlight-add-next-line */} + createUserEmailColumn(), + ]; + } + + return CatalogTable.defaultColumnsFunc(entityListContext); +}; +``` + +Finally, we can pass the `myColumnsFunc` to the `CatalogIndexPage` component: + +```tsx title="packages/app/src/App.tsx" +const routes = ( + + + } + /> + {/* Other routes */} + +) +``` + +### Adding columns to a custom or specific Kind + +Another use case for customization is when adding a custom `Kind`. This feature is available in Backstage >= `v1.23.0`. For example: ```tsx title="packages/app/src/App.tsx" import { @@ -97,7 +177,7 @@ const myColumnsFunc: CatalogTableColumnsFunc = entityListContext => { :::note Note -The above example has been simplified and you will most likely have more code then just this in your `App.tsx` file. +In the examples above, the contents of the files have been shortened for simplicity. ::: @@ -168,15 +248,15 @@ const customActions: TableProps['actions'] = [ :::note Note -The above example has been simplified and you will most likely have more code then just this in your `App.tsx` file. +In the example above, the contents of `App.tsx` has been shortened for simplicity. ::: -The above customization will override the existing actions. Currently the only way to keep them and add your own is to also include the existing actions in your array by copying them from the [`defaultActions`](https://github.com/backstage/backstage/blob/57397e7d6d2d725712c439f4ab93f2ac6aa27bf8/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx#L113-L168). +The above customization will override the existing actions. Currently, the only way to keep them and add your own is to also include the existing actions in your array by copying them from the [`defaultActions`](https://github.com/backstage/backstage/blob/57397e7d6d2d725712c439f4ab93f2ac6aa27bf8/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx#L113-L168). ## Customize Filters -There are three options you have for filters: adjusting the existing filters with props, adding or removing the default filters, or creating a brand new custom filter. The following sections cover these cases +There are various ways to customize filters: adjusting the existing filters with props, adding or removing default filters, creating brand-new custom filters, etc. The following sections cover these cases: ### Default Filter Props @@ -205,7 +285,7 @@ import { DefaultFilters } from '@backstage/plugin-catalog-react'; ### Removing Default Filters -You may have reasons not use the Lifecycle, Tag, and Processing Status filters, here's an example of how you would remove them: +If you have reasons not to use the Lifecycle, Tag, and Processing Status filters, here's an example of how to remove them: ```tsx title="packages/app/src/App.tsx" import { @@ -236,7 +316,7 @@ import { ### Custom Filters -You can add custom filters. For example, suppose that I want to allow filtering by a custom annotation added to entities, `company.com/security-tier`. Here is how we can build a filter to support that need. +You can add custom filters. For example, suppose that we want to allow filtering by a custom annotation added to entities, `company.com/security-tier`. Here is how we can build a filter to support that need. First we need to create a new filter that implements the `EntityFilter` interface: 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 11e67af07f..8cfc5464f2 100644 --- a/docs/features/software-templates/writing-custom-actions.md +++ b/docs/features/software-templates/writing-custom-actions.md @@ -220,7 +220,7 @@ const scaffolderModuleCustomExtensions = createBackendModule({ async init({ scaffolder /* ..., other dependencies */ }) { // Here you have the opportunity to interact with the extension // point before the plugin itself gets instantiated - scaffolder.addActions(new createNewFileAction()); // just an example + scaffolder.addActions(createNewFileAction()); // just an example }, }); }, diff --git a/docs/features/techdocs/addons.md b/docs/features/techdocs/addons.md index 471e62a57f..fff1f09d71 100644 --- a/docs/features/techdocs/addons.md +++ b/docs/features/techdocs/addons.md @@ -186,7 +186,7 @@ import { useShadowRootElements } from '@backstage/plugin-techdocs-react'; // difference is that you'd set `location` to `TechDocsAddonLocations.Content`. export const MakeAllImagesCatGifsAddon = () => { // This hook can be used to get references to specific elements. If you need - // access to the whole shadow DOM, use the the underlying useShadowRoot() + // access to the whole shadow DOM, use the underlying useShadowRoot() // hook instead. const images = useShadowRootElements(['img']); 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/config/database.md b/docs/getting-started/config/database.md index e6d1278b70..699160d550 100644 --- a/docs/getting-started/config/database.md +++ b/docs/getting-started/config/database.md @@ -169,4 +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. +- [Install `pgAdmin` 4](https://www.pgadmin.org/), a helpful tool for querying your database. diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index 687cf0be16..7aee835910 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -91,7 +91,7 @@ app the intended workspace rather than in the root._ - **packages/**: Lerna leaf packages or "workspaces". Everything here is going to be a separate package, managed by lerna. -- **packages/app/**: An fully functioning Backstage frontend app, that acts as a +- **packages/app/**: A fully functioning Backstage frontend app that acts as a good starting point for you to get to know Backstage. - **packages/backend/**: We include a backend that helps power features such as [Authentication](https://backstage.io/docs/auth/), diff --git a/docs/getting-started/keeping-backstage-updated.md b/docs/getting-started/keeping-backstage-updated.md index a641523215..bf0b569c29 100644 --- a/docs/getting-started/keeping-backstage-updated.md +++ b/docs/getting-started/keeping-backstage-updated.md @@ -30,9 +30,10 @@ 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) +To make 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) ::: @@ -142,10 +143,17 @@ down the number of duplicate packages. The Backstage CLI uses [global-agent](https://www.npmjs.com/package/global-agent) to configure HTTP/HTTPS proxy settings using environment variables. This allows you to route the CLI’s network traffic through a proxy server, which can be useful in environments with restricted internet access. +Additionally, yarn needs a proxy too (sometimes), when in environments with restricted internet access. It uses different settings than the global-agent module. If you decide to use the backstage yarn plugin [mentioned above](#plugin), you will need to set additional proxy values. +If you will always need proxy settings in all environments and situations, you can add `httpProxy` and `httpsProxy` values to [the yarnrc.yml file](https://yarnpkg.com/configuration/yarnrc). If some environments need it (say a developer workstation) but other environments do not (perhaps a CI build server running on AWS), then you may not want to update the yarnrc.yml file but just set environment variables `YARN_HTTP_PROXY` and `YARN_HTTPS_PROXY` in the environments/situations where you need to proxy. + +**If you plan to use the backstage yarn plugin, you will need these extra yarn proxy settings to both install the plugin and run the `versions:bump` command**. If you do not plan to use the backstage yarn plugin, it seems like the global agent proxy settings alone are sufficient. + ### Example Configuration ```bash export GLOBAL_AGENT_HTTP_PROXY=http://proxy.company.com:8080 export GLOBAL_AGENT_HTTPS_PROXY=https://secure-proxy.company.com:8080 export GLOBAL_AGENT_NO_PROXY=localhost,internal.company.com +export YARN_HTTP_PROXY=http://proxy.company.com:8080 # optional +export YARN_HTTPS_PROXY=https://secure-proxy.company.com:8080 # optional ``` diff --git a/docs/integrations/azure/org.md b/docs/integrations/azure/org.md index e6fb69a520..068aa70101 100644 --- a/docs/integrations/azure/org.md +++ b/docs/integrations/azure/org.md @@ -258,67 +258,203 @@ The `myUserTransformer`, `myGroupTransformer`, `myOrganizationTransformer`, and The following provides an example of each kind of transformer. We recommend creating a `transformers.ts` file in your `packages/backend/src` folder for these. -```ts title="packages/backend/src/transformers.ts" +First, lets set up the basic structure of the file, with functions for each kind of transformer that simply passes through the default transformer unchanged. + +```ts title="packages/backend/src/extensions/transformers.ts" import * as MicrosoftGraph from '@microsoft/microsoft-graph-types'; import { defaultGroupTransformer, defaultUserTransformer, defaultOrganizationTransformer, + microsoftGraphOrgEntityProviderTransformExtensionPoint, MicrosoftGraphProviderConfig, } from '@backstage/plugin-catalog-backend-module-msgraph'; import { GroupEntity, UserEntity } from '@backstage/catalog-model'; +import { createBackendModule } from '@backstage/backend-plugin-api'; -// This group transformer completely replaces the built in logic with custom logic. +// The Group transformer transforms Groups that are ingested from MS Graph export async function myGroupTransformer( group: MicrosoftGraph.Group, groupPhoto?: string, ): Promise { - return { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Group', - metadata: { - name: group.id!, - annotations: {}, - }, - spec: { - type: 'Microsoft Entra ID', - children: [], - }, - }; + const backstageGroup = await defaultGroupTransformer(group, groupPhoto); + return backstageGroup; } -// This user transformer makes use of the built in logic, but also sets the description field +// The User transformer transforms Users that are ingested from MS Graph export async function myUserTransformer( graphUser: MicrosoftGraph.User, userPhoto?: string, ): Promise { const backstageUser = await defaultUserTransformer(graphUser, userPhoto); - - if (backstageUser) { - backstageUser.metadata.description = 'Loaded from Microsoft Entra ID'; - } - return backstageUser; } -// Example organization transformer that removes the organization group completely +// The Organization transformer transforms the root MS Graph Organization into a Group export async function myOrganizationTransformer( graphOrganization: MicrosoftGraph.Organization, ): Promise { - return undefined; + const backstageOrg = await defaultOrganizationTransformer(graphOrganization); + return backstageOrg; } -// Example config transformer that expands the group filter to also include 'azure-group-a' +// The Provider Config transformer enables modification of the plugin config export async function myProviderConfigTransformer( provider: MicrosoftGraphProviderConfig, ): Promise { + return provider; +} + +// Wrapping these functions in a Module allows us to inject them into the Catalog plugin easily +export default createBackendModule({ + pluginId: 'catalog', + moduleId: 'msgraph-org', + register(reg) { + reg.registerInit({ + deps: { + microsoftGraphTransformers: + microsoftGraphOrgEntityProviderTransformExtensionPoint, + }, + async init({ microsoftGraphTransformers }) { + // Set the transformers to our custom functions + microsoftGraphTransformers.setUserTransformer(myUserTransformer); + microsoftGraphTransformers.setGroupTransformer(myGroupTransformer); + microsoftGraphTransformers.setOrganizationTransformer( + myOrganizationTransformer, + ); + microsoftGraphTransformers.setProviderConfigTransformer( + myProviderConfigTransformer, + ); + }, + }); + }, +}); +``` + +Now lets customize each of the providers to suit our needs. + +This Group Transformer example will have the default logic completely removed and replaced with our custom logic: + +```ts +export async function myGroupTransformer( + group: MicrosoftGraph.Group, + groupPhoto?: string, +): Promise { + // highlight-remove-start + const backstageGroup = await defaultGroupTransformer(group, groupPhoto); + return backstageGroup; + // highlight-remove-end + // highlight-add-start + // All of our groups are prefixed with the organisational unit: 'Engineering - Team A' + // We want to drop the org unit from the group name and use it for the namespace instead + const groupNameArr = group.displayName.split(' - '); + const displayName = groupNameArr[1]; + // Standardise name and namespace by replacing spaces with hyphens and converting to lowercase + const namespace = groupNameArr[0].replace(' ', '-').toLowerCase(); + const groupName = groupNameArr[1].replace(' ', '-').toLowerCase(); + + return { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: groupName, + description: group.description, + annotations: {}, + }, + spec: { + type: 'team', + displayName: displayName, + email: group.mail, + children: [], + }, + }; + // highlight-add-end +} +``` + +This User Transformer example makes use of the built-in logic, but also modifies the username and sets a description + +```ts +export async function myUserTransformer( + graphUser: MicrosoftGraph.User, + userPhoto?: string, +): Promise { + const backstageUser = await defaultUserTransformer(graphUser, userPhoto); + // highlight-add-start + // Make sure the default transformer returned an entity + if (backstageUser) { + // Update the description to make it obvious where this entity came from + backstageUser.metadata.description = + 'Loaded from Microsoft Entra ID via MyCustomUserTransformer'; + + // The default transformer sets the username to the email address with invalid characters subbed out: 'user_domain.com' + // Set the username to the local part of the email address in lowercase without the domain + const newName = backstageUser.metadata.name.split('_')[0].toLowerCase(); + backstageUser.metadata.name = newName; + + return backstageUser; + } + return undefined; + // highlight-add-end + // highlight-remove-start + return backstageUser; + // highlight-remove-end +} +``` + +This Organization Transformer example removes the organization group completely by returning undefined + +```ts +export async function myOrganizationTransformer( + graphOrganization: MicrosoftGraph.Organization, +): Promise { + // highlight-remove-start + const backstageOrg = await defaultOrganizationTransformer(graphOrganization); + return backstageOrg; + // highlight-remove-end + // highlight-add-start + // The org transformer creates a group to be used as the base of the relationship tree for groups + // We don't need this to be created, so return undefined instead of an entity + return undefined; + // highlight-add-end +} +``` + +This Config Transformer example expands the group filter to also include 'azure-group-a' + +```ts +export async function myProviderConfigTransformer( + provider: MicrosoftGraphProviderConfig, +): Promise { + // highlight-add-start + // The filter in our config file relies on a property that has been intermittantly causing this important group to fail ingestion + // Ensure the group is always discovered by the filter if (!provider.groupFilter?.includes('azure-group-a')) { provider.groupFilter = `${provider.groupFilter} or displayName eq 'azure-group-a'`; } + // highlight-add-end return provider; } ``` +Now we just need to add our new module to the Backend. + +```ts title="packages/backend/src/index.ts" +// Your file will have more than this in it + +const backend = createBackend(); + +... + +// highlight-add-start +backend.add(import('./extensions/transformers')); +// highlight-add-end + +... + +backend.start(); +``` + ## Troubleshooting ### No data diff --git a/docs/integrations/gitlab/org.md b/docs/integrations/gitlab/org.md index 66ce117aa0..8249a97c24 100644 --- a/docs/integrations/gitlab/org.md +++ b/docs/integrations/gitlab/org.md @@ -170,7 +170,7 @@ catalog: yourProviderId: host: gitlab.com orgEnabled: true - group: org/teams # Required for gitlab.com when `orgEnabled: true`. Optional for self managed. Must not end with slash. Accepts only groups under the provided path (which will be stripped) + group: org/teams # Required for gitlab.com when `orgEnabled: true`. Optional for self managed. Must not end with slash. Accepts only this group and groups under the provided path (which will be stripped) relations: # Optional - INHERITED # Optional. Members of any ancestor groups will also be considered members of the current group. - DESCENDANTS # Optional. Members of any descendant groups will also be considered members of the current group. @@ -240,7 +240,7 @@ catalog: yourProviderId: host: gitlab.com ## Could also be self hosted. orgEnabled: true - group: org/teams # Required for gitlab.com when `orgEnabled: true`. Optional for self managed. Must not end with slash. Accepts only groups under the provided path (which will be stripped) + group: org/teams # Required for gitlab.com when `orgEnabled: true`. Optional for self managed. Must not end with slash. Accepts only this group and groups under the provided path (which will be stripped) restrictUsersToGroup: true # Optional: Backstage will ingest only users directly assigned to org/teams. includeUsersWithoutSeat: false # Optional: Set to true to include users without paid seat, only applicable for SaaS ``` diff --git a/docs/notifications/index.md b/docs/notifications/index.md index b44b04ef4e..5b5e2bcfa2 100644 --- a/docs/notifications/index.md +++ b/docs/notifications/index.md @@ -130,226 +130,6 @@ export default app.createRoot( If the signals plugin is properly configured, it will be automatically discovered by the notifications plugin and used. -## Configuration - -### Notifications Backend - -The Notifications backend plugin provides an API to create notifications, list notifications per logged-in user, and search based on parameters. - -The plugin uses a relational [database](https://backstage.io/docs/getting-started/config/database) for persistence; no specifics are introduced in this context. - -No additional configuration in the app-config is needed, except for optional additional modules for `processors`. - -### Notifications Frontend - -The recipients of notifications have to be entities in the catalog, e.g., of the User or Group kind. - -Otherwise, no specific configuration is needed for the front-end notifications plugin. - -All parametrization is done through component properties, such as the `NotificationsSidebarItem`, which can be used as an active left-side menu item in the front-end. - -![Notifications Page](notificationsPage.png) - -In the `packages/app/src/components/Root/Root.tsx`, tweak the [properties](https://backstage.io/docs/reference/plugin-notifications.notificationssidebaritem) of the `` per specific needs. - -## Use - -New notifications can be sent either by a backend plugin or an external service through the REST API. - -### Backend - -Regardless of technical feasibility, a backend plugin should avoid directly accessing the notifications REST API. -Instead, it should integrate with the `@backstage/plugin-notifications-node` to `send` (create) a new notification. - -The reasons for this approach include the propagation of authorization in the API request and improved maintenance and backward compatibility in the future. - -```ts -import { notificationService } from '@backstage/plugin-notifications-node'; - -export const myPlugin = createBackendPlugin({ - pluginId: 'myPlugin', - register(env) { - env.registerInit({ - deps: { - // ... - notificationService: notificationService, - }, - async init({ config, logger, httpRouter, notificationService }) { - httpRouter.use( - await createRouter({ - // ... - notificationService, - }), - ); - }, - }); - }, -}); -``` - -To emit a new notification: - -```ts -notificationService.send({ - recipients /* of the broadcast or entity type */, - payload /* actual message */, -}); -``` - -Refer the [API documentation](https://github.com/backstage/backstage/blob/master/plugins/notifications-node/report.api.md) for further details. - -### Signals - -The use of signals with notifications is optional but generally enhances user experience and performance. - -When a notification is created, a new signal is emitted to a general-purpose message bus to announce it to subscribed listeners. - -The frontend maintains a persistent connection (WebSocket) to receive these announcements from the notifications channel. -The specific details of the updated or created notification should be retrieved via a request to the notifications API, except for new notifications, where the payload is included in the signal for performance reasons. - -In a frontend plugin, to subscribe for notifications' signals: - -```ts -import { useSignal } from '@backstage/plugin-signals-react'; - -const { lastSignal } = useSignal('notifications'); - -React.useEffect(() => { - /* ... */ -}, [lastSignal, notificationsApi]); -``` - -#### Using signals in your own plugin - -It's possible to use signals in your own plugin to deliver data from the backend to the frontend in near real-time. - -To use signals in your own frontend plugin, you need to add the `useSignal` hook from `@backstage/plugin-signals-react` from `@backstage/plugin-notifications-common` with optional generic type of the signal. - -```ts -// To use the same type of signal in the backend, this should be placed in a shared common package -export type MySignalType = { - user: string; - data: string; - // .... -}; - -const { lastSignal } = useSignal('my-plugin'); - -useEffect(() => { - if (lastSignal) { - // Do something with the signal - } -}, [lastSignal]); -``` - -To send signals from the backend plugin, you must add the `signalsServiceRef` to your plugin or module as a dependency. - -```ts -import { signalsServiceRef } from '@backstage/plugin-signals-node'; -export const myPlugin = createBackendPlugin({ - pluginId: 'my', - register(env) { - env.registerInit({ - deps: { - httpRouter: coreServices.httpRouter, - signals: signalsServiceRef, - }, - async init({ httpRouter, signals }) { - httpRouter.use( - await createRouter({ - signals, - }), - ); - }, - }); - }, -}); -``` - -To send the signal using the service, you can use the `publish` method. - -```ts -signals.publish({ user: 'user', data: 'test' }); -``` - -### Consuming Notifications - -In a front-end plugin, the simplest way to query a notification is by its ID: - -```ts -import { useApi } from '@backstage/core-plugin-api'; -import { notificationsApiRef } from '@backstage/plugin-notifications'; - -const notificationsApi = useApi(notificationsApiRef); - -notificationsApi.getNotification(yourId); - -// or with connection to signals: -notificationsApi.getNotification(lastSignal.notification_id); -``` - -### Extending Notifications via Processors - -The notifications can be extended with `NotificationProcessor`. These processors allow to decorate notifications before they are sent or/and send the notifications to external services. - -Depending on the needs, a processor can modify the content of a notification or route it to different systems like email, Slack, or other services. - -A good example of how to write a processor is the [Email Processor](https://github.com/backstage/backstage/tree/master/plugins/notifications-backend-module-email). - -Start off by creating a notification processor: - -```ts -import { Notification } from '@backstage/plugin-notifications-common'; -import { NotificationProcessor } from '@backstage/plugin-notifications-node'; - -class MyNotificationProcessor implements NotificationProcessor { - // preProcess is called before the notification is saved to database. - // This is a good place to modify the notification before it is saved and sent to the user. - async preProcess(notification: Notification): Promise { - if (notification.origin === 'plugin-my-plugin') { - notification.payload.icon = 'my-icon'; - } - return notification; - } - - // postProcess is called after the notification is saved to database and the signal is emitted. - // This is a good place to send the notification to external services. - async postProcess(notification: Notification): Promise { - nodemailer.sendEmail({ - from: 'backstage', - to: 'user', - subject: notification.payload.title, - text: notification.payload.description, - }); - } -} -``` - -Both of the processing functions are optional, and you can implement only one of them. - -Add the notification processor to the notification system by: - -```ts -import { notificationsProcessingExtensionPoint } from '@backstage/plugin-notifications-node'; -import { Notification } from '@backstage/plugin-notifications-common'; - -export const myPlugin = createBackendPlugin({ - pluginId: 'myPlugin', - register(env) { - env.registerInit({ - deps: { - notifications: notificationsProcessingExtensionPoint, - // ... - }, - async init({ notifications }) { - // ... - notifications.addProcessor(new MyNotificationProcessor()); - }, - }); - }, -}); -``` - ### User-specific notification settings The notifications plugin provides a way for users to manage their notification settings. To enable this, you must @@ -375,19 +155,6 @@ You can customize the origin names shown in the UI by passing an object where th Each notification processor will receive its own column in the settings page, where the user can enable or disable notifications from that processor. -### External Services - -When the emitter of a notification is a Backstage backend plugin, it is mandatory to use the integration via `@backstage/plugin-notifications-node` as described above. - -If the emitter is a service external to Backstage, an HTTP POST request can be issued directly to the API, assuming that authentication is properly configured. -Refer to the [service-to-service auth documentation](https://backstage.io/docs/auth/service-to-service-auth) for more details, focusing on the Static Tokens section for the simplest setup option. - -An example request for creating a broadcast notification might look like: - -```bash -curl -X POST https://[BACKSTAGE_BACKEND]/api/notifications -H "Content-Type: application/json" -H "Authorization: Bearer YOUR_BASE64_SHARED_KEY_TOKEN" -d '{"recipients":{"type":"broadcast"},"payload": {"title": "Title of broadcast message","link": "http://foo.com/bar","severity": "high","topic": "The topic"}}' -``` - ## Additional info An example of a backend plugin sending notifications can be found in https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend-module-notifications. @@ -395,9 +162,10 @@ An example of a backend plugin sending notifications can be found in https://git Sources of the notifications and signal plugins: - https://github.com/backstage/backstage/blob/master/plugins/notifications - - https://github.com/backstage/backstage/blob/master/plugins/notifications-backend - +- https://github.com/backstage/backstage/blob/master/plugins/notifications-common - https://github.com/backstage/backstage/blob/master/plugins/notifications-node - +- https://github.com/backstage/backstage/blob/master/plugins/signals-backend +- https://github.com/backstage/backstage/blob/master/plugins/signals +- https://github.com/backstage/backstage/blob/master/plugins/signals-node - https://github.com/backstage/backstage/blob/master/plugins/signals-react diff --git a/docs/notifications/processors.md b/docs/notifications/processors.md new file mode 100644 index 0000000000..abee7c97c3 --- /dev/null +++ b/docs/notifications/processors.md @@ -0,0 +1,107 @@ +--- +id: processors +title: Processors +description: How to setup notification processors +--- + +Notifications can be extended with `NotificationProcessor`. These processors allow you to decorate notifications before they are sent and/or send the notifications to external services. + +Depending on your needs, a processor can modify the content of a notification or route it to different systems like email, Slack, or other services. + +A good example of how to write a processor is the [Email Processor](https://github.com/backstage/backstage/tree/master/plugins/notifications-backend-module-email). + +Start off by creating a notification processor: + +```ts +import { Notification } from '@backstage/plugin-notifications-common'; +import { NotificationProcessor } from '@backstage/plugin-notifications-node'; + +class MyNotificationProcessor implements NotificationProcessor { + // preProcess is called before the notification is saved to database. + // This is a good place to modify the notification before it is saved and sent to the user. + async preProcess(notification: Notification): Promise { + if (notification.origin === 'plugin-my-plugin') { + notification.payload.icon = 'my-icon'; + } + return notification; + } + + // postProcess is called after the notification is saved to database and the signal is emitted. + // This is a good place to send the notification to external services. + async postProcess(notification: Notification): Promise { + nodemailer.sendEmail({ + from: 'backstage', + to: 'user', + subject: notification.payload.title, + text: notification.payload.description, + }); + } +} +``` + +Both of the processing functions are optional, and you can just implement one of them. + +Add the notification processor to the notification system by: + +```ts +import { notificationsProcessingExtensionPoint } from '@backstage/plugin-notifications-node'; +import { Notification } from '@backstage/plugin-notifications-common'; + +export const myPlugin = createBackendPlugin({ + pluginId: 'myPlugin', + register(env) { + env.registerInit({ + deps: { + notifications: notificationsProcessingExtensionPoint, + // ... + }, + async init({ notifications }) { + // ... + notifications.addProcessor(new MyNotificationProcessor()); + }, + }); + }, +}); +``` + +## Built-in Processors + +Backstage comes with some processors that can be used immediately. + +### Email Processor + +Email processor is used to send notifications to users using email. To install the email processor, add the `@backstage/plugin-notifications-backend-module-email` package to your backend. + +```bash +yarn workspace backend add @backstage/plugin-notifications-backend-module-email +``` + +Add the email processor to your backend: + +```ts +import { createBackend } from '@backstage/plugin-notifications-backend'; +const backend = createBackend(); +// ... +backend.add(import('@backstage/plugin-notifications-backend-module-email')); +``` + +To configure the email processor, you need to add the following configuration to your `app-config.yaml`: + +```yaml +notifications: + email: + smtp: + host: smtp.example.com + port: 587 + secure: false + username: ${SMTP_USERNAME} + password: ${SMTP_PASSWORD} +``` + +Apart from STMP, the email processor also supports the following transmissions: + +- SES +- sendmail +- stream (only for debugging purposes) + +See more information at https://github.com/backstage/backstage/blob/master/plugins/notifications-backend-module-email/README.md diff --git a/docs/notifications/usage.md b/docs/notifications/usage.md new file mode 100644 index 0000000000..59fbd83e3b --- /dev/null +++ b/docs/notifications/usage.md @@ -0,0 +1,212 @@ +--- +id: usage +title: Usage +description: How to use the notifications and signals +--- + +## Notifications Backend + +The Notifications backend plugin provides an API to create notifications, list notifications per logged-in user, and search based on parameters. + +The plugin uses a relational [database](https://backstage.io/docs/getting-started/config/database) for persistence; no specifics are introduced in this context. + +No additional configuration in the app-config is needed, except for optional additional modules for `processors`. + +## Notifications Frontend + +The recipients of notifications have to be entities in the catalog, e.g., of the User or Group kind. + +Otherwise, no specific configuration is needed for the front-end notifications plugin. + +All parametrization is done through component properties, such as the `NotificationsSidebarItem`, which can be used as an active left-side menu item in the front-end. + +![Notifications Page](notificationsPage.png) + +In the `packages/app/src/components/Root/Root.tsx`, tweak the [properties](https://backstage.io/docs/reference/plugin-notifications.notificationssidebaritem) of the `` per specific needs. + +## Usage + +New notifications can be sent either by a backend plugin or an external service through the REST API. + +## Backend + +Regardless of technical feasibility, a backend plugin should avoid directly accessing the notifications REST API. +Instead, it should integrate with the `@backstage/plugin-notifications-node` to `send` (create) a new notification. + +The reasons for this approach include the propagation of authorization in the API request and improved maintenance and backward compatibility in the future. + +```ts +import { notificationService } from '@backstage/plugin-notifications-node'; + +export const myPlugin = createBackendPlugin({ + pluginId: 'myPlugin', + register(env) { + env.registerInit({ + deps: { + // ... + notificationService: notificationService, + }, + async init({ + // ... + notificationService, + }) { + httpRouter.use( + await createRouter({ + // ... + notificationService, + }), + ); + }, + }); + }, +}); +``` + +To emit a new notification: + +```ts +await notificationService.send({ + recipients /* of the broadcast or entity type */, + payload /* actual message */, +}); +``` + +Refer the [API documentation](https://github.com/backstage/backstage/blob/master/plugins/notifications-node/report.api.md) for further details. + +### External Services + +When the emitter of a notification is a Backstage backend plugin, it is mandatory to use the integration via `@backstage/plugin-notifications-node` as described above. + +If the emitter is a service external to Backstage, an HTTP POST request can be issued directly to the API, assuming that authentication is properly configured. +Refer to the [service-to-service auth documentation](https://backstage.io/docs/auth/service-to-service-auth) for more details, focusing on the Static Tokens section for the simplest setup option. + +An example request for creating a broadcast notification might look like: + +```bash +curl -X POST https://[BACKSTAGE_BACKEND]/api/notifications -H "Content-Type: application/json" -H "Authorization: Bearer YOUR_BASE64_SHARED_KEY_TOKEN" -d '{"recipients":{"type":"broadcast"},"payload": {"title": "Title of broadcast message","link": "http://foo.com/bar","severity": "high","topic": "The topic"}}' +``` + +### Scaffolder Templates + +You can use the `@backstage/plugin-scaffolder-backend-module-notifications` to send notifications when scaffolder templates are run. To install the module, add it to your backend plugin: + +```bash +yarn workspace backend add @backstage/plugin-scaffolder-backend-module-notifications +``` + +Then, add the module to your backend: + +```ts +const backend = createBackend(); +// ... +backend.add( + import('@backstage/plugin-scaffolder-backend-module-notifications'), +); +``` + +In your template you can now use `notification:send` action as part of the steps: + +```yaml +steps: + - id: notify + name: Notify + action: notification:send + input: + recipients: entity + entityRefs: + - component:default/backstage + title: 'Template executed' + info: 'Your template has been executed' + severity: 'info' + link: https://backstage.io +``` + +## Signals + +The use of signals with notifications is optional but generally enhances user experience and performance. + +When a notification is created, a new signal is emitted to a general-purpose message bus to announce it to subscribed listeners. + +The frontend maintains a persistent connection (WebSocket) to receive these announcements from the notifications channel. +The specific details of the updated or created notification should be retrieved via a request to the notifications API, except for new notifications, where the payload is included in the signal for performance reasons. + +In a frontend plugin, to subscribe to notifications' signals: + +```ts +import { useSignal } from '@backstage/plugin-signals-react'; + +const { lastSignal } = useSignal('notifications'); + +React.useEffect(() => { + /* ... */ +}, [lastSignal, notificationsApi]); +``` + +#### Using signals in your own plugin + +It's possible to use signals in your own plugin to deliver data from the backend to the frontend in near real-time. + +To use signals in your own frontend plugin, you need to add the `useSignal` hook from `@backstage/plugin-signals-react` from `@backstage/plugin-notifications-common` with optional generic type of the signal. + +```ts +// To use the same type of signal in the backend, this should be placed in a shared common package +export type MySignalType = { + user: string; + data: string; + // .... +}; + +const { lastSignal } = useSignal('my-plugin'); + +useEffect(() => { + if (lastSignal) { + // Do something with the signal + } +}, [lastSignal]); +``` + +To send signals from the backend plugin, you must add the `signalsServiceRef` to your plugin or module as a dependency. + +```ts +import { signalsServiceRef } from '@backstage/plugin-signals-node'; +export const myPlugin = createBackendPlugin({ + pluginId: 'my', + register(env) { + env.registerInit({ + deps: { + httpRouter: coreServices.httpRouter, + signals: signalsServiceRef, + }, + async init({ httpRouter, signals }) { + httpRouter.use( + await createRouter({ + signals, + }), + ); + }, + }); + }, +}); +``` + +To send the signal using the service, you can use the `publish` method. + +```ts +signals.publish({ user: 'user', data: 'test' }); +``` + +## Consuming Notifications + +In a front-end plugin, the simplest way to query a notification is by its ID: + +```ts +import { useApi } from '@backstage/core-plugin-api'; +import { notificationsApiRef } from '@backstage/plugin-notifications'; + +const notificationsApi = useApi(notificationsApiRef); + +notificationsApi.getNotification(yourId); + +// or with connection to signals: +notificationsApi.getNotification(lastSignal.notification_id); +``` diff --git a/docs/overview/adopting.md b/docs/overview/adopting.md index 5b6c3bcaed..a6053d0f85 100644 --- a/docs/overview/adopting.md +++ b/docs/overview/adopting.md @@ -94,31 +94,31 @@ Examples of tactics we have used to evangelize Backstage internally: These are some of the metrics that you can use to verify if Backstage has a successful impact on your software development process: -- **Onboarding time** Time until new engineers are productive. At Spotify we +- **Onboarding time** - Time until new engineers are productive. At Spotify we measure this as the time until the employee has merged their 10th PR (this metric was down 55% two years after deploying Backstage). Even though you may not be onboarding engineers at a rapid pace, this metric is a great proxy for the overall complexity of your ecosystem. Reducing it will therefore benefit your whole engineering organization, not just new joiners. -- **Number of merges per developer/day** Less time spent jumping between +- **Number of merges per developer/day** - Less time spent jumping between different tools and looking for information means more time to focus on shipping code. A second level of bottlenecks can be identified if you categorize contributions by domain (services, web, data, etc). -- **Deploys to production** Cousin to the metric above: How many times does an +- **Deploys to production** - Cousin to the metric above: How many times does an engineer push changes into production. -- **MTTR** With clear ownership of all the pieces in your microservices +- **MTTR** - With clear ownership of all the pieces in your microservices ecosystem and all tools integrated into one place, Backstage makes it quicker for teams to find the root cause of failures, and fix them. -- **Context switching** Reducing context switching can help engineers stay in +- **Context switching** - Reducing context switching can help engineers stay in the "zone". We measure the number of different tools an engineer has to interact with in order to get a certain job done (e.g. push a change, follow it into production and validate it did not break anything). -- **T-shapedness** A +- **T-shapedness** - A [T-shaped](https://medium.com/@jchyip/why-t-shaped-people-e8706198e437) engineer is someone that is able to contribute to different domains of engineering. Teams with T-shaped people have fewer bottlenecks and can @@ -126,10 +126,10 @@ successful impact on your software development process: since tools and infrastructure are consistent between domains, and information is available centrally. -- **eNPS** Surveys asking about how productive people feel, how easy it is to +- **eNPS** - Surveys asking about how productive people feel, how easy it is to find information and overall satisfaction with internal tools. -- **Fragmentation** _(Experimental)_ Backstage +- **Fragmentation** _(Experimental)_ - Backstage [Software Templates](../features/software-templates/index.md) help drive standardization in your software ecosystem. By measuring the variance in technology between different software components it is possible to get a sense diff --git a/docs/plugins/analytics.md b/docs/plugins/analytics.md index 43636c8a0e..0a6bac81a0 100644 --- a/docs/plugins/analytics.md +++ b/docs/plugins/analytics.md @@ -51,7 +51,7 @@ learn how to contribute the integration yourself! [ga4]: https://github.com/backstage/community-plugins/blob/main/workspaces/analytics/plugins/analytics-module-ga4/README.md [newrelic-browser]: https://github.com/backstage/community-plugins/blob/main/workspaces/analytics/plugins/analytics-module-newrelic-browser/README.md [qm]: https://github.com/quantummetric/analytics-module-qm/blob/main/README.md -[matomo]: https://github.com/janus-idp/backstage-plugins/blob/main/plugins/analytics-module-matomo/README.md +[matomo]: https://github.com/backstage/community-plugins/blob/main/workspaces/analytics/plugins/analytics-module-matomo/README.md [add-tool]: https://github.com/backstage/backstage/issues/new?assignees=&labels=plugin&template=plugin_template.md&title=%5BAnalytics+Module%5D+THE+ANALYTICS+TOOL+TO+INTEGRATE [int-howto]: #writing-integrations [analytics-api-type]: https://backstage.io/docs/reference/core-plugin-api.analyticsapi diff --git a/docs/releases/v1.34.0-changelog.md b/docs/releases/v1.34.0-changelog.md new file mode 100644 index 0000000000..80ca60b965 --- /dev/null +++ b/docs/releases/v1.34.0-changelog.md @@ -0,0 +1,2604 @@ +# Release v1.34.0 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.34.0](https://backstage.github.io/upgrade-helper/?to=1.34.0) + +## @backstage/backend-app-api@1.1.0 + +### Minor Changes + +- ebf083d: Service factories added by feature loaders now have lower priority and will be ignored if a factory for the same service is added directly by `backend.add(serviceFactory)`. +- 12eac85: **EXPERIMENTAL**: Adds a new `instanceMetadataService` to hold information about a specific backend instance. + +### Patch Changes + +- eef3ef1: Removed unused `express` dependencies. +- ae2408b: Add a `toString` on the default `BackendFeatureMeta` implementations +- 5c9cc05: Use native fetch instead of node-fetch +- 0e9c9fa: As soon as a backend termination signal is received, call before shutting down root lifecycle hooks. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/backend-defaults@0.6.0 + +### Minor Changes + +- fd5d337: 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. + +- 3f34ea9: Throttles Bitbucket Server API calls + +- 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 + ``` + +- 29180ec: **BREAKING PRODUCERS**: The `LifecycleMiddlewareOptions.startupRequestPauseTimeout` has been removed. Use the `backend.lifecycle.startupRequestPauseTimeout` setting in your `app-config.yaml` file to customize how the `createLifecycleMiddleware` function should behave. Also the root config service is required as an option when calling the `createLifecycleMiddleware` function: + + ```diff + - createLifecycleMiddleware({ lifecycle, startupRequestPauseTimeout }) + + createLifecycleMiddleware({ config, lifecycle }) + ``` + +- 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 + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 5b1e68c: Immediately close all connections when shutting down in local development. +- 8863b38: Export `PluginTokenHandler` and `pluginTokenHandlerDecoratorServiceRef` to allow for custom decoration of the plugin token handler without having to re-implement the entire handler. +- 29180ec: Fix server response time by moving the lifecycle startup hooks back to the plugin lifecycle service. +- 57e0b11: 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. +- 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`. +- 57e0b11: The default `authServiceFactory` now correctly depends on the plugin scoped `Logger` services rather than the root scoped one. +- 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 +- 0e9c9fa: Implements the `DefaultRootLifecycleService.addBeforeShutdownHook` method, and updates `DefaultRootHttpRouterService` and `DefaultRootHealthService` to listen to that event to stop accepting traffic and close service connections. +- d0cbd82: Remove use of the `stoppable` library on the `DefaultRootHttpRouterService` as Node's native http server [close](https://nodejs.org/api/http.html#serverclosecallback) method already drains requests. +- 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/integration@1.16.0 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/backend-app-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/cli-node@0.2.11 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + +## @backstage/backend-openapi-utils@0.4.0 + +### Minor Changes + +- afcebea: Fixed a Typescript error when trying to use the new OpenAPI server-side generated code. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## @backstage/backend-plugin-api@1.1.0 + +### Minor Changes + +- 12eac85: **EXPERIMENTAL**: Adds a new `instanceMetadataService` to hold information about a specific backend instance. + +### Patch Changes + +- eef3ef1: Removed unused `express` dependencies. + +- 0e9c9fa: The `RootLifecycleService` now has a new `addBeforeShutdownHook` method, and hooks added through this method will run immediately when a termination event is received. + + The backend will not proceed with the shutdown and run the `Shutdown` hooks until all `BeforeShutdown` hooks have completed. + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/backend-test-utils@1.2.0 + +### Minor Changes + +- de6f280: **BREAKING** Upgraded @keyv/redis and keyv packages to resolve a bug related to incorrect resolution of cache keys. + + This is a breaking change for clients using the `redis` store for cache with `useRedisSets` option set to false since cache keys will be calculated differently (without the sets:namespace: prefix). For clients with default configuration (or useRedisSets set to false) the cache keys will stay the same, but since @keyv/redis library no longer supports redis sets they won't be utilised anymore. + + If you were using `useRedisSets` option in configuration make sure to remove it from `app-config.yaml`: + + ```diff + backend: + cache: + store: redis + connection: redis://user:pass@cache.example.com:6379 + - useRedisSets: false + ``` + +### Patch Changes + +- 0e9c9fa: Mock the new `RootLifecycleService.addBeforeShutdownHook` method. +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/backend-app-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/catalog-client@1.9.0 + +### Minor Changes + +- 384e494: Internal updates to generated code. + +### Patch Changes + +- d7e7836: Fixed a bug in the `queryEntities` method where errors were not being handled properly. +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + +## @backstage/integration@1.16.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/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/repo-tools@0.12.0 + +### Minor Changes + +- c1eccd6: Fix invalid path and malformed flags bugs in api-reports.ts + +### Patch Changes + +- 860e3b5: Generated OpenAPI clients now support paths with tags. +- 5f04976: Fixed a bug that caused missing code in published packages. +- 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/backend-plugin-api@1.1.0 + - @backstage/cli-node@0.2.11 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + +## @backstage/plugin-catalog@1.26.0 + +### Minor Changes + +- 25beb82: Adds an optional columns attribute to HasSubdomainsCardProps and changes its default columns +- 39f1abc: Consistent title behaviour across CatalogTable, CursorPaginatedCatalogTable, and OffsetPaginatedCatalogTable. +- 1ffb9f3: Update `CatalogTable` title to use properly capitalized Kind facets (e.g. 'Component' instead of 'component') + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/plugin-search-react@1.8.4 + - @backstage/catalog-client@1.9.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-catalog-backend@1.29.0 + +### Minor Changes + +- 02bd2cb: Added a new `catalog.disableRelationsCompatibility` configuration option that avoids JSON deserialization and serialization if possible when reading entities. This significantly reduces the memory usage of the catalog, and slightly increases performance, but it removes the backwards compatibility processing that ensures that both `entity.relation[].target` and `entity.relation[].targetRef` are present in returned entities. +- c1307b4: Implement `/entities` in terms of `queryEntities` to not run into memory and performance problems on large catalogs +- 384e494: Internal updates to generated code. +- 1d0bc11: Fetch all facets in a single database query + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 8013c9c: Perform the by-query count inlined with the main query +- feba9ee: Internal refactor of filter parsing logic. +- 1fdb48e: Use a faster count method on pg when computing some metrics +- e4aab10: Fix a bug where sometimes the `by-query` endpoint could return nulls for entities that were not yet stitched. +- f159b25: Compute deltas more efficiently, which generally leads to less wasted processing cycles +- 0c33465: Implement `/entities/by-name/:kind/:namespace/:name` using `getEntitiesByRefs` +- 56511ba: Be more aggressive in dequeueing entities for stitching +- 71152e3: Correctly report stitching queue length +- 5c9cc05: Use native fetch instead of node-fetch +- d93390d: When parsing filters, do not make redundant `anyOf` and `allOf` nodes when there's only a single entry within them +- 3ab57c6: Support changing location keys on existing entities, in delta mutations +- 24ecea8: Avoid extra ordering in by-query when the user doesn't ask for it +- 2924ffe: Compute some metrics using search table facet aggregations instead of reading the full refresh state +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-module-catalog@0.2.6 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/backend-openapi-utils@0.4.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-catalog-backend-module-azure@0.3.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 + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.3.0 + +### Minor Changes + +- 3f34ea9: Throttles Bitbucket Server API calls + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.6.0 + +### Minor Changes + +- 99dce5c: Implemented discovery for top-level groups defined in config.group or if undefined global top-level group in Gitlab + +### Patch Changes + +- 191e5bf: `restrictUsersToGroup` should use the entire group path when getting members +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + +## @backstage/plugin-catalog-backend-module-ldap@0.11.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.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + +## @backstage/plugin-catalog-node@1.15.0 + +### Minor Changes + +- 8edc4cd: Updated the `catalogServiceMock` return type to match both `CatalogService` and `CatalogApi` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-catalog-react@1.15.0 + +### Minor Changes + +- 1ffb9f3: Update `EntityKindFilter` to include a `label` field with the properly capitalized Kind facet string +- ceaf602: Sort EntityTypePicker by default + +### Patch Changes + +- d97a2cd: Fixed an issue causing the `EntityOwnerPicker` to reset scrolling when more elements are loaded. +- c36bd35: Internal refactor to break potential circular imports +- f18c67d: Fix catalog filtering to allow searching entities by display name +- 95092a6: Fixed an issue where `` would re-render its children on page load for smaller screens, potentially leading to unnecessary additional backend requests. +- 4a43398: 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. +- Updated dependencies + - @backstage/catalog-client@1.9.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-test-utils@0.2.4 + - @backstage/integration-react@1.2.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-permission-react@0.4.29 + +## @backstage/plugin-devtools-backend@0.5.0 + +### Minor Changes + +- c781a9a: **BREAKING** Removed support for what is known as the legacy backend, please use the New Backend System. + +### Patch Changes + +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-devtools-common@0.1.14 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-events-backend@0.4.0 + +### Minor Changes + +- 384e494: Internal updates to generated code. + +### 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.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/backend-openapi-utils@0.4.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-notifications@0.5.0 + +### Minor Changes + +- fc15b77: Switched to using the new `/notifications` endpoints. Be sure to update the `notifications` plugin backend before deploying this frontend plugin change. + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-signals-react@0.0.8 + +## @backstage/plugin-notifications-backend@0.5.0 + +### Minor Changes + +- fc15b77: **BREAKING**: Removed redundant `/health` endpoint, switch to using [the built-in endpoint instead](https://backstage.io/docs/backend-system/core-services/root-health). + +### Patch Changes + +- fc15b77: Deprecated root '/' endpoints, moving them under `/notifications` instead. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-notifications-node@0.2.10 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-signals-node@0.1.15 + +## @backstage/plugin-scaffolder-backend@1.28.0 + +### Minor Changes + +- c05a343: Emit scaffolder events using the optional `EventsService` + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 3c62a50: Experimental support for `formDecorators` to enable secret collection and mutations to the parameters for scaffolder tasks +- 6c326cf: The --no-node-snapshot check needs to be done against process.execArgv instead of process.argv +- e913fdf: Add github backend module to create-app and improve error messages +- 8f59dc5: Add fs:readdir to scaffolder startup +- 0851834: Resolved an issue where the `templateManagementPermission` was not being exposed through the `/permissions/metadata` endpoint. +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4 + - @backstage/integration@1.16.0 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.5 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.4 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.4 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.4 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.7.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 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-search-backend@1.8.0 + +### Minor Changes + +- 384e494: Internal updates to generated code. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/backend-openapi-utils@0.4.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-techdocs@1.12.0 + +### Minor Changes + +- e153ca6: Add pagination support to TechDocs Index Page and make it the default + +### 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/plugin-catalog-react@1.15.0 + - @backstage/integration@1.16.0 + - @backstage/plugin-search-react@1.8.4 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-techdocs-common@0.1.0 + - @backstage/plugin-techdocs-react@1.2.12 + +## @backstage/app-defaults@1.5.15 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.15.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-permission-react@0.4.29 + +## @backstage/backend-dynamic-feature-service@0.5.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/backend-app-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/cli-node@0.2.11 + - @backstage/plugin-events-backend@0.4.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-app-node@0.1.28 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/catalog-model@1.7.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## @backstage/cli@0.29.4 + +### 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 +- 3c3a7e6: Revert `css-loader@v7` bump +- 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. +- 62a9062: Updated dependency `@module-federation/enhanced` to `^0.8.0`. +- 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. +- a49030a: Add support for `--output-file` option from ESLint to `package lint` and `repo lint` commands. +- 96331fa: Enhance the behavior of the experimental support for module federation in the backstage CLI, + by using the `package.json` exports (when present) to complete the list of exposed modules. + This allows, for example, using exported `alpha` definitions through module federation. +- 5c9cc05: Use native fetch instead of node-fetch +- dcd99d2: added experimental RSPack support for build command in the repo scope +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/release-manifests@0.0.12 + - @backstage/cli-node@0.2.11 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/eslint-plugin@0.1.10 + - @backstage/types@1.2.0 + +## @backstage/cli-node@0.2.11 + +### Patch Changes + +- af665ea: add PackageManager and Lockfile interfaces for future use +- cbfc69e: Internal refactor +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/types@1.2.0 + +## @backstage/config@1.3.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## @backstage/config-loader@1.9.3 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/core-app-api@1.15.3 + +### Patch Changes + +- e5fa018: The OAuth 2 client implementations will now attempt to refresh the session when the existing session doesn't have the required scopes. The previous behavior was to only try to refresh the session of it was missing, and otherwise directly request a new session. This fixes an issue where some auth providers will not return access tokens with certain scopes unless explicitly requested, leading to an auth popup even if the underlying session already had been granted the requested scopes. +- 2830689: Decrease OAuth2 token refresh grace period +- Updated dependencies + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-compat-api@0.3.4 + +### Patch Changes + +- 1f30730: Updated dependency `@oriflame/backstage-plugin-score-card` to `^0.9.0`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-plugin-api@1.10.2 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-components@0.16.2 + +### Patch Changes + +- e47be38: Added data-testid to placeholder rendered by Progress component to simplify assertions in tests +- Updated dependencies + - @backstage/theme@0.6.3 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-plugin-api@1.10.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/create-app@0.5.23 + +### 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`. +- e913fdf: Add github backend module to create-app and improve error messages +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## @backstage/dev-utils@1.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/core-app-api@1.15.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + +## @backstage/errors@1.2.6 + +### Patch Changes + +- 1d4b5b9: Trim `error.cause.stack` in addition to `error.stack` when trimming stack traces from serialized errors. +- Updated dependencies + - @backstage/types@1.2.0 + +## @backstage/frontend-app-api@0.10.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.15.3 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-defaults@0.1.4 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/frontend-defaults@0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-app@0.1.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/frontend-app-api@0.10.3 + +## @backstage/frontend-plugin-api@0.9.3 + +### Patch Changes + +- 5f04976: Fixed a bug that caused missing code in published packages. +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/frontend-test-utils@0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-app@0.1.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/config@1.3.1 + - @backstage/frontend-app-api@0.10.3 + - @backstage/test-utils@1.7.3 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/integration-aws-node@0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/integration-react@1.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + +## @backstage/release-manifests@0.0.12 + +### Patch Changes + +- 2e140dc: Switch to native fetch for loading release manifests +- b29eaea: Allow overriding the fetch function used inside getManifestByVersion + +## @techdocs/cli@1.8.24 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-techdocs-node@1.12.15 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + +## @backstage/test-utils@1.7.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.15.3 + - @backstage/theme@0.6.3 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-permission-react@0.4.29 + +## @backstage/theme@0.6.3 + +### Patch Changes + +- 5f04976: Fixed a bug that caused missing code in published packages. + +## @backstage/plugin-api-docs@0.12.2 + +### Patch Changes + +- 11babd9: Fix link styling in ProvidedApisCard component so it aligns with other card components. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-catalog@1.26.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-react@0.4.29 + +## @backstage/plugin-app@0.1.4 + +### 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 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-permission-react@0.4.29 + +## @backstage/plugin-app-backend@0.4.3 + +### Patch Changes + +- 74c3f2a: Fixed a bug where config would not be injected on the `/` and `/index.html` paths. +- 5c9cc05: Use native fetch instead of node-fetch +- d66fa80: Fix root route handling when query parameters are present +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-app-node@0.1.28 + +## @backstage/plugin-app-node@0.1.28 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/config-loader@1.9.3 + +## @backstage/plugin-app-visualizer@0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + +## @backstage/plugin-auth-backend@0.24.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 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1 + - @backstage/plugin-auth-backend-module-google-provider@0.2.3 + - @backstage/errors@1.2.6 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3 + - @backstage/plugin-auth-backend-module-auth0-provider@0.1.3 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3 + - @backstage/plugin-auth-backend-module-oidc-provider@0.3.3 + - @backstage/plugin-auth-backend-module-okta-provider@0.1.3 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-auth0-provider@0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.1 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + +## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## @backstage/plugin-auth-backend-module-github-provider@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-google-provider@0.2.3 + +### Patch Changes + +- 79b055a: Pass through `includeGrantedScopes` in order to persist scopes across refresh calls +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-guest-provider@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.1 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-okta-provider@0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/config@1.3.1 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/catalog-model@1.7.2 + +## @backstage/plugin-auth-node@0.5.5 + +### Patch Changes + +- c907440: Improved error forwarding for OAuth refresh endpoints +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/catalog-client@1.9.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-auth-react@0.1.10 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/core-plugin-api@1.10.2 + +## @backstage/plugin-bitbucket-cloud-common@0.2.26 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + +## @backstage/plugin-catalog-backend-module-aws@0.4.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-kubernetes-common@0.9.1 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/backend-openapi-utils@0.4.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.4.3 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + - @backstage/plugin-catalog-common@1.1.2 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-kubernetes-common@0.9.1 + +## @backstage/plugin-catalog-backend-module-gerrit@0.2.5 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-catalog-backend-module-github@0.7.8 + +### Patch Changes + +- 468bbcc: Pass in a default schedule to the `GithubEntityProvider` if none is provided +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.7.8 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.6.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.6.1 + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- cce9cae: Deprecate old-backend-system `IncrementalCatalogBuilder` +- fe87fbf: Add task metrics as two gauges that track the last start and end timestamps as epoch seconds. +- 5aa44d2: Wire up the events together in the new backend system +- d42ecb0: Remove backend-common package from incremental-ingestion plugin and update related code +- 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-defaults@0.6.0 + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-catalog-backend-module-logs@0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + +## @backstage/plugin-catalog-backend-module-msgraph@0.6.5 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.5 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-catalog-common@1.1.2 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.5.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.6 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-catalog-common@1.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-catalog-graph@0.4.14 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-catalog-import@0.12.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/integration@1.16.0 + - @backstage/catalog-client@1.9.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-catalog-common@1.1.2 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + +## @backstage/plugin-catalog-unprocessed-entities-common@0.0.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-config-schema@0.1.63 + +### Patch Changes + +- c36bd35: Internal refactor to break potential circular imports +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-devtools@0.1.22 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-devtools-common@0.1.14 + - @backstage/plugin-permission-react@0.4.29 + +## @backstage/plugin-devtools-common@0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-events-backend-module-aws-sqs@0.4.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-events-backend-module-azure@0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + +## @backstage/plugin-events-backend-module-gerrit@0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + +## @backstage/plugin-events-backend-module-github@0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-events-backend-module-gitlab@0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-events-backend-test-utils@0.1.39 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.6 + +## @backstage/plugin-events-node@0.4.6 + +### 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.1.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## @backstage/plugin-home@0.8.3 + +### 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) + +- 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-catalog-react@1.15.0 + - @backstage/core-app-api@1.15.3 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-home-react@0.1.21 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + +## @backstage/plugin-home-react@0.1.21 + +### 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 + - @backstage/core-plugin-api@1.10.2 + +## @backstage/plugin-kubernetes@0.12.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-kubernetes-common@0.9.1 + - @backstage/plugin-kubernetes-react@0.5.2 + +## @backstage/plugin-kubernetes-backend@0.19.1 + +### Patch Changes + +- cbfc69e: Create a `dev/index.ts` entrypoint for `yarn start` +- 928db6a: Support fetch pod metrics with custom resources +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/errors@1.2.6 + - @backstage/plugin-kubernetes-node@0.2.1 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-kubernetes-cluster@0.0.20 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-kubernetes-common@0.9.1 + - @backstage/plugin-kubernetes-react@0.5.2 + +## @backstage/plugin-kubernetes-common@0.9.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-kubernetes-node@0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/catalog-model@1.7.2 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1 + +## @backstage/plugin-kubernetes-react@0.5.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1 + +## @backstage/plugin-notifications-backend-module-email@0.3.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-notifications-node@0.2.10 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7 + +## @backstage/plugin-notifications-common@0.0.7 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1 + +## @backstage/plugin-notifications-node@0.2.10 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-signals-node@0.1.15 + +## @backstage/plugin-org@0.6.34 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-catalog-common@1.1.2 + +## @backstage/plugin-org-react@0.1.33 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + +## @backstage/plugin-permission-backend@0.5.52 + +### Patch Changes + +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-permission-common@0.8.3 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-permission-node@0.8.6 + +### Patch Changes + +- b149e2a: The `createPermissionIntegrationRouter` function now detects and prevents the exposure of duplicate permissions. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-permission-react@0.4.29 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-proxy-backend@0.5.9 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder@1.27.2 + +### 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`. +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/integration@1.16.0 + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/plugin-scaffolder-react@1.14.2 + - @backstage/catalog-client@1.9.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-react@0.4.29 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.5 + +### Patch Changes + +- 5f04976: Fixed a bug that caused missing code in published packages. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4 + +### Patch Changes + +- c4ffd13: Added the autocomplete feature to GitlabRepoUrlPicker +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-scaffolder-backend-module-github@0.5.4 + +### Patch Changes + +- 7df6179: adding requiredLinearHistory property for branch protection settings +- b5e002b: Change `github:environment:create` action to request and use a token when resolving reviewer entity refs from the Backstage catalog. +- e913fdf: Add github backend module to create-app and improve error messages +- 973dd6f: Minor spell fix in action parameters +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/catalog-client@1.9.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/plugin-notifications-node@0.2.10 + - @backstage/plugin-notifications-common@0.0.7 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.4 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/types@1.2.0 + - @backstage/plugin-scaffolder-node-test-utils@0.1.17 + +## @backstage/plugin-scaffolder-common@1.5.8 + +### 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.2 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-scaffolder-node@0.6.2 + +### Patch Changes + +- c4ffd13: Added the autocomplete feature to GitlabRepoUrlPicker +- 1a23421: Make sure that isomorphic git push commands are not proxied. +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-node-test-utils@0.1.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@1.2.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-react@1.14.2 + +### 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 +- 28e286f: Added test coverage selectors to TemplateCard and its sub-components +- c846d76: Updated dependency `flatted` to `3.3.2`. +- 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`. +- 97a13ad: Improve performance of typing into scaffolder secret widget +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- 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.15.0 + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/catalog-client@1.9.0 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-permission-react@0.4.29 + +## @backstage/plugin-search@1.4.21 + +### Patch Changes + +- d311c84: Use Select from core-components and update Lifecycle filter to use Select instead checkboxes. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-search-react@1.8.4 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-module-catalog@0.2.6 + +### Patch Changes + +- ed0aaec: Update README +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-module-elasticsearch@1.6.3 + +### Patch Changes + +- 991c9fe: Update the ElasticSearchSearchEngine translator to handle phrase searches. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-module-explore@0.2.6 + +### Patch Changes + +- ed0aaec: Update README +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/config@1.3.1 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-module-pg@0.5.39 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/config@1.3.1 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/config@1.3.1 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-module-techdocs@0.3.4 + +### Patch Changes + +- ed0aaec: Update README +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-techdocs-node@1.12.15 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-node@1.3.6 + +### Patch Changes + +- 5ae8a2c: Removed unnecessary dependency on `@backstage/backend-defaults`. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-common@1.2.16 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-search-react@1.8.4 + +### 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 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-signals@0.0.14 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8 + +## @backstage/plugin-signals-backend@0.2.4 + +### Patch Changes + +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-node@0.1.15 + +## @backstage/plugin-signals-node@0.1.15 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-signals-react@0.0.8 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.43 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/core-app-api@1.15.3 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-search-react@1.8.4 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/test-utils@1.7.3 + - @backstage/plugin-techdocs-react@1.2.12 + +## @backstage/plugin-techdocs-backend@1.11.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.4 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-techdocs-node@1.12.15 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-techdocs-react@1.2.12 + +## @backstage/plugin-techdocs-node@1.12.15 + +### Patch Changes + +- 5f04976: Fixed a bug that caused missing code in published packages. +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-react@1.2.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/version-bridge@1.0.10 + +## @backstage/plugin-user-settings@0.8.17 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/core-app-api@1.15.3 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8 + - @backstage/plugin-user-settings-common@0.0.1 + +## @backstage/plugin-user-settings-backend@0.2.28 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-node@0.1.15 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.104 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/cli@0.29.4 + - @backstage/plugin-home@0.8.3 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/core-app-api@1.15.3 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-scaffolder-react@1.14.2 + - @backstage/plugin-scaffolder@1.27.2 + - @backstage/plugin-search-react@1.8.4 + - @backstage/plugin-search@1.4.21 + - @backstage/plugin-notifications@0.5.0 + - @backstage/theme@0.6.3 + - @backstage/plugin-api-docs@0.12.2 + - @backstage/core-components@0.16.2 + - @backstage/plugin-catalog-graph@0.4.14 + - @backstage/plugin-catalog-import@0.12.8 + - @backstage/plugin-kubernetes@0.12.2 + - @backstage/plugin-kubernetes-cluster@0.0.20 + - @backstage/plugin-org@0.6.34 + - @backstage/plugin-user-settings@0.8.17 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-app-api@0.10.3 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-devtools@0.1.22 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19 + - @backstage/plugin-techdocs-react@1.2.12 + +## example-app-next@0.0.18 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/cli@0.29.4 + - @backstage/plugin-home@0.8.3 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/core-app-api@1.15.3 + - @backstage/plugin-app@0.1.4 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-scaffolder-react@1.14.2 + - @backstage/plugin-scaffolder@1.27.2 + - @backstage/plugin-search-react@1.8.4 + - @backstage/plugin-search@1.4.21 + - @backstage/plugin-notifications@0.5.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/plugin-api-docs@0.12.2 + - @backstage/core-components@0.16.2 + - @backstage/plugin-catalog-graph@0.4.14 + - @backstage/plugin-catalog-import@0.12.8 + - @backstage/plugin-kubernetes@0.12.2 + - @backstage/plugin-kubernetes-cluster@0.0.20 + - @backstage/plugin-org@0.6.34 + - @backstage/plugin-user-settings@0.8.17 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-app-api@0.10.3 + - @backstage/frontend-defaults@0.1.4 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-app-visualizer@0.1.14 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19 + - @backstage/plugin-techdocs-react@1.2.12 + +## app-next-example-plugin@0.0.18 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + +## example-backend@0.0.33 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0 + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4 + - @backstage/plugin-auth-backend@0.24.1 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.4 + - @backstage/plugin-search-backend-module-catalog@0.2.6 + - @backstage/plugin-search-backend-module-explore@0.2.6 + - @backstage/plugin-app-backend@0.4.3 + - @backstage/plugin-events-backend@0.4.0 + - @backstage/plugin-search-backend@1.8.0 + - @backstage/plugin-permission-backend@0.5.52 + - @backstage/plugin-devtools-backend@0.5.0 + - @backstage/plugin-signals-backend@0.2.4 + - @backstage/plugin-notifications-backend@0.5.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/plugin-techdocs-backend@1.11.4 + - @backstage/plugin-proxy-backend@0.5.9 + - @backstage/plugin-kubernetes-backend@0.19.1 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3 + - @backstage/plugin-catalog-backend-module-openapi@0.2.5 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.3 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5 + +## example-backend-legacy@0.2.105 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0 + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/integration@1.16.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.6.3 + - @backstage/plugin-auth-backend@0.24.1 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.4 + - @backstage/plugin-search-backend-module-catalog@0.2.6 + - @backstage/plugin-search-backend-module-explore@0.2.6 + - @backstage/plugin-app-backend@0.4.3 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-events-backend@0.4.0 + - @backstage/plugin-search-backend@1.8.0 + - @backstage/plugin-permission-backend@0.5.52 + - @backstage/plugin-signals-backend@0.2.4 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/plugin-techdocs-backend@1.11.4 + - @backstage/plugin-proxy-backend@0.5.9 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4 + - @backstage/plugin-kubernetes-backend@0.19.1 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.4 + - @backstage/plugin-search-backend-module-pg@0.5.39 + - @backstage/plugin-signals-node@0.1.15 + +## e2e-test@0.2.23 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.23 + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + +## @internal/frontend@0.0.4 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @internal/scaffolder@0.0.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.2 + - @backstage/frontend-plugin-api@0.9.3 + +## techdocs-cli-embedded-app@0.2.103 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.29.4 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/core-app-api@1.15.3 + - @backstage/plugin-catalog@1.26.0 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/test-utils@1.7.3 + - @backstage/plugin-techdocs-react@1.2.12 + +## yarn-plugin-backstage@0.0.4 + +### Patch Changes + +- 48cc7c5: Use yarn's built-in http utilities for fetching release manifests +- ac91864: Switch to using `reduceDependency` hook to replace `backstage:^` versions. This + makes the same yarn.lock file valid whether or not the plugin is installed. +- ee49cb4: Fixed path resolution on windows +- Updated dependencies + - @backstage/release-manifests@0.0.12 + - @backstage/cli-common@0.1.15 + +## @internal/plugin-todo-list@1.0.34 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + +## @internal/plugin-todo-list-backend@1.0.34 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + +## @internal/plugin-todo-list-common@1.0.23 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3 diff --git a/docs/releases/v1.34.0-next.2-changelog.md b/docs/releases/v1.34.0-next.2-changelog.md new file mode 100644 index 0000000000..7be3b11c59 --- /dev/null +++ b/docs/releases/v1.34.0-next.2-changelog.md @@ -0,0 +1,2268 @@ +# Release v1.34.0-next.2 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.34.0-next.2](https://backstage.github.io/upgrade-helper/?to=1.34.0-next.2) + +## @backstage/backend-app-api@1.1.0-next.2 + +### Minor Changes + +- ebf083d: Service factories added by feature loaders now have lower priority and will be ignored if a factory for the same service is added directly by `backend.add(serviceFactory)`. + +### Patch Changes + +- 0e9c9fa: As soon as a backend termination signal is received, call before shutting down root lifecycle hooks. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/backend-defaults@0.6.0-next.2 + +### Minor Changes + +- fd5d337: 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. + +- 3f34ea9: Throttles Bitbucket Server API calls + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 57e0b11: 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. +- 57e0b11: The default `authServiceFactory` now correctly depends on the plugin scoped `Logger` services rather than the root scoped one. +- 0e9c9fa: Implements the `DefaultRootLifecycleService.addBeforeShutdownHook` method, and updates `DefaultRootHttpRouterService` and `DefaultRootHealthService` to listen to that event to stop accepting traffic and close service connections. +- d0cbd82: Remove use of the `stoppable` library on the `DefaultRootHttpRouterService` as Node's native http server [close](https://nodejs.org/api/http.html#serverclosecallback) method already drains requests. + Also, we pass a new `lifecycleMiddleware` to the `rootHttpRouterServiceFactory` configure function that must be called manually if you don't call `applyDefaults`. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + +## @backstage/backend-openapi-utils@0.4.0-next.2 + +### Minor Changes + +- afcebea: Fixed a Typescript error when trying to use the new OpenAPI server-side generated code. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-catalog@1.26.0-next.2 + +### Minor Changes + +- 25beb82: Adds an optional columns attribute to HasSubdomainsCardProps and changes its default columns +- 39f1abc: Consistent title behaviour across CatalogTable, CursorPaginatedCatalogTable, and OffsetPaginatedCatalogTable. + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + +## @backstage/plugin-catalog-backend@1.29.0-next.2 + +### Minor Changes + +- c1307b4: Implement `/entities` in terms of `queryEntities` to not run into memory and performance problems on large catalogs + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 8013c9c: Perform the by-query count inlined with the main query +- feba9ee: Use a join based strategy for filtering, when having small page sizes +- 1fdb48e: Use a faster count method on pg when computing some metrics +- 0c33465: Implement `/entities/by-name/:kind/:namespace/:name` using `getEntitiesByRefs` +- d93390d: When parsing filters, do not make redundant `anyOf` and `allOf` nodes when there's only a single entry within them +- 24ecea8: Avoid extra ordering in by-query when the user doesn't ask for it +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.3.0-next.2 + +### Minor Changes + +- 3f34ea9: Throttles Bitbucket Server API calls + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.6.0-next.2 + +### Minor Changes + +- 99dce5c: Implemented discovery for top-level groups defined in config.group or if undefined global top-level group in Gitlab + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-notifications@0.5.0-next.2 + +### Minor Changes + +- fc15b77: Switched to using the new `/notifications` endpoints. Be sure to update the `notifications` plugin backend before deploying this frontend plugin change. + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + +## @backstage/plugin-notifications-backend@0.5.0-next.2 + +### Minor Changes + +- fc15b77: **BREAKING**: Removed redundant `/health` endpoint, switch to using [the built-in endpoint instead](https://backstage.io/docs/backend-system/core-services/root-health). + +### Patch Changes + +- fc15b77: Deprecated root '/' endpoints, moving them under `/notifications` instead. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + +## @backstage/app-defaults@1.5.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/backend-dynamic-feature-service@0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-app-node@0.1.28-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/backend-plugin-api@1.1.0-next.2 + +### Patch Changes + +- 0e9c9fa: The `RootLifecycleService` now has a new `addBeforeShutdownHook` method, and hooks added through this method will run immediately when a termination event is received. + + The backend will not proceed with the shutdown and run the `Shutdown` hooks until all `BeforeShutdown` hooks have completed. + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/backend-test-utils@1.2.0-next.2 + +### Patch Changes + +- 0e9c9fa: Mock the new `RootLifecycleService.addBeforeShutdownHook` method. +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/catalog-client@1.9.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + +## @backstage/catalog-model@1.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + +## @backstage/cli@0.29.3-next.2 + +### Patch Changes + +- 62a9062: Updated dependency `@module-federation/enhanced` to `^0.8.0`. +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/eslint-plugin@0.1.10 + - @backstage/integration@1.16.0-next.1 + - @backstage/release-manifests@0.0.12-next.1 + - @backstage/types@1.2.0 + +## @backstage/cli-node@0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/types@1.2.0 + +## @backstage/config@1.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + +## @backstage/config-loader@1.9.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/core-app-api@1.15.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-compat-api@0.3.4-next.2 + +### Patch Changes + +- 1f30730: Updated dependency `@oriflame/backstage-plugin-score-card` to `^0.9.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-components@0.16.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-plugin-api@1.10.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/create-app@0.5.23-next.2 + +### Patch Changes + +- e913fdf: Add github backend module to create-app and improve error messages +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## @backstage/dev-utils@1.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + +## @backstage/errors@1.2.6-next.0 + +### Patch Changes + +- 1d4b5b9: Trim `error.cause.stack` in addition to `error.stack` when trimming stack traces from serialized errors. +- Updated dependencies + - @backstage/types@1.2.0 + +## @backstage/frontend-app-api@0.10.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-defaults@0.1.4-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/frontend-defaults@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-app@0.1.4-next.2 + +## @backstage/frontend-plugin-api@0.9.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/frontend-test-utils@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-app@0.1.4-next.2 + +## @backstage/integration@1.16.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + +## @backstage/integration-aws-node@0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + +## @backstage/integration-react@1.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/repo-tools@0.12.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + +## @techdocs/cli@1.8.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + +## @backstage/test-utils@1.7.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/plugin-api-docs@0.12.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/plugin-app@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/plugin-app-backend@0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-app-node@0.1.28-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-app-node@0.1.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/config-loader@1.9.3-next.1 + +## @backstage/plugin-app-visualizer@0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + +## @backstage/plugin-auth-backend@0.24.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-auth0-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-oidc-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-okta-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1-next.2 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-google-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-auth0-provider@0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-google-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-okta-provider@0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + +## @backstage/plugin-auth-node@0.5.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-auth-react@0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + +## @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-catalog-backend-module-aws@0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-catalog-backend-module-github@0.7.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-backend-module-github@0.7.8-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-backend-module-gitlab@0.6.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.6.1-next.2 + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- d42ecb0: Remove backend-common package from incremental-ingestion plugin and update related code +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-catalog-backend-module-ldap@0.11.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-logs@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-catalog-backend-module-msgraph@0.6.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.6-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-catalog-common@1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-catalog-graph@0.4.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-catalog-import@0.12.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-catalog-node@1.15.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-catalog-react@1.14.3-next.2 + +### Patch Changes + +- 95092a6: Fixed an issue where `` would re-render its children on page load for smaller screens, potentially leading to unnecessary additional backend requests. +- 4a43398: 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. +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/frontend-test-utils@0.2.4-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + +## @backstage/plugin-catalog-unprocessed-entities-common@0.0.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-config-schema@0.1.63-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-devtools@0.1.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-devtools-common@0.1.14-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + +## @backstage/plugin-devtools-backend@0.5.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-devtools-common@0.1.14-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-devtools-common@0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-events-backend@0.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-events-backend-module-aws-sqs@0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-events-backend-module-azure@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-events-backend-module-gerrit@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-events-backend-module-github@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-events-backend-module-gitlab@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-events-backend-test-utils@0.1.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.6-next.2 + +## @backstage/plugin-events-node@0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-home@0.8.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-home-react@0.1.21-next.2 + +## @backstage/plugin-home-react@0.1.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + +## @backstage/plugin-kubernetes@0.12.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-kubernetes-react@0.5.2-next.2 + +## @backstage/plugin-kubernetes-backend@0.19.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-kubernetes-node@0.2.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-kubernetes-cluster@0.0.20-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-kubernetes-react@0.5.2-next.2 + +## @backstage/plugin-kubernetes-common@0.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-kubernetes-node@0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + +## @backstage/plugin-kubernetes-react@0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + +## @backstage/plugin-notifications-backend-module-email@0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + +## @backstage/plugin-notifications-common@0.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-notifications-node@0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + +## @backstage/plugin-org@0.6.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## @backstage/plugin-org-react@0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + +## @backstage/plugin-permission-backend@0.5.52-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-permission-common@0.8.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-permission-node@0.8.6-next.2 + +### Patch Changes + +- b149e2a: The `createPermissionIntegrationRouter` function now detects and prevents the exposure of duplicate permissions. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-permission-react@0.4.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-proxy-backend@0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder@1.27.2-next.2 + +### Patch Changes + +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + +## @backstage/plugin-scaffolder-backend@1.28.0-next.2 + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 6c326cf: The --no-node-snapshot check needs to be done against process.execArgv instead of process.argv +- e913fdf: Add github backend module to create-app and improve error messages +- 0851834: Resolved an issue where the `templateManagementPermission` was not being exposed through the `/permissions/metadata` endpoint. +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.5-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 + +### Patch Changes + +- e913fdf: Add github backend module to create-app and improve error messages +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/plugin-notifications-common@0.0.7-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/plugin-scaffolder-node-test-utils@0.1.17-next.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-common@1.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-scaffolder-node@0.6.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + +## @backstage/plugin-scaffolder-node-test-utils@0.1.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@1.2.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-react@1.14.2-next.2 + +### Patch Changes + +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + +## @backstage/plugin-search@1.4.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + +## @backstage/plugin-search-backend@1.8.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-explore@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-pg@0.5.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-backend-node@1.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-search-common@1.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## @backstage/plugin-search-react@1.8.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16-next.0 + +## @backstage/plugin-signals@0.0.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + +## @backstage/plugin-signals-backend@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-signals-node@0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-signals-react@0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-techdocs@1.11.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-techdocs-common@0.1.0 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.43-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## @backstage/plugin-techdocs-backend@1.11.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## @backstage/plugin-techdocs-node@1.12.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-react@1.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/plugin-user-settings@0.8.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + - @backstage/plugin-user-settings-common@0.0.1 + +## @backstage/plugin-user-settings-backend@0.2.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.104-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-notifications@0.5.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/plugin-scaffolder@1.27.2-next.2 + - @backstage/plugin-api-docs@0.12.2-next.2 + - @backstage/plugin-catalog-graph@0.4.14-next.2 + - @backstage/plugin-catalog-import@0.12.8-next.2 + - @backstage/plugin-org@0.6.34-next.2 + - @backstage/plugin-user-settings@0.8.17-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.2 + - @backstage/plugin-devtools@0.1.22-next.2 + - @backstage/plugin-home@0.8.3-next.2 + - @backstage/plugin-kubernetes@0.12.2-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.20-next.2 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-search@1.4.21-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-signals@0.0.14-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## example-app-next@0.0.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-notifications@0.5.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/plugin-scaffolder@1.27.2-next.2 + - @backstage/plugin-api-docs@0.12.2-next.2 + - @backstage/plugin-catalog-graph@0.4.14-next.2 + - @backstage/plugin-catalog-import@0.12.8-next.2 + - @backstage/plugin-org@0.6.34-next.2 + - @backstage/plugin-user-settings@0.8.17-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-defaults@0.1.4-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-app@0.1.4-next.2 + - @backstage/plugin-app-visualizer@0.1.14-next.2 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.2 + - @backstage/plugin-home@0.8.3-next.2 + - @backstage/plugin-kubernetes@0.12.2-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.20-next.2 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-search@1.4.21-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-signals@0.0.14-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## app-next-example-plugin@0.0.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + +## example-backend@0.0.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0-next.2 + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 + - @backstage/plugin-notifications-backend@0.5.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-app-backend@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 + - @backstage/plugin-devtools-backend@0.5.0-next.2 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-kubernetes-backend@0.19.1-next.2 + - @backstage/plugin-proxy-backend@0.5.9-next.2 + - @backstage/plugin-search-backend@1.8.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-signals-backend@0.2.4-next.2 + - @backstage/plugin-techdocs-backend@1.11.4-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 + - @backstage/plugin-permission-backend@0.5.52-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.2 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.6-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## example-backend-legacy@0.2.105-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0-next.2 + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-app-backend@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-kubernetes-backend@0.19.1-next.2 + - @backstage/plugin-proxy-backend@0.5.9-next.2 + - @backstage/plugin-search-backend@1.8.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-signals-backend@0.2.4-next.2 + - @backstage/plugin-techdocs-backend@1.11.4-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-permission-backend@0.5.52-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.4-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.6-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.39-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## e2e-test@0.2.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.23-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + +## @internal/frontend@0.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## @internal/scaffolder@0.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + +## techdocs-cli-embedded-app@0.2.103-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## @internal/plugin-todo-list@1.0.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + +## @internal/plugin-todo-list-backend@1.0.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## @internal/plugin-todo-list-common@1.0.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3-next.0 diff --git a/docs/releases/v1.34.0.md b/docs/releases/v1.34.0.md new file mode 100644 index 0000000000..cb7b8af1f3 --- /dev/null +++ b/docs/releases/v1.34.0.md @@ -0,0 +1,101 @@ +--- +id: v1.34.0 +title: v1.34.0 +description: Backstage Release v1.34.0 +--- + +These are the release notes for the v1.34.0 release of [Backstage](https://backstage.io/). + +A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done. + +## Highlights + +### **BREAKING**: New version of `keyv`, Redis + +Our builtin core cache service is based on `keyv`, whose redis integration has been upgraded. This fixes issues that the old version had especially in relation to redis sets. If you were setting `useRedisSets: false`, note that the layout of your key space may be slightly affected after this change. + +Contributed by [@eipc16](https://github.com/eipc16) in [#27716](https://github.com/backstage/backstage/pull/27716), and more information can be found within that changeset. + +### **BREAKING**: Route change for notifications + +If you are interacting directly with the `notifications` backend plugin API, it now no longer uses the `/` root route but rather a `/notifications` sub-route. This aligns it with our standards. The old routes are still available in the notifications backend, but the frontend will use the new routes. + +### **BREAKING**: Scaffolder Gitlab module + +We’ve upgraded to the most recent version of the `gitbeaker` library that speaks to Gitlab. In doing so, the `scopes` parameter of the `gitlab:projectDeployToken:create` action is no longer optional, so you will have to pass it a value (for example `['read_repository']`). + +### Catalog performance improvements + +Since last month’s release, we have been putting a lot of focus on catalog performance, scouring through the metrics and improving several standout peaks. Among other things you may find that provider `’delta’` mutations as well as some API calls are significantly faster. + +There is also a new experimental `catalog.disableRelationsCompatibility` configuration option that, when set to `true`, avoids JSON deserialization and serialization if possible when reading entities. This significantly reduces the memory usage of the catalog, and slightly increases performance, but it removes the backwards compatibility processing that ensures that both `entity.relation[].target` and `entity.relation[].targetRef` are present in returned entities. Do let us know if you find any problems in case you feel adventurous and enable this flag! Just be aware that the API response shape does change slightly if you do, as outlined above. + +### Direct Google CloudSQL Postgres support + +You can now connect directly to your Google CloudSQL Postgres databases with IAM auth, without having to use sidecars or similar proxies. Update your `backend.database.connection`: + +```yaml +connection: + type: cloudsql + instance: my-project:europe-west1:a-db-instance + # ... other settings +``` + +### New integration: Azure blob storage + +Azure blob storage is now better supported, both in terms of a low level integration package addition, as well as gaining a catalog entity provider that can read directly out of your storages. Head [straight to the docs](https://backstage.io/docs/integrations/azure/discovery) if this sounds interesting. + +Contributed by [@Nikunj0601](https://github.com/Nikunj0601) in [#27850](https://github.com/backstage/backstage/pull/27850) + +### Lifecycle and health + +The default readiness endpoint now immediately starts returning HTTP 503 errors when the process is asked to shut down. Pairing this with the `backend.lifecycle.serverShutdownDelay` configuration option allows you to let your ingress detect the impending shutdown and drain traffic gracefully before the service finally stops. This helps with zero-downtime deployments. + +On the path to implementing that, the `coreServices.rootLifecycle` service gained a new `addBeforeShutdownHook` method whose registered hooks will run immediately when a termination signal is received. The backend will not proceed with the shutdown and run the regular `Shutdown` hooks until all `BeforeShutdown` hooks have completed. + +If you were using the `startupRequestPauseTimeout` setting of the lifecycle service in code, you should now instead set it in the `backend.lifecycle.startupRequestPauseTimeout` config, next to the one mentioned above. + +### Bitbucket API throttling + +The Bitbucket integration (URL reader and catalog provider) now apply throttling to outgoing requests, to avoid hitting rate limits. Let us know how it affected your service! + +Contributed by [@kjjuno](https://github.com/kjjuno) in [#27850](https://github.com/backstage/backstage/pull/27850) + +### Support for custom service-to-service tokens + +Do you have a pre-existing service-to-service auth scheme that you would like Backstage installations to leverage instead of only the native Backstage tokens? There’s now a plugin token handler decorator interface that allows for injecting yourself in just the right spot in the auth chain, without having to reimplement the whole `auth` core service. It’s all [covered in the docs](https://backstage.io/docs/next/auth/service-to-service-auth#adding-custom-or-logic-for-validation-and-issuing-of-tokens)! + +### Further improvements to the yarn plugin + +The [yarn plugin](https://backstage.io/docs/getting-started/keeping-backstage-updated) received a number of updates, making it more conformant with yarn semantics. It now works better behind corporate proxies and uses an improved way of persisting resolutions in the lockfile. On top of it all, its on-disk footprint was reduced massively. + +If you use the classical `yarn backstage-cli versions:bump` command, it now also ensures that the installed plugin itself stays updated with the latest and greatest without any further action on your part. + +Contributed by [@mtlewis](https://github.com/mtlewis) over several pull requests. + +### Removing `node-fetch` in the backend + +[ADR014](https://backstage.io/docs/next/architecture-decisions/adrs-adr014) replaces its predecessor ADR to recommend using native `undici`-based `fetch` instead of `node-fetch` in all backend packages. As a result we have almost entirely performed that shift in our core libraries and plugins, and recommend that plugin authors and adopters do the same when they can. + +This change should not be noticeable for most adopters. If you see any ill effects of it, please report it to the maintainers. + +## Security Fixes + +This release does not contain any security fixes. + +## 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.34.0-changelog.md) +- Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) + +Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.35.0-next.0-changelog.md b/docs/releases/v1.35.0-next.0-changelog.md new file mode 100644 index 0000000000..5c912ebce1 --- /dev/null +++ b/docs/releases/v1.35.0-next.0-changelog.md @@ -0,0 +1,1592 @@ +# Release v1.35.0-next.0 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.35.0-next.0](https://backstage.github.io/upgrade-helper/?to=1.35.0-next.0) + +## @backstage/backend-defaults@0.7.0-next.0 + +### Minor Changes + +- ec547b8: Ensure that an error handler middleware exists at the end of each plugin `httpRouter` handler chain. This makes it so that exceptions thrown by plugin routes are caught and encoded in the standard error format. + + If you were using the standard `MiddlewareFactory` just to put an `error` middleware in you router, you can now remove that at your earliest convenience since it's redundant. If you have custom error handlers in your plugin router, those will continue to function as previously. If you were relying on thrown errors propagating all the way down to the root HTTP router, you will find that they no longer do that, and may want to hoist your error handling up to the plugin level instead. + +### Patch Changes + +- 575613f: Go back to using `node-fetch` for gitlab +- 8ecf8cb: Exclude `@backstage/backend-common` from schema collection if `@backstage/backend-defaults` is present +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/backend-app-api@1.1.1-next.0 + - @backstage/config-loader@1.9.5-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.11 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-catalog-backend@1.30.0-next.0 + +### Minor Changes + +- dd515e3: Removed the long-deprecated `DefaultCatalogCollatorFactory` and `DefaultCatalogCollatorFactoryOptions` exports, which now no longer exist in the search plugin's offerings. If you were using these, you want to migrate to [the new backend system](https://backstage.io/docs/backend-system/) and use the [catalog collator](https://backstage.io/docs/features/search/collators#catalog) directly. + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- be0aae7: Improved concurrency of the `entities` endpoint when using the streamed query mode behind the `catalog.disableRelationsCompatibility` flag. +- 3d475a0: Updated condition in `resolveCodeOwner` to fix a bug where `normalizeCodeOwner` could potentially be called with an invalid argument causing an error in `CodeOwnersProcessor` +- Updated dependencies + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/backend-openapi-utils@0.4.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-scaffolder-backend@1.29.0-next.0 + +### Minor Changes + +- 5d9e5c8: Added the ability to use `${{ context.task.id }}` in nunjucks templating, as well as `ctx.task.id` in actions to get the current task ID. + +### Patch Changes + +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.6-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.1-next.0 + - @backstage/plugin-scaffolder-common@1.5.8 + +## @backstage/plugin-search-backend-module-catalog@0.3.0-next.0 + +### Minor Changes + +- dd515e3: **BREAKING**: Removed support for the old backend system. Please [migrate to the new backend system](https://backstage.io/docs/backend-system/) and enable [the catalog collator](https://backstage.io/docs/features/search/collators#catalog) there. + + As part of this, the `/alpha` export path is gone too. Just import the module from the root of the package as usual instead. + +### Patch Changes + +- 1e09b06: Internal refactor to use cursor based pagination +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/backend-app-api@1.1.1-next.0 + +### Patch Changes + +- 02534c7: Corrected spelling mistake in error message +- Updated dependencies + - @backstage/config-loader@1.9.5-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## @backstage/backend-dynamic-feature-service@0.5.3-next.0 + +### Patch Changes + +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-app-api@1.1.1-next.0 + - @backstage/config-loader@1.9.5-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-events-backend@0.4.1-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.11 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-app-node@0.1.29-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/backend-openapi-utils@0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## @backstage/backend-plugin-api@1.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/backend-test-utils@1.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/backend-app-api@1.1.1-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/cli@0.29.5-next.0 + +### Patch Changes + +- e937ce0: Fixed incompatible `@typescript-eslint` versions with current `eslint@8.x.x` +- Updated dependencies + - @backstage/config-loader@1.9.5-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.11 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/eslint-plugin@0.1.10 + - @backstage/integration@1.16.0 + - @backstage/release-manifests@0.0.12 + - @backstage/types@1.2.0 + +## @backstage/config-loader@1.9.5-next.0 + +### Patch Changes + +- 8ecf8cb: Exclude `@backstage/backend-common` from schema collection if `@backstage/backend-defaults` is present +- Updated dependencies + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## @backstage/create-app@0.5.24-next.0 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## @backstage/repo-tools@0.12.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.9.5-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.11 + - @backstage/errors@1.2.6 + +## @techdocs/cli@1.8.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/plugin-techdocs-node@1.12.16-next.0 + +## @backstage/plugin-app-backend@0.4.4-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/config-loader@1.9.5-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-app-node@0.1.29-next.0 + +## @backstage/plugin-app-node@0.1.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.9.5-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend@0.24.2-next.0 + +### Patch Changes + +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.4-next.0 + - @backstage/plugin-auth-backend-module-auth0-provider@0.1.4-next.0 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.2-next.0 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.4-next.0 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.4-next.0 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.4-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-google-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.4-next.0 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-oidc-provider@0.3.4-next.0 + - @backstage/plugin-auth-backend-module-okta-provider@0.1.4-next.0 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.4-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-auth0-provider@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + +## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/errors@1.2.6 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## @backstage/plugin-auth-backend-module-github-provider@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-google-provider@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-guest-provider@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/errors@1.2.6 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-okta-provider@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-onelogin-provider@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + +## @backstage/plugin-auth-node@0.5.6-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## @backstage/plugin-catalog-backend-module-aws@0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.1 + +## @backstage/plugin-catalog-backend-module-azure@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.4.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration@1.16.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.1 + +## @backstage/plugin-catalog-backend-module-gerrit@0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.7.9-next.0 + +### Patch Changes + +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.7.9-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.6.1-next.0 + +### Patch Changes + +- 575613f: Go back to using `node-fetch` for gitlab +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.5-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.6.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.6.2-next.0 + +### Patch Changes + +- ec547b8: Remove the error handler middleware, since that is now provided by the framework +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-catalog-backend-module-ldap@0.11.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## @backstage/plugin-catalog-backend-module-logs@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-catalog-backend-module-msgraph@0.6.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.6-next.0 + +### Patch Changes + +- 57e794a: Refactor to no longer use backend-common +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-scaffolder-common@1.5.8 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/errors@1.2.6 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.6 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-catalog-node@1.15.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-devtools-backend@0.5.1-next.0 + +### Patch Changes + +- ec547b8: Remove the error handler middleware, since that is now provided by the framework +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/config-loader@1.9.5-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-devtools-common@0.1.14 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-events-backend@0.4.1-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/backend-openapi-utils@0.4.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-events-backend-module-aws-sqs@0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-events-backend-module-azure@0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-events-backend-module-gerrit@0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-events-backend-module-github@0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-events-backend-module-gitlab@0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-events-backend-test-utils@0.1.40-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-events-node@0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## @backstage/plugin-home@0.8.4-next.0 + +### Patch Changes + +- 7932f1e: Exported `QuickStartCard` component. +- Updated dependencies + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-app-api@1.15.3 + - @backstage/core-compat-api@0.3.4 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-home-react@0.1.21 + +## @backstage/plugin-kubernetes-backend@0.19.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.1 + - @backstage/plugin-kubernetes-node@0.2.2-next.0 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-kubernetes-node@0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1 + +## @backstage/plugin-notifications-backend@0.5.1-next.0 + +### Patch Changes + +- cbc0e63: Remove `@backstage/backend-common` dependency +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-notifications-node@0.2.11-next.0 + - @backstage/plugin-signals-node@0.1.16-next.0 + +## @backstage/plugin-notifications-backend-module-email@0.3.5-next.0 + +### Patch Changes + +- bed5f35: Added more examples of the plugin configuration +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-notifications-node@0.2.11-next.0 + +## @backstage/plugin-notifications-node@0.2.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-signals-node@0.1.16-next.0 + +## @backstage/plugin-permission-backend@0.5.53-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-permission-node@0.8.7-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-permission-common@0.8.3 + +## @backstage/plugin-proxy-backend@0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder@1.27.4-next.0 + +### Patch Changes + +- 3f09ef4: Fix issue with `secrets` not being forwarded properly to the backend when creating a task +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.3-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/core-compat-api@0.3.4 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/errors@1.2.6 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/integration@1.16.0 + - @backstage/integration-react@1.2.2 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-scaffolder-common@1.5.8 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.5-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.7.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-notifications-node@0.2.11-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-scaffolder-node-test-utils@0.1.18-next.0 + +## @backstage/plugin-scaffolder-node@0.6.3-next.0 + +### Patch Changes + +- 5d9e5c8: Added the ability to use `${{ context.task.id }}` in nunjucks templating, as well as `ctx.task.id` in actions to get the current task ID. +- 7dd0013: Deprecate the `logStream` option in `executeShellCommand`, replacing it with a logger instance. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + - @backstage/plugin-scaffolder-common@1.5.8 + +## @backstage/plugin-scaffolder-node-test-utils@0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-test-utils@1.2.1-next.0 + - @backstage/types@1.2.0 + +## @backstage/plugin-scaffolder-react@1.14.3-next.0 + +### Patch Changes + +- 37421bc: Fixed scaffolder form fields not resolving correctly in the `useCustomFieldExtensions` hook. +- Updated dependencies + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-scaffolder-common@1.5.8 + +## @backstage/plugin-search-backend@1.8.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/backend-openapi-utils@0.4.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-module-elasticsearch@1.6.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-module-explore@0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-module-pg@0.5.40-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-search-backend-module-techdocs@0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-techdocs-node@1.12.16-next.0 + +## @backstage/plugin-search-backend-node@1.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## @backstage/plugin-signals-backend@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-signals-node@0.1.16-next.0 + +## @backstage/plugin-signals-node@0.1.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## @backstage/plugin-techdocs-backend@1.11.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + - @backstage/plugin-techdocs-node@1.12.16-next.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.0 + +### Patch Changes + +- b664b2a: Internal refactor for safer handling of possible null value. +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration@1.16.0 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-techdocs-react@1.2.12 + +## @backstage/plugin-techdocs-node@1.12.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-user-settings-backend@0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-node@0.1.16-next.0 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.105-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.8.4-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/plugin-scaffolder-react@1.14.3-next.0 + - @backstage/plugin-scaffolder@1.27.4-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.0 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-app-api@1.15.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-app-api@0.10.3 + - @backstage/integration-react@1.2.2 + - @backstage/theme@0.6.3 + - @backstage/plugin-api-docs@0.12.2 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-graph@0.4.14 + - @backstage/plugin-catalog-import@0.12.8 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-devtools@0.1.22 + - @backstage/plugin-kubernetes@0.12.2 + - @backstage/plugin-kubernetes-cluster@0.0.20 + - @backstage/plugin-notifications@0.5.0 + - @backstage/plugin-org@0.6.34 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search@1.4.21 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-search-react@1.8.4 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/plugin-techdocs-react@1.2.12 + - @backstage/plugin-user-settings@0.8.17 + +## example-app-next@0.0.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.8.4-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/plugin-scaffolder-react@1.14.3-next.0 + - @backstage/plugin-scaffolder@1.27.4-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.0 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-app-api@1.15.3 + - @backstage/core-compat-api@0.3.4 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-app-api@0.10.3 + - @backstage/frontend-defaults@0.1.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/integration-react@1.2.2 + - @backstage/theme@0.6.3 + - @backstage/plugin-api-docs@0.12.2 + - @backstage/plugin-app@0.1.4 + - @backstage/plugin-app-visualizer@0.1.14 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-graph@0.4.14 + - @backstage/plugin-catalog-import@0.12.8 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-kubernetes@0.12.2 + - @backstage/plugin-kubernetes-cluster@0.0.20 + - @backstage/plugin-notifications@0.5.0 + - @backstage/plugin-org@0.6.34 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search@1.4.21 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-search-react@1.8.4 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/plugin-techdocs-react@1.2.12 + - @backstage/plugin-user-settings@0.8.17 + +## example-backend@0.0.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-openapi@0.2.6-next.0 + - @backstage/plugin-devtools-backend@0.5.1-next.0 + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-scaffolder-backend@1.29.0-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.0 + - @backstage/plugin-permission-backend@0.5.53-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-events-backend@0.4.1-next.0 + - @backstage/plugin-app-backend@0.4.4-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/plugin-notifications-backend@0.5.1-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.4-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.4-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.4-next.0 + - @backstage/plugin-kubernetes-backend@0.19.2-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.4-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-proxy-backend@0.5.10-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.6-next.0 + - @backstage/plugin-search-backend@1.8.1-next.0 + - @backstage/plugin-search-backend-module-explore@0.2.7-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-signals-backend@0.2.5-next.0 + - @backstage/plugin-techdocs-backend@1.11.5-next.0 + +## example-backend-legacy@0.2.106-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-scaffolder-backend@1.29.0-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.0 + - @backstage/plugin-permission-backend@0.5.53-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-events-backend@0.4.1-next.0 + - @backstage/plugin-app-backend@0.4.4-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.4-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-kubernetes-backend@0.19.2-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-proxy-backend@0.5.10-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.5-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.1-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.5-next.0 + - @backstage/plugin-search-backend@1.8.1-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.6.4-next.0 + - @backstage/plugin-search-backend-module-explore@0.2.7-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.40-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-signals-backend@0.2.5-next.0 + - @backstage/plugin-signals-node@0.1.16-next.0 + - @backstage/plugin-techdocs-backend@1.11.5-next.0 + +## e2e-test@0.2.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.24-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/errors@1.2.6 + +## @internal/scaffolder@0.0.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.3-next.0 + - @backstage/frontend-plugin-api@0.9.3 + +## techdocs-cli-embedded-app@0.2.104-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.29.5-next.0 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-app-api@1.15.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/test-utils@1.7.3 + - @backstage/theme@0.6.3 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/plugin-techdocs-react@1.2.12 + +## @internal/plugin-todo-list-backend@1.0.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 diff --git a/docs/releases/v1.35.0-next.1-changelog.md b/docs/releases/v1.35.0-next.1-changelog.md new file mode 100644 index 0000000000..c3e89a862b --- /dev/null +++ b/docs/releases/v1.35.0-next.1-changelog.md @@ -0,0 +1,2619 @@ +# Release v1.35.0-next.1 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.35.0-next.1](https://backstage.github.io/upgrade-helper/?to=1.35.0-next.1) + +## @backstage/plugin-catalog-backend-module-gitlab@0.6.2-next.0 + +# @backstage/plugin-catalog-backend-module-gitlab + +## 0.6.1-next.0 + +### Patch Changes + +- 575613f: Go back to using `node-fetch` for gitlab +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.6.0 + +### Minor Changes + +- 99dce5c: Implemented discovery for top-level groups defined in config.group or if undefined global top-level group in Gitlab + +### Patch Changes + +- 191e5bf: `restrictUsersToGroup` should use the entire group path when getting members +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + +## 0.6.0-next.2 + +### Minor Changes + +- 99dce5c: Implemented discovery for top-level groups defined in config.group or if undefined global top-level group in Gitlab + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + +## 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 + +## 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 + +## 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 + +## 0.5.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.5-next.3 + - @backstage/backend-defaults@0.5.3-next.3 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/integration@1.15.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.14.0-next.2 + +## 0.5.0-next.2 + +### Minor Changes + +- 1b5fdd9: Extended the configuration with the `includeArchivedRepos` property, which allows including repositories when the project is archived. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.3-next.2 + - @backstage/plugin-events-node@0.4.5-next.2 + - @backstage/plugin-catalog-node@1.14.0-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/integration@1.15.1 + - @backstage/plugin-catalog-common@1.1.0 + +## 0.4.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/integration@1.15.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.14.0-next.1 + - @backstage/plugin-events-node@0.4.4-next.1 + +## 0.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.3-next.0 + - @backstage/plugin-catalog-node@1.14.0-next.0 + - @backstage/backend-defaults@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/integration@1.15.1 + - @backstage/plugin-catalog-common@1.1.0 + +## 0.4.3 + +### Patch Changes + +- 3109c24: The export for the new backend system at the `/alpha` export is now also available via the main entry point, which means that you can remove the `/alpha` suffix from the import. +- Updated dependencies + - @backstage/backend-defaults@0.5.1 + - @backstage/plugin-events-node@0.4.1 + - @backstage/plugin-catalog-node@1.13.1 + - @backstage/integration@1.15.1 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + +## 0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.2 + - @backstage/plugin-catalog-node@1.13.1-next.1 + - @backstage/integration@1.15.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-events-node@0.4.1-next.1 + +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/integration@1.15.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/integration@1.15.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.1-next.0 + +## 0.4.2 + +### Patch Changes + +- 53b24d9: Internal update to use the new cache manager + +- 0476be3: Add the `relations` array to allow Backstage to mirror GitLab's membership behavior, including descendant, inherited, and shared-from-group memberships. + + The previous `allowInherited` config option will be deprecated in future versions. Use the `relations` array with the `INHERITED` option instead. + + ```yaml + catalog: + providers: + gitlab: + development: + relations: + - INHERITED + ``` + +- d425fc4: Modules, plugins, and services are now `BackendFeature`, not a function that returns a feature. + +- b446954: Remove dependency on backend-common + +- 06cc084: Added a `includeUsersWithoutSeat` config option that allow import of users without a paid seat, e.g. for Gitlab Free on SaaS. Defaults to false + +- Updated dependencies + - @backstage/backend-defaults@0.5.0 + - @backstage/backend-plugin-api@1.0.0 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-node@1.13.0 + - @backstage/integration@1.15.0 + - @backstage/plugin-events-node@0.4.0 + - @backstage/config@1.2.0 + +## 0.4.2-next.2 + +### Patch Changes + +- 0476be3: Add the `relations` array to allow Backstage to mirror GitLab's membership behavior, including descendant, inherited, and shared-from-group memberships. + + The previous `allowInherited` config option will be deprecated in future versions. Use the `relations` array with the `INHERITED` option instead. + + ```yaml + catalog: + providers: + gitlab: + development: + relations: + - INHERITED + ``` + +- Updated dependencies + - @backstage/backend-defaults@0.5.0-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/integration@1.15.0-next.0 + - @backstage/catalog-model@1.6.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.0.26 + - @backstage/plugin-catalog-node@1.12.7-next.2 + - @backstage/plugin-events-node@0.4.0-next.2 + +## 0.4.2-next.1 + +### Patch Changes + +- 53b24d9: Internal update to use the new cache manager +- Updated dependencies + - @backstage/backend-defaults@0.5.0-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/catalog-model@1.6.0 + - @backstage/config@1.2.0 + - @backstage/integration@1.14.0 + - @backstage/plugin-catalog-common@1.0.26 + - @backstage/plugin-catalog-node@1.12.7-next.1 + - @backstage/plugin-events-node@0.4.0-next.1 + +## 0.4.2-next.0 + +### Patch Changes + +- d425fc4: Modules, plugins, and services are now `BackendFeature`, not a function that returns a feature. +- b446954: Remove dependency on backend-common +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/backend-defaults@0.5.0-next.0 + - @backstage/plugin-events-node@0.4.0-next.0 + - @backstage/plugin-catalog-node@1.12.7-next.0 + - @backstage/catalog-model@1.6.0 + - @backstage/config@1.2.0 + - @backstage/integration@1.14.0 + - @backstage/plugin-catalog-common@1.0.26 + +## 0.4.0 + +### Minor Changes + +- fc24d9e: Stop using `@backstage/backend-tasks` as it will be deleted in near future. + +### Patch Changes + +- 93095ee: Make sure node-fetch is version 2.7.0 or greater +- c7b14ed: Adds new optional `excludeRepos` configuration option to the Gitlab catalog provider. +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/backend-common@0.24.0 + - @backstage/plugin-catalog-node@1.12.5 + - @backstage/integration@1.14.0 + - @backstage/catalog-model@1.6.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.0.26 + - @backstage/plugin-events-node@0.3.9 + +## 0.3.22-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/backend-common@0.23.4-next.3 + - @backstage/catalog-model@1.6.0-next.0 + - @backstage/backend-tasks@0.5.28-next.3 + - @backstage/config@1.2.0 + - @backstage/integration@1.14.0-next.0 + - @backstage/plugin-catalog-common@1.0.26-next.2 + - @backstage/plugin-catalog-node@1.12.5-next.3 + - @backstage/plugin-events-node@0.3.9-next.3 + +## 0.3.22-next.2 + +### Patch Changes + +- 93095ee: Make sure node-fetch is version 2.7.0 or greater +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/backend-common@0.23.4-next.2 + - @backstage/backend-tasks@0.5.28-next.2 + - @backstage/plugin-catalog-node@1.12.5-next.2 + - @backstage/plugin-events-node@0.3.9-next.2 + - @backstage/plugin-catalog-common@1.0.26-next.1 + - @backstage/integration@1.14.0-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + +## 0.3.22-next.1 + +### Patch Changes + +- c7b14ed: Adds new optional `excludeRepos` configuration option to the Gitlab catalog provider. +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/backend-common@0.23.4-next.1 + - @backstage/integration@1.14.0-next.0 + - @backstage/plugin-catalog-common@1.0.26-next.0 + - @backstage/plugin-catalog-node@1.12.5-next.1 + - @backstage/backend-tasks@0.5.28-next.1 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/plugin-events-node@0.3.9-next.1 + +## 0.3.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.4-next.0 + - @backstage/plugin-catalog-node@1.12.5-next.0 + - @backstage/integration@1.14.0-next.0 + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/backend-tasks@0.5.28-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.0.25 + - @backstage/plugin-events-node@0.3.9-next.0 + +## 0.3.21 + +### Patch Changes + +- 8db30ad: The Gitlab configuration supports an additional optional boolean key `catalog.providers.gitlab..restrictUsersToGroup`. Setting this to `true` will make Backstage only import users from the group defined in the `group` key, instead of all users in the organisation (self-hosted) or of the root group (SaaS). It will default to false, keeping the original implementation intact, when not explicitly set. +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/backend-common@0.23.3 + - @backstage/backend-tasks@0.5.27 + - @backstage/integration@1.13.0 + - @backstage/plugin-events-node@0.3.8 + - @backstage/plugin-catalog-node@1.12.4 + - @backstage/plugin-catalog-common@1.0.25 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + +## 0.3.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.3-next.1 + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/backend-tasks@0.5.27-next.1 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/integration@1.13.0-next.0 + - @backstage/plugin-catalog-common@1.0.24 + - @backstage/plugin-catalog-node@1.12.4-next.1 + - @backstage/plugin-events-node@0.3.8-next.1 + +## 0.3.20-next.0 + +### Patch Changes + +- 8db30ad: The Gitlab configuration supports an additional optional boolean key `catalog.providers.gitlab..restrictUsersToGroup`. Setting this to `true` will make Backstage only import users from the group defined in the `group` key, instead of all users in the organisation (self-hosted) or of the root group (SaaS). It will default to false, keeping the original implementation intact, when not explicitly set. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/backend-common@0.23.2-next.0 + - @backstage/backend-tasks@0.5.26-next.0 + - @backstage/integration@1.13.0-next.0 + - @backstage/plugin-catalog-node@1.12.3-next.0 + - @backstage/plugin-events-node@0.3.7-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.0.24 + +## 0.3.18 + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- 150fc77: Fixed an issue in `GitlabOrgDiscoveryEntityProvider` where a missing `orgEnabled` config key was throwing an error. +- f271164: Fixed an issue in `GitlabDiscoveryEntityProvider` where the fallback branch was taking precedence over the GitLab default branch. +- Updated dependencies + - @backstage/backend-common@0.23.0 + - @backstage/backend-plugin-api@0.6.19 + - @backstage/backend-tasks@0.5.24 + - @backstage/integration@1.12.0 + - @backstage/plugin-catalog-node@1.12.1 + - @backstage/plugin-events-node@0.3.5 + - @backstage/plugin-catalog-common@1.0.24 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + +## 0.3.18-next.3 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/integration@1.12.0-next.1 + - @backstage/plugin-catalog-common@1.0.24-next.0 + - @backstage/plugin-catalog-node@1.12.1-next.2 + - @backstage/plugin-events-node@0.3.5-next.2 + - @backstage/backend-tasks@0.5.24-next.3 + - @backstage/backend-common@0.23.0-next.3 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + +## 0.3.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/backend-common@0.23.0-next.2 + - @backstage/integration@1.12.0-next.0 + - @backstage/backend-tasks@0.5.24-next.2 + - @backstage/plugin-catalog-node@1.12.1-next.1 + - @backstage/plugin-events-node@0.3.5-next.1 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.0.23 + +## 0.3.17-next.1 + +### Patch Changes + +- 150fc77: Fixed an issue in `GitlabOrgDiscoveryEntityProvider` where a missing `orgEnabled` config key was throwing an error. +- f271164: Fixed an issue in `GitlabDiscoveryEntityProvider` where the fallback branch was taking precedence over the GitLab default branch. +- Updated dependencies + - @backstage/backend-tasks@0.5.24-next.1 + - @backstage/backend-plugin-api@0.6.19-next.1 + - @backstage/backend-common@0.23.0-next.1 + - @backstage/plugin-catalog-node@1.12.1-next.0 + - @backstage/plugin-events-node@0.3.5-next.0 + +## 0.3.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.24-next.0 + - @backstage/backend-common@0.22.1-next.0 + - @backstage/plugin-events-node@0.3.5-next.0 + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-catalog-node@1.12.1-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/integration@1.11.0 + - @backstage/plugin-catalog-common@1.0.23 + +## 0.3.16 + +### Patch Changes + +- a70377d: Added events support for `GitlabDiscoveryEntityProvider` and `GitlabOrgDiscoveryEntityProvider`. +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0 + - @backstage/catalog-model@1.5.0 + - @backstage/backend-common@0.22.0 + - @backstage/backend-plugin-api@0.6.18 + - @backstage/backend-tasks@0.5.23 + - @backstage/plugin-events-node@0.3.4 + - @backstage/integration@1.11.0 + - @backstage/plugin-catalog-common@1.0.23 + +## 0.3.15-next.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## 0.3.15-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.1 + - @backstage/backend-tasks@0.5.23-next.1 + - @backstage/plugin-events-node@0.3.4-next.1 + - @backstage/plugin-catalog-node@1.11.2-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.3.15-next.2 + +### Patch Changes + +- a70377d: Added events support for `GitlabDiscoveryEntityProvider` and `GitlabOrgDiscoveryEntityProvider`. +- Updated dependencies + - @backstage/catalog-model@1.5.0-next.0 + - @backstage/backend-common@0.21.8-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/plugin-catalog-common@1.0.23-next.0 + - @backstage/plugin-catalog-node@1.11.2-next.0 + - @backstage/backend-tasks@0.5.23-next.0 + - @backstage/config@1.2.0 + - @backstage/integration@1.10.0 + - @backstage/plugin-events-node@0.3.4-next.0 + +## 0.3.15 + +### Patch Changes + +- d5a1fe1: Replaced winston logger with `LoggerService` +- Updated dependencies + - @backstage/backend-common@0.21.7 + - @backstage/backend-plugin-api@0.6.17 + - @backstage/backend-tasks@0.5.22 + - @backstage/integration@1.10.0 + - @backstage/plugin-catalog-node@1.11.1 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + +## 0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/backend-tasks@0.5.22-next.1 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/integration@1.10.0-next.0 + - @backstage/plugin-catalog-node@1.11.1-next.1 + +## 0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.0 + - @backstage/integration@1.10.0-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/backend-tasks@0.5.22-next.0 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-node@1.11.1-next.0 + +## 0.3.14 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.11.0 + - @backstage/backend-common@0.21.6 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/backend-tasks@0.5.21 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/integration@1.9.1 + +## 0.3.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.10.0 + - @backstage/backend-common@0.21.5 + - @backstage/backend-tasks@0.5.20 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/integration@1.9.1 + +## 0.3.12 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.9.0 + +## 0.3.11 + +### Patch Changes + +- 0fb419b: Updated dependency `uuid` to `^9.0.0`. + Updated dependency `@types/uuid` to `^9.0.0`. +- 9f5b8bc: Add GitLab `visibility` to group entity annotations. +- Updated dependencies + - @backstage/backend-common@0.21.4 + - @backstage/integration@1.9.1 + - @backstage/config@1.2.0 + - @backstage/backend-plugin-api@0.6.14 + - @backstage/plugin-catalog-node@1.8.0 + - @backstage/backend-tasks@0.5.19 + - @backstage/catalog-model@1.4.5 + +## 0.3.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.9.1-next.2 + - @backstage/backend-common@0.21.4-next.2 + - @backstage/plugin-catalog-node@1.8.0-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/backend-tasks@0.5.19-next.2 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/config@1.2.0-next.1 + +## 0.3.11-next.1 + +### Patch Changes + +- 9f5b8bc: Add GitLab `visibility` to group entity annotations. +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/backend-tasks@0.5.19-next.1 + - @backstage/integration@1.9.1-next.1 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/plugin-catalog-node@1.8.0-next.1 + +## 0.3.10-next.0 + +### Patch Changes + +- 0fb419b: Updated dependency `uuid` to `^9.0.0`. + Updated dependency `@types/uuid` to `^9.0.0`. +- Updated dependencies + - @backstage/backend-common@0.21.3-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + - @backstage/plugin-catalog-node@1.8.0-next.0 + - @backstage/backend-tasks@0.5.18-next.0 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/config@1.1.2-next.0 + - @backstage/integration@1.9.1-next.0 + +## 0.3.7 + +### Patch Changes + +- 60e4c2a: Added the option to provide custom `groupTransformer`, `userTransformer` and `groupNameTransformer` to allow custom transformations of groups and users +- Updated dependencies + - @backstage/backend-common@0.21.0 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/backend-tasks@0.5.15 + - @backstage/catalog-model@1.4.4 + - @backstage/integration@1.9.0 + - @backstage/plugin-catalog-node@1.7.0 + - @backstage/config@1.1.1 + +## 0.3.7-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.3 + - @backstage/integration@1.9.0-next.1 + - @backstage/backend-tasks@0.5.15-next.3 + - @backstage/plugin-catalog-node@1.6.2-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/config@1.1.1 + +## 0.3.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/backend-tasks@0.5.15-next.2 + - @backstage/plugin-catalog-node@1.6.2-next.2 + - @backstage/config@1.1.1 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/integration@1.9.0-next.0 + +## 0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-common@0.21.0-next.1 + - @backstage/integration@1.9.0-next.0 + - @backstage/backend-tasks@0.5.15-next.1 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-node@1.6.2-next.1 + +## 0.3.7-next.0 + +### Patch Changes + +- 60e4c2a: Added the option to provide custom `groupTransformer`, `userTransformer` and `groupNameTransformer` to allow custom transformations of groups and users +- Updated dependencies + - @backstage/backend-common@0.21.0-next.0 + - @backstage/backend-tasks@0.5.15-next.0 + - @backstage/plugin-catalog-node@1.6.2-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + +## 0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + +## 0.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## 0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.1 + - @backstage/integration@1.8.0 + - @backstage/config@1.1.1 + - @backstage/backend-tasks@0.5.14-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-catalog-node@1.6.1-next.1 + +## 0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.0 + - @backstage/plugin-catalog-node@1.6.1-next.0 + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/backend-tasks@0.5.14-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + +## 0.3.5 + +### Patch Changes + +- cc4228e: Switched module ID to use kebab-case. +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/plugin-catalog-node@1.6.0 + - @backstage/backend-tasks@0.5.13 + - @backstage/integration@1.8.0 + - @backstage/backend-plugin-api@0.6.8 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + +## 0.3.5-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/backend-tasks@0.5.13-next.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0-next.1 + - @backstage/plugin-catalog-node@1.6.0-next.3 + +## 0.3.5-next.2 + +### Patch Changes + +- cc4228e: Switched module ID to use kebab-case. +- Updated dependencies + - @backstage/plugin-catalog-node@1.6.0-next.2 + - @backstage/backend-common@0.20.0-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + - @backstage/backend-tasks@0.5.13-next.2 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0-next.1 + +## 0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.8.0-next.1 + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/backend-tasks@0.5.13-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-node@1.5.1-next.1 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/backend-tasks@0.5.13-next.0 + - @backstage/integration@1.8.0-next.0 + - @backstage/plugin-catalog-node@1.5.1-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + +## 0.3.4 + +### Patch Changes + +- d732f17610: Added try catch around fetching gitlab group users to prevent refresh from failing completely while only a select number of groups might not be able to load correctly. +- 0873a43ac1: Resolved a bug affecting the retrieval of users from group members. By appending '/all' to the API call, we now include members from all inherited groups, as per Gitlab's API specifications. This change is reflected in the listSaaSUsers function. +- Updated dependencies + - @backstage/plugin-catalog-node@1.5.0 + - @backstage/integration@1.7.2 + - @backstage/backend-common@0.19.9 + - @backstage/backend-plugin-api@0.6.7 + - @backstage/backend-tasks@0.5.12 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + +## 0.3.4-next.2 + +### Patch Changes + +- [#20893](https://github.com/backstage/backstage/pull/20893) [`0873a43ac1`](https://github.com/backstage/backstage/commit/0873a43ac1557901b21dfa6f8534bbbfc73dc444) Thanks [@pushit-tech](https://github.com/pushit-tech)! - Resolved a bug affecting the retrieval of users from group members. By appending '/all' to the API call, we now include members from all inherited groups, as per Gitlab's API specifications. This change is reflected in the listSaaSUsers function. + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/backend-common@0.19.9-next.2 + - @backstage/backend-tasks@0.5.12-next.2 + - @backstage/plugin-catalog-node@1.5.0-next.2 + +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.5.0-next.1 + - @backstage/integration@1.7.2-next.0 + - @backstage/backend-common@0.19.9-next.1 + - @backstage/backend-tasks@0.5.12-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + +## 0.3.4-next.0 + +### Patch Changes + +- d732f17610: Added try catch around fetching gitlab group users to prevent refresh from failing completely while only a select number of groups might not be able to load correctly. +- Updated dependencies + - @backstage/backend-common@0.19.9-next.0 + - @backstage/integration@1.7.1 + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/backend-tasks@0.5.12-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-node@1.4.8-next.0 + +## 0.3.3 + +### Patch Changes + +- 4f70fdfc93: fix: use REST API to get root group memberships for GitLab SaaS users listing + + This API is the only one that shows `email` field for enterprise users and + allows to filter out bot users not using a license using the `is_using_seat` + field. + + We also added the annotation `gitlab.com/saml-external-uid` taking the value + of `group_saml_identity.extern_uid` of the `groups/:group-id/members` endpoint + response. This is useful in case you want to create a `SignInResolver` that + references the user with the id of your identity provider (e.g. OneLogin). + + ref: + + + + +- 890e3b5ad4: Make sure to include the error message when ingestion fails + +- 0b55f773a7: Removed some unused dependencies + +- 6ae7f12abb: Make sure the archived projects are skipped with the Gitlab API + +- Updated dependencies + - @backstage/backend-tasks@0.5.11 + - @backstage/backend-common@0.19.8 + - @backstage/integration@1.7.1 + - @backstage/plugin-catalog-node@1.4.7 + - @backstage/catalog-model@1.4.3 + - @backstage/backend-plugin-api@0.6.6 + - @backstage/config@1.1.1 + +## 0.3.3-next.2 + +### Patch Changes + +- 4f70fdfc93: fix: use REST API to get root group memberships for GitLab SaaS users listing + + This API is the only one that shows `email` field for enterprise users and + allows to filter out bot users not using a license using the `is_using_seat` + field. + + We also added the annotation `gitlab.com/saml-external-uid` taking the value + of `group_saml_identity.extern_uid` of the `groups/:group-id/members` endpoint + response. This is useful in case you want to create a `SignInResolver` that + references the user with the id of your identity provider (e.g. OneLogin). + + ref: + + + + +- 0b55f773a7: Removed some unused dependencies + +- Updated dependencies + - @backstage/backend-common@0.19.8-next.2 + - @backstage/catalog-model@1.4.3-next.0 + - @backstage/integration@1.7.1-next.1 + - @backstage/backend-tasks@0.5.11-next.2 + - @backstage/plugin-catalog-node@1.4.7-next.2 + - @backstage/backend-plugin-api@0.6.6-next.2 + - @backstage/config@1.1.1-next.0 + +## 0.3.2-next.1 + +### Patch Changes + +- 6ae7f12abb: Make sure the archived projects are skipped with the Gitlab API +- Updated dependencies + - @backstage/backend-tasks@0.5.10-next.1 + - @backstage/plugin-catalog-node@1.4.6-next.1 + - @backstage/backend-common@0.19.7-next.1 + - @backstage/backend-plugin-api@0.6.5-next.1 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.1-next.0 + - @backstage/types@1.1.1 + +## 0.3.2-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.3.0 + +### Minor Changes + +- 3d73bafd85c9: Fix Gitlab.com user ingestion by scoping GitlabOrgDiscoveryEntityProvider to a group. + + **BREAKING** The `group` parameter is now required Gitlab.com Org Data integrations and the backend will fail to start without this option configured. + + ```diff + catalog: + providers: + gitlab: + yourProviderId: + host: gitlab.com + orgEnabled: true + + group: org/teams + ``` + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## 0.3.0-next.3 + +### Minor Changes + +- 3d73bafd85c9: Fix Gitlab.com user ingestion by scoping GitlabOrgDiscoveryEntityProvider to a group. + + **BREAKING** The `group` parameter is now required Gitlab.com Org Data integrations and the backend will fail to start without this option configured. + + ```diff + catalog: + providers: + gitlab: + yourProviderId: + host: gitlab.com + orgEnabled: true + + group: org/teams + ``` + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/catalog-model@1.4.2-next.2 + - @backstage/config@1.1.0-next.2 + - @backstage/errors@1.2.2-next.0 + - @backstage/integration@1.7.0-next.3 + - @backstage/types@1.1.1-next.0 + - @backstage/backend-plugin-api@0.6.3-next.3 + - @backstage/backend-common@0.19.5-next.3 + - @backstage/backend-tasks@0.5.8-next.3 + - @backstage/plugin-catalog-node@1.4.4-next.3 + +## 0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.1 + - @backstage/backend-tasks@0.5.8-next.2 + - @backstage/backend-common@0.19.5-next.2 + - @backstage/plugin-catalog-node@1.4.4-next.2 + - @backstage/integration@1.7.0-next.2 + - @backstage/backend-plugin-api@0.6.3-next.2 + - @backstage/catalog-model@1.4.2-next.1 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.0 + - @backstage/integration@1.7.0-next.1 + - @backstage/backend-tasks@0.5.8-next.1 + - @backstage/backend-common@0.19.5-next.1 + - @backstage/backend-plugin-api@0.6.3-next.1 + - @backstage/catalog-model@1.4.2-next.0 + - @backstage/plugin-catalog-node@1.4.4-next.1 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.4-next.0 + - @backstage/integration@1.7.0-next.0 + - @backstage/backend-tasks@0.5.7-next.0 + - @backstage/backend-plugin-api@0.6.2-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-node@1.4.3-next.0 + +## 0.2.4 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- e6c721439f37: Added option to skip forked repos in GitlabDiscoveryEntityProvider +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- 2fe1f5973ff7: Filter Gitlab archived projects through APIs +- Updated dependencies + - @backstage/backend-common@0.19.2 + - @backstage/backend-plugin-api@0.6.0 + - @backstage/plugin-catalog-node@1.4.1 + - @backstage/integration@1.6.0 + - @backstage/backend-tasks@0.5.5 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.2.4-next.2 + +### Patch Changes + +- 2fe1f5973ff7: Filter Gitlab archived projects through APIs +- Updated dependencies + - @backstage/backend-plugin-api@0.6.0-next.2 + - @backstage/backend-tasks@0.5.5-next.2 + - @backstage/backend-common@0.19.2-next.2 + - @backstage/plugin-catalog-node@1.4.1-next.2 + +## 0.2.4-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- e6c721439f37: Added option to skip forked repos in GitlabDiscoveryEntityProvider +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.0 + - @backstage/backend-plugin-api@0.5.5-next.0 + - @backstage/backend-tasks@0.5.5-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/integration@1.5.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-node@1.4.1-next.0 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1 + - @backstage/backend-common@0.19.1 + - @backstage/plugin-catalog-node@1.4.0 + - @backstage/backend-plugin-api@0.5.4 + - @backstage/backend-tasks@0.5.4 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/integration@1.5.1 + - @backstage/types@1.1.0 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1-next.0 + - @backstage/backend-common@0.19.1-next.0 + - @backstage/plugin-catalog-node@1.4.0-next.0 + - @backstage/backend-plugin-api@0.5.4-next.0 + - @backstage/backend-tasks@0.5.4-next.0 + - @backstage/catalog-model@1.4.1-next.0 + - @backstage/config@1.0.8 + - @backstage/integration@1.5.1-next.0 + - @backstage/types@1.1.0 + +## 0.2.2 + +### Patch Changes + +- f31fd1f8fd98: Fixed bug that caused ingestion errors when a user's name or profile picture is undefined. +- 66261b4ab441: Added option to skip forked repos +- 571f78ed0ea7: Fix getGroupMembers with token that don't have sufficient permissions +- Updated dependencies + - @backstage/backend-common@0.19.0 + - @backstage/types@1.1.0 + - @backstage/integration@1.5.0 + - @backstage/catalog-model@1.4.0 + - @backstage/errors@1.2.0 + - @backstage/backend-plugin-api@0.5.3 + - @backstage/backend-tasks@0.5.3 + - @backstage/plugin-catalog-node@1.3.7 + - @backstage/config@1.0.8 + +## 0.2.2-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.2 + - @backstage/catalog-model@1.4.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.2 + - @backstage/backend-tasks@0.5.3-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.2.0-next.0 + - @backstage/integration@1.5.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.7-next.2 + +## 0.2.2-next.2 + +### Patch Changes + +- f31fd1f8fd98: Fixed bug that caused ingestion errors when a user's name or profile picture is undefined. +- 66261b4ab441: Added option to skip forked repos +- Updated dependencies + - @backstage/config@1.0.7 + +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.3.7-next.0 + - @backstage/backend-common@0.18.6-next.0 + - @backstage/integration@1.4.5 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.3-next.0 + - @backstage/backend-tasks@0.5.3-next.0 + - @backstage/catalog-model@1.3.0 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.2.1 + +### Patch Changes + +- b12c41fafc4: Fix a corner case where returned users are null for bots +- Updated dependencies + - @backstage/backend-common@0.18.5 + - @backstage/integration@1.4.5 + - @backstage/backend-tasks@0.5.2 + - @backstage/plugin-catalog-node@1.3.6 + - @backstage/backend-plugin-api@0.5.2 + - @backstage/catalog-model@1.3.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.1 + - @backstage/backend-tasks@0.5.2-next.1 + - @backstage/plugin-catalog-node@1.3.6-next.1 + - @backstage/backend-plugin-api@0.5.2-next.1 + - @backstage/config@1.0.7 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.0 + - @backstage/integration@1.4.5-next.0 + - @backstage/backend-tasks@0.5.2-next.0 + - @backstage/plugin-catalog-node@1.3.6-next.0 + - @backstage/backend-plugin-api@0.5.2-next.0 + - @backstage/catalog-model@1.3.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.2.0 + +### Minor Changes + +- f64345108a0: **BREAKING**: The configuration of the `GitlabDiscoveryEntityProvider` has changed as follows: + + - The configuration key `branch` is now used to define the branch from which the catalog-info should be discovered. + - The old configuration key `branch` is now called `fallbackBranch`. This value specifies which branch should be used + if no default branch is defined on the project itself. + + To migrate to the new configuration value, rename `branch` to `fallbackBranch` + +### Patch Changes + +- 7b1b7bfdb7b: The gitlab org data integration now makes use of the GraphQL API to determine + the relationships between imported User and Group entities, effectively making + this integration usable without an administrator account's Personal Access + Token. +- Updated dependencies + - @backstage/backend-common@0.18.4 + - @backstage/backend-tasks@0.5.1 + - @backstage/catalog-model@1.3.0 + - @backstage/integration@1.4.4 + - @backstage/plugin-catalog-node@1.3.5 + - @backstage/backend-plugin-api@0.5.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.2.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.3.0-next.0 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.3 + +## 0.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## 0.2.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## 0.2.0-next.0 + +### Minor Changes + +- f64345108a0: **BREAKING**: The configuration of the `GitlabDiscoveryEntityProvider` has changed as follows: + + - The configuration key `branch` is now used to define the branch from which the catalog-info should be discovered. + - The old configuration key `branch` is now called `fallbackBranch`. This value specifies which branch should be used + if no default branch is defined on the project itself. + + To migrate to the new configuration value, rename `branch` to `fallbackBranch` + +### Patch Changes + +- 7b1b7bfdb7b: The gitlab org data integration now makes use of the GraphQL API to determine + the relationships between imported User and Group entities, effectively making + this integration usable without an administrator account's Personal Access + Token. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## 0.1.14 + +### Patch Changes + +- 90469c02c8c: Renamed `gitlabDiscoveryEntityProviderCatalogModule` to `catalogModuleGitlabDiscoveryEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- af1095f1e11: The configuration key `branch` of the `GitlabDiscoveryEntityProvider` has been deprecated in favor of the configuration key `fallbackBranch`. + It will be reused in future release to enforce a concrete branch to be used in catalog file discovery. + To migrate to the new configuration value, rename `branch` to `fallbackBranch`. +- be129f8f3cd: filter gitlab groups by prefix +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.1.14-next.2 + +### Patch Changes + +- be129f8f3cd: filter gitlab groups by prefix +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## 0.1.14-next.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- af1095f1e11: The configuration key `branch` of the `GitlabDiscoveryEntityProvider` has been deprecated in favor of the configuration key `fallbackBranch`. + It will be reused in future release to enforce a concrete branch to be used in catalog file discovery. + To migrate to the new configuration value, rename `branch` to `fallbackBranch`. +- Updated dependencies + - @backstage/errors@1.1.5-next.0 + - @backstage/backend-common@0.18.3-next.1 + - @backstage/integration@1.4.3-next.0 + - @backstage/plugin-catalog-backend@1.8.0-next.1 + - @backstage/backend-plugin-api@0.4.1-next.1 + - @backstage/backend-tasks@0.4.4-next.1 + - @backstage/config@1.0.7-next.0 + - @backstage/catalog-model@1.2.1-next.1 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.4-next.1 + +## 0.1.14-next.0 + +### Patch Changes + +- 928a12a9b3: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0-next.0 + - @backstage/backend-tasks@0.4.4-next.0 + - @backstage/backend-plugin-api@0.4.1-next.0 + - @backstage/backend-common@0.18.3-next.0 + - @backstage/catalog-model@1.2.1-next.0 + - @backstage/plugin-catalog-node@1.3.4-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## 0.1.13 + +### Patch Changes + +- 49948f644f: The config now consistently uses the term 'instance' to refer to a single GitLab API host. +- 85b04f659a: Internal refactor to not use deprecated `substr` +- 52c5685ceb: Implement Group and User Catalog Provider +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2 + - @backstage/backend-plugin-api@0.4.0 + - @backstage/backend-common@0.18.2 + - @backstage/catalog-model@1.2.0 + - @backstage/plugin-catalog-node@1.3.3 + - @backstage/backend-tasks@0.4.3 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## 0.1.13-next.2 + +### Patch Changes + +- 49948f644f: The config now consistently uses the term 'instance' to refer to a single GitLab API host. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## 0.1.13-next.1 + +### Patch Changes + +- 85b04f659a: Internal refactor to not use deprecated `substr` +- 52c5685ceb: Implement Group and User Catalog Provider +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.3-next.1 + +## 0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## 0.1.11 + +### Patch Changes + +- 9f2b786fc9: Provide context for logged errors. +- 8e06f3cf00: Switched imports of `loggerToWinstonLogger` to `@backstage/backend-common`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + - @backstage/backend-common@0.18.0 + - @backstage/catalog-model@1.1.5 + - @backstage/backend-tasks@0.4.1 + - @backstage/plugin-catalog-node@1.3.1 + - @backstage/plugin-catalog-backend@1.7.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## 0.1.11-next.2 + +### Patch Changes + +- 9f2b786fc9: Provide context for logged errors. +- 8e06f3cf00: Switched imports of `loggerToWinstonLogger` to `@backstage/backend-common`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0-next.1 + - @backstage/backend-common@0.18.0-next.1 + - @backstage/backend-tasks@0.4.1-next.1 + - @backstage/plugin-catalog-backend@1.7.0-next.2 + - @backstage/plugin-catalog-node@1.3.1-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/types@1.0.2 + +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-catalog-backend@1.7.0-next.1 + - @backstage/plugin-catalog-node@1.3.1-next.1 + - @backstage/backend-tasks@0.4.1-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/types@1.0.2 + +## 0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-backend@1.7.0-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/backend-plugin-api@0.2.0 + - @backstage/backend-tasks@0.4.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.1-next.0 + +## 0.1.10 + +### Patch Changes + +- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`. +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.6.0 + - @backstage/backend-common@0.17.0 + - @backstage/plugin-catalog-node@1.3.0 + - @backstage/backend-tasks@0.4.0 + - @backstage/errors@1.1.4 + - @backstage/backend-plugin-api@0.2.0 + - @backstage/integration@1.4.1 + - @backstage/types@1.0.2 + - @backstage/catalog-model@1.1.4 + - @backstage/config@1.0.5 + +## 0.1.10-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.6.0-next.3 + - @backstage/backend-tasks@0.4.0-next.3 + - @backstage/backend-common@0.17.0-next.3 + - @backstage/backend-plugin-api@0.2.0-next.3 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/integration@1.4.1-next.1 + - @backstage/types@1.0.2-next.1 + - @backstage/plugin-catalog-node@1.3.0-next.3 + +## 0.1.10-next.2 + +### Patch Changes + +- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.6.0-next.2 + - @backstage/plugin-catalog-node@1.3.0-next.2 + - @backstage/backend-common@0.17.0-next.2 + - @backstage/backend-plugin-api@0.2.0-next.2 + - @backstage/backend-tasks@0.4.0-next.2 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/integration@1.4.1-next.1 + - @backstage/types@1.0.2-next.1 + +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.1 + - @backstage/plugin-catalog-backend@1.6.0-next.1 + - @backstage/backend-tasks@0.4.0-next.1 + - @backstage/types@1.0.2-next.1 + - @backstage/backend-plugin-api@0.1.5-next.1 + - @backstage/plugin-catalog-node@1.2.2-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/integration@1.4.1-next.1 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/errors@1.1.4-next.1 + +## 0.1.10-next.0 + +### Patch Changes + +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.6.0-next.0 + - @backstage/backend-common@0.16.1-next.0 + - @backstage/integration@1.4.1-next.0 + - @backstage/types@1.0.2-next.0 + - @backstage/backend-plugin-api@0.1.5-next.0 + - @backstage/plugin-catalog-node@1.2.2-next.0 + - @backstage/backend-tasks@0.3.8-next.0 + - @backstage/catalog-model@1.1.4-next.0 + - @backstage/config@1.0.5-next.0 + - @backstage/errors@1.1.4-next.0 + +## 0.1.9 + +### Patch Changes + +- 6bb046bcbe: Add `gitlabDiscoveryEntityProviderCatalogModule` (new backend-plugin-api, alpha). + +- 81cedb5033: `GitlabDiscoveryEntityProvider`: Add option to configure schedule via `app-config.yaml` instead of in code. + + Please find how to configure the schedule at the config at + + +- 4c9f7847e4: Updated dependency `msw` to `^0.48.0` while moving it to be a dev dependency. + +- Updated dependencies + - @backstage/backend-common@0.16.0 + - @backstage/plugin-catalog-backend@1.5.1 + - @backstage/integration@1.4.0 + - @backstage/backend-tasks@0.3.7 + - @backstage/catalog-model@1.1.3 + - @backstage/types@1.0.1 + - @backstage/backend-plugin-api@0.1.4 + - @backstage/plugin-catalog-node@1.2.1 + - @backstage/config@1.0.4 + - @backstage/errors@1.1.3 + +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.1 + - @backstage/backend-plugin-api@0.1.4-next.1 + - @backstage/backend-tasks@0.3.7-next.1 + - @backstage/plugin-catalog-backend@1.5.1-next.1 + - @backstage/plugin-catalog-node@1.2.1-next.1 + - @backstage/catalog-model@1.1.3-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/errors@1.1.3-next.0 + - @backstage/integration@1.4.0-next.0 + - @backstage/types@1.0.1-next.0 + +## 0.1.9-next.0 + +### Patch Changes + +- 6bb046bcbe: Add `gitlabDiscoveryEntityProviderCatalogModule` (new backend-plugin-api, alpha). + +- 81cedb5033: `GitlabDiscoveryEntityProvider`: Add option to configure schedule via `app-config.yaml` instead of in code. + + Please find how to configure the schedule at the config at + + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.0 + - @backstage/plugin-catalog-backend@1.5.1-next.0 + - @backstage/integration@1.4.0-next.0 + - @backstage/backend-tasks@0.3.7-next.0 + - @backstage/catalog-model@1.1.3-next.0 + - @backstage/types@1.0.1-next.0 + - @backstage/backend-plugin-api@0.1.4-next.0 + - @backstage/plugin-catalog-node@1.2.1-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/errors@1.1.3-next.0 + +## 0.1.8 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.2 + - @backstage/backend-common@0.15.2 + - @backstage/plugin-catalog-backend@1.5.0 + - @backstage/backend-tasks@0.3.6 + - @backstage/config@1.0.3 + - @backstage/errors@1.1.2 + - @backstage/integration@1.3.2 + - @backstage/types@1.0.0 + +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.5.0-next.2 + - @backstage/backend-tasks@0.3.6-next.2 + - @backstage/backend-common@0.15.2-next.2 + - @backstage/catalog-model@1.1.2-next.2 + - @backstage/config@1.0.3-next.2 + - @backstage/errors@1.1.2-next.2 + - @backstage/integration@1.3.2-next.2 + - @backstage/types@1.0.0 + +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.1 + - @backstage/backend-tasks@0.3.6-next.1 + - @backstage/catalog-model@1.1.2-next.1 + - @backstage/config@1.0.3-next.1 + - @backstage/errors@1.1.2-next.1 + - @backstage/integration@1.3.2-next.1 + - @backstage/types@1.0.0 + - @backstage/plugin-catalog-backend@1.4.1-next.1 + +## 0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.2-next.0 + - @backstage/plugin-catalog-backend@1.4.1-next.0 + - @backstage/backend-common@0.15.2-next.0 + - @backstage/backend-tasks@0.3.6-next.0 + - @backstage/config@1.0.3-next.0 + - @backstage/errors@1.1.2-next.0 + - @backstage/integration@1.3.2-next.0 + - @backstage/types@1.0.0 + +## 0.1.7 + +### Patch Changes + +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- Updated dependencies + - @backstage/backend-common@0.15.1 + - @backstage/integration@1.3.1 + - @backstage/plugin-catalog-backend@1.4.0 + - @backstage/backend-tasks@0.3.5 + - @backstage/catalog-model@1.1.1 + - @backstage/config@1.0.2 + - @backstage/errors@1.1.1 + +## 0.1.7-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.1-next.0 + - @backstage/config@1.0.2-next.0 + - @backstage/errors@1.1.1-next.0 + - @backstage/integration@1.3.1-next.2 + - @backstage/plugin-catalog-backend@1.4.0-next.3 + - @backstage/backend-common@0.15.1-next.3 + - @backstage/backend-tasks@0.3.5-next.1 + +## 0.1.7-next.2 + +### Patch Changes + +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. +- Updated dependencies + - @backstage/backend-common@0.15.1-next.2 + - @backstage/integration@1.3.1-next.1 + - @backstage/plugin-catalog-backend@1.4.0-next.2 + +## 0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.1-next.1 + - @backstage/plugin-catalog-backend@1.4.0-next.1 + +## 0.1.7-next.0 + +### Patch Changes + +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- Updated dependencies + - @backstage/backend-common@0.15.1-next.0 + - @backstage/backend-tasks@0.3.5-next.0 + - @backstage/plugin-catalog-backend@1.3.2-next.0 + - @backstage/integration@1.3.1-next.0 + +## 0.1.6 + +### Patch Changes + +- 24979413a4: Enhancing GitLab provider with filtering projects by pattern RegExp + + ```yaml + providers: + gitlab: + stg: + host: gitlab.stg.company.io + branch: main + projectPattern: 'john/' # new option + entityFilename: template.yaml + ``` + + With the aforementioned parameter you can filter projects, and keep only who belongs to the namespace "john". + +- Updated dependencies + - @backstage/backend-common@0.15.0 + - @backstage/integration@1.3.0 + - @backstage/backend-tasks@0.3.4 + - @backstage/plugin-catalog-backend@1.3.1 + +## 0.1.6-next.1 + +### Patch Changes + +- 24979413a4: Enhancing GitLab provider with filtering projects by pattern RegExp + + ```yaml + providers: + gitlab: + stg: + host: gitlab.stg.company.io + branch: main + projectPattern: 'john/' # new option + entityFilename: template.yaml + ``` + + With the aforementioned parameter you can filter projects, and keep only who belongs to the namespace "john". + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.3.1-next.2 + +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0-next.0 + - @backstage/integration@1.3.0-next.0 + - @backstage/backend-tasks@0.3.4-next.0 + - @backstage/plugin-catalog-backend@1.3.1-next.0 + +## 0.1.5 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. + +- 8006d0f9bf: Updated dependency `msw` to `^0.44.0`. + +- 49ff472c0b: Add the possibility in the `GitlabDiscoveryEntityProvider` to scan the whole project instead of concrete groups. For that, use a configuration like this one, where the group parameter is omitted (not mandatory anymore): + + ```yaml + catalog: + providers: + gitlab: + yourProviderId: + host: gitlab-host # Identifies one of the hosts set up in the integrations + branch: main # Optional. Uses `master` as default + entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` + ``` + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.3.0 + - @backstage/backend-common@0.14.1 + - @backstage/catalog-model@1.1.0 + - @backstage/integration@1.2.2 + - @backstage/backend-tasks@0.3.3 + - @backstage/errors@1.1.0 + +## 0.1.5-next.2 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.3.0-next.3 + - @backstage/backend-common@0.14.1-next.3 + - @backstage/integration@1.2.2-next.3 + - @backstage/backend-tasks@0.3.3-next.3 + - @backstage/catalog-model@1.1.0-next.3 + +## 0.1.5-next.1 + +### Patch Changes + +- 49ff472c0b: Add the possibility in the `GitlabDiscoveryEntityProvider` to scan the whole project instead of concrete groups. For that, use a configuration like this one, where the group parameter is omitted (not mandatory anymore): + + ```yaml + catalog: + providers: + gitlab: + yourProviderId: + host: gitlab-host # Identifies one of the hosts set up in the integrations + branch: main # Optional. Uses `master` as default + entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` + ``` + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.1 + - @backstage/backend-common@0.14.1-next.1 + - @backstage/errors@1.1.0-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.1 + - @backstage/backend-tasks@0.3.3-next.1 + - @backstage/integration@1.2.2-next.1 + +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + +## 0.1.4 + +### Patch Changes + +- eea8126171: Add a new provider `GitlabDiscoveryEntityProvider` as replacement for `GitlabDiscoveryProcessor` + + In order to migrate from the `GitlabDiscoveryProcessor` you need to apply + the following changes: + + **Before:** + + ```yaml + # app-config.yaml + + catalog: + locations: + - type: gitlab-discovery + target: https://company.gitlab.com/prefix/*/catalog-info.yaml + ``` + + ```ts + /* packages/backend/src/plugins/catalog.ts */ + + import { GitlabDiscoveryProcessor } from '@backstage/plugin-catalog-backend-module-gitlab'; + + const builder = await CatalogBuilder.create(env); + /** ... other processors ... */ + builder.addProcessor( + GitLabDiscoveryProcessor.fromConfig(env.config, { logger: env.logger }), + ); + ``` + + **After:** + + ```yaml + # app-config.yaml + + catalog: + providers: + gitlab: + yourProviderId: # identifies your dataset / provider independent of config changes + host: gitlab-host # Identifies one of the hosts set up in the integrations + branch: main # Optional. Uses `master` as default + group: example-group # Group and subgroup (if needed) to look for repositories + entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` + ``` + + ```ts + /* packages/backend/src/plugins/catalog.ts */ + + import { GitlabDiscoveryEntityProvider } from '@backstage/plugin-catalog-backend-module-gitlab'; + + const builder = await CatalogBuilder.create(env); + /** ... other processors and/or providers ... */ + builder.addEntityProvider( + ...GitlabDiscoveryEntityProvider.fromConfig(env.config, { + logger: env.logger, + schedule: env.scheduler.createScheduledTaskRunner({ + frequency: { minutes: 30 }, + timeout: { minutes: 3 }, + }), + }), + ); + ``` + +- bad907d794: The `last_activity_after` timestamp is now being omitted when querying the GitLab API for the first time. + +- 3ac4522537: do not create location object if file with component definition do not exists in project, that decrease count of request to gitlab with 404 status code. Now we can create processor with new flag to enable this logic: + + ```ts + const processor = GitLabDiscoveryProcessor.fromConfig(config, { + logger, + skipReposWithoutExactFileMatch: true, + }); + ``` + + **WARNING:** This new functionality does not support globs in the repo file path + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.2.0 + - @backstage/backend-tasks@0.3.2 + - @backstage/backend-common@0.14.0 + - @backstage/integration@1.2.1 + - @backstage/catalog-model@1.0.3 + +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.0-next.2 + - @backstage/integration@1.2.1-next.2 + - @backstage/plugin-catalog-backend@1.2.0-next.2 + +## 0.1.4-next.1 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- Updated dependencies + - @backstage/backend-common@0.13.6-next.1 + - @backstage/integration@1.2.1-next.1 + - @backstage/plugin-catalog-backend@1.2.0-next.1 + - @backstage/catalog-model@1.0.3-next.0 + +## 0.1.4-next.0 + +### Patch Changes + +- 3ac4522537: do not create location object if file with component definition do not exists in project, that decrease count of request to gitlab with 404 status code. Now we can create processor with new flag to enable this logic: + + ```ts + const processor = GitLabDiscoveryProcessor.fromConfig(config, { + logger, + skipReposWithoutExactFileMatch: true, + }); + ``` + + **WARNING:** This new functionality does not support globs in the repo file path + +- Updated dependencies + - @backstage/backend-common@0.13.6-next.0 + - @backstage/integration@1.2.1-next.0 + - @backstage/plugin-catalog-backend@1.2.0-next.0 + +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3 + - @backstage/plugin-catalog-backend@1.1.2 + - @backstage/integration@1.2.0 + - @backstage/config@1.0.1 + - @backstage/catalog-model@1.0.2 + +## 0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + +## 0.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.0 + - @backstage/integration@1.2.0-next.0 + - @backstage/plugin-catalog-backend@1.1.2-next.0 + +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.1.0 + - @backstage/integration@1.1.0 + - @backstage/catalog-model@1.0.1 + - @backstage/backend-common@0.13.2 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.1.0-next.1 + - @backstage/integration@1.1.0-next.1 + - @backstage/backend-common@0.13.2-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.0.1-next.0 + - @backstage/plugin-catalog-backend@1.0.1-next.0 + - @backstage/backend-common@0.13.2-next.0 + - @backstage/integration@1.0.1-next.0 + +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.0.0 + - @backstage/backend-common@0.13.1 + - @backstage/catalog-model@1.0.0 + - @backstage/integration@1.0.0 + - @backstage/config@1.0.0 + - @backstage/errors@1.0.0 + - @backstage/types@1.0.0 + +## 0.1.0 + +### Minor Changes + +- 66ba5d9023: Added package, moving out GitLab specific functionality from the catalog-backend + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.0 + - @backstage/plugin-catalog-backend@0.24.0 + - @backstage/catalog-model@0.13.0 + +## 0.1.0-next.0 + +### Minor Changes + +- 66ba5d9023: Added package, moving out GitLab specific functionality from the catalog-backend + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.0-next.0 + - @backstage/plugin-catalog-backend@0.24.0-next.0 + - @backstage/catalog-model@0.13.0-next.0 + +## @backstage/plugin-signals-backend@0.3.0-next.1 + +### Minor Changes + +- f59ea1d: Removed support for the old backend system. If you were using the old `createRouter` export, please migrate to [the new backend system](https://backstage.io/docs/backend-system/). + +## @backstage/create-app@0.5.24-next.1 + +### Patch Changes + +- 828c993: Added `-j 2` to `dev` script to help cases where the backend does not start up during local development + +## @backstage/dev-utils@1.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/integration-react@1.2.2 + +## @backstage/plugin-api-docs@0.12.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-catalog@1.26.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## @backstage/plugin-catalog@1.26.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/integration-react@1.2.2 + - @backstage/core-compat-api@0.3.4 + +## @backstage/plugin-catalog-backend-module-msgraph@0.6.6-next.1 + +### Patch Changes + +- 29a4aa8: fix(config): add missing parameters in config schema + +## @backstage/plugin-catalog-graph@0.4.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## @backstage/plugin-catalog-import@0.12.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/integration-react@1.2.2 + - @backstage/core-compat-api@0.3.4 + +## @backstage/plugin-catalog-react@1.15.1-next.0 + +### Patch Changes + +- cbfc0a4: Fixed an issue where the `` in `offset` mode would unnecessarily re-fetch data when the filter didn't change, causing a flicker effect. +- Updated dependencies + - @backstage/integration-react@1.2.2 + - @backstage/core-compat-api@0.3.4 + +## @backstage/plugin-home@0.8.4-next.1 + +### Patch Changes + +- d8f9079: Updated dependency `@rjsf/utils` to `5.23.2`. + Updated dependency `@rjsf/core` to `5.23.2`. + Updated dependency `@rjsf/material-ui` to `5.23.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.2`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-home-react@0.1.22-next.0 + - @backstage/core-compat-api@0.3.4 + +## @backstage/plugin-home-react@0.1.22-next.0 + +### Patch Changes + +- d8f9079: Updated dependency `@rjsf/utils` to `5.23.2`. + Updated dependency `@rjsf/core` to `5.23.2`. + Updated dependency `@rjsf/material-ui` to `5.23.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.2`. + +## @backstage/plugin-kubernetes@0.12.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## @backstage/plugin-kubernetes-cluster@0.0.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + +## @backstage/plugin-org@0.6.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## @backstage/plugin-org-react@0.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + +## @backstage/plugin-scaffolder@1.27.4-next.1 + +### Patch Changes + +- d8f9079: Updated dependency `@rjsf/utils` to `5.23.2`. + Updated dependency `@rjsf/core` to `5.23.2`. + Updated dependency `@rjsf/material-ui` to `5.23.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.2`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-scaffolder-react@1.14.3-next.1 + - @backstage/integration-react@1.2.2 + - @backstage/core-compat-api@0.3.4 + +## @backstage/plugin-scaffolder-backend@1.29.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.1 + +### Patch Changes + +- edaf925: Updates to allow users to subscribe to the newly created repository within GitHub to mimic similar functionality found within the GitHub UI. + +## @backstage/plugin-scaffolder-react@1.14.3-next.1 + +### Patch Changes + +- d8f9079: Updated dependency `@rjsf/utils` to `5.23.2`. + Updated dependency `@rjsf/core` to `5.23.2`. + Updated dependency `@rjsf/material-ui` to `5.23.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.2`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + +## @backstage/plugin-search@1.4.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## @backstage/plugin-techdocs@1.12.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/integration-react@1.2.2 + - @backstage/core-compat-api@0.3.4 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.44-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-catalog@1.26.1-next.0 + - @backstage/plugin-techdocs@1.12.1-next.0 + - @backstage/integration-react@1.2.2 + +## @backstage/plugin-techdocs-backend@1.11.5-next.1 + +### Patch Changes + +- 29a4aa8: fix(config): add missing parameters in config schema + +## @backstage/plugin-user-settings@0.8.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## example-app@0.2.105-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-home@0.8.4-next.1 + - @backstage/plugin-scaffolder-react@1.14.3-next.1 + - @backstage/plugin-scaffolder@1.27.4-next.1 + - @backstage/plugin-api-docs@0.12.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.0 + - @backstage/plugin-catalog-graph@0.4.15-next.0 + - @backstage/plugin-catalog-import@0.12.9-next.0 + - @backstage/plugin-kubernetes@0.12.3-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.21-next.0 + - @backstage/plugin-org@0.6.35-next.0 + - @backstage/plugin-search@1.4.22-next.0 + - @backstage/plugin-techdocs@1.12.1-next.0 + - @backstage/plugin-user-settings@0.8.18-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-devtools@0.1.22 + - @backstage/plugin-notifications@0.5.0 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.0 + +## example-app-next@0.0.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-home@0.8.4-next.1 + - @backstage/plugin-scaffolder-react@1.14.3-next.1 + - @backstage/plugin-scaffolder@1.27.4-next.1 + - @backstage/plugin-api-docs@0.12.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.0 + - @backstage/plugin-catalog-graph@0.4.15-next.0 + - @backstage/plugin-catalog-import@0.12.9-next.0 + - @backstage/plugin-kubernetes@0.12.3-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.21-next.0 + - @backstage/plugin-org@0.6.35-next.0 + - @backstage/plugin-search@1.4.22-next.0 + - @backstage/plugin-techdocs@1.12.1-next.0 + - @backstage/plugin-user-settings@0.8.18-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-app@0.1.4 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-notifications@0.5.0 + - @backstage/plugin-signals@0.0.14 + - @backstage/core-compat-api@0.3.4 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.0 + +## example-backend@0.0.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.1 + - @backstage/plugin-signals-backend@0.3.0-next.1 + - @backstage/plugin-techdocs-backend@1.11.5-next.1 + - @backstage/plugin-scaffolder-backend@1.29.0-next.1 + - @backstage/plugin-notifications-backend@0.5.1-next.0 + +## example-backend-legacy@0.2.106-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-signals-backend@0.3.0-next.1 + - @backstage/plugin-techdocs-backend@1.11.5-next.1 + - @backstage/plugin-scaffolder-backend@1.29.0-next.1 + +## e2e-test@0.2.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.24-next.1 + +## @internal/scaffolder@0.0.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.3-next.1 + +## techdocs-cli-embedded-app@0.2.104-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.1-next.0 + - @backstage/plugin-techdocs@1.12.1-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/integration-react@1.2.2 diff --git a/docs/releases/v1.35.0-next.2-changelog.md b/docs/releases/v1.35.0-next.2-changelog.md new file mode 100644 index 0000000000..0c9cf4a81f --- /dev/null +++ b/docs/releases/v1.35.0-next.2-changelog.md @@ -0,0 +1,2203 @@ +# Release v1.35.0-next.2 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.35.0-next.2](https://backstage.github.io/upgrade-helper/?to=1.35.0-next.2) + +## @backstage/app-defaults@1.5.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/theme@0.6.3 + +## @backstage/backend-app-api@1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/cli-common@0.1.15 + +## @backstage/backend-defaults@0.7.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-app-api@1.1.1-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/cli-node@0.2.12-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/cli-common@0.1.15 + - @backstage/integration@1.16.1-next.0 + +## @backstage/backend-dynamic-feature-service@0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-app-api@1.1.1-next.1 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/cli-node@0.2.12-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-events-backend@0.4.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + - @backstage/plugin-app-node@0.1.29-next.1 + - @backstage/cli-common@0.1.15 + +## @backstage/backend-openapi-utils@0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + +## @backstage/backend-plugin-api@1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/cli-common@0.1.15 + +## @backstage/backend-test-utils@1.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-app-api@1.1.1-next.1 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/catalog-client@1.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + +## @backstage/catalog-model@1.7.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/errors@1.2.7-next.0 + +## @backstage/cli@0.29.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/cli-node@0.2.12-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/release-manifests@0.0.12 + - @backstage/cli-common@0.1.15 + - @backstage/eslint-plugin@0.1.10 + - @backstage/integration@1.16.1-next.0 + +## @backstage/cli-node@0.2.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/cli-common@0.1.15 + +## @backstage/config@1.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/errors@1.2.7-next.0 + +## @backstage/config-loader@1.9.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/cli-common@0.1.15 + +## @backstage/core-app-api@1.15.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-compat-api@0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-components@0.16.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/theme@0.6.3 + - @backstage/version-bridge@1.0.10 + +## @backstage/core-plugin-api@1.10.3-next.0 + +### Patch Changes + +- b40eb41: Move `Expand` and `ExpandRecursive` to `@backstage/types` +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/create-app@0.5.24-next.2 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## @backstage/dev-utils@1.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/app-defaults@1.5.16-next.0 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/theme@0.6.3 + +## @backstage/errors@1.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + +## @backstage/frontend-app-api@0.10.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/frontend-defaults@0.1.5-next.0 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/frontend-defaults@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/frontend-app-api@0.10.4-next.0 + - @backstage/plugin-app@0.1.5-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + +## @backstage/frontend-plugin-api@0.9.4-next.0 + +### Patch Changes + +- b40eb41: Move `Expand` and `ExpandRecursive` to `@backstage/types` +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/frontend-test-utils@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/frontend-app-api@0.10.4-next.0 + - @backstage/plugin-app@0.1.5-next.0 + - @backstage/test-utils@1.7.4-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/integration@1.16.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + +## @backstage/integration-aws-node@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + +## @backstage/integration-react@1.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/repo-tools@0.12.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/cli-node@0.2.12-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/cli-common@0.1.15 + +## @techdocs/cli@1.8.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-techdocs-node@1.12.16-next.1 + - @backstage/cli-common@0.1.15 + +## @backstage/test-utils@1.7.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/theme@0.6.3 + +## @backstage/types@1.2.1-next.0 + +### Patch Changes + +- b40eb41: Move `Expand` and `ExpandRecursive` to `@backstage/types` + +## @backstage/plugin-api-docs@0.12.3-next.1 + +### Patch Changes + +- dcf6e72: Fix typo in default path of api docs definition route +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.1 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## @backstage/plugin-app@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/theme@0.6.3 + +## @backstage/plugin-app-backend@0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-app-node@0.1.29-next.1 + +## @backstage/plugin-app-node@0.1.29-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config-loader@1.9.5-next.1 + +## @backstage/plugin-app-visualizer@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + +## @backstage/plugin-auth-backend@0.24.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.4-next.1 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.4-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.4-next.1 + - @backstage/plugin-auth-backend-module-auth0-provider@0.1.4-next.1 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.4-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.4-next.1 + - @backstage/plugin-auth-backend-module-oidc-provider@0.3.4-next.1 + - @backstage/plugin-auth-backend-module-okta-provider@0.1.4-next.1 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.2-next.1 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-google-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.4-next.1 + - @backstage/catalog-client@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-auth0-provider@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-github-provider@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-google-provider@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-guest-provider@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-backend@0.24.2-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-okta-provider@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-onelogin-provider@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @backstage/plugin-auth-node@0.5.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/catalog-client@1.9.1-next.0 + +## @backstage/plugin-auth-react@0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/errors@1.2.7-next.0 + +## @backstage/plugin-bitbucket-cloud-common@0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-catalog@1.26.1-next.1 + +### Patch Changes + +- 208e53b: Fixing spelling mistake in translation +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## @backstage/plugin-catalog-backend@1.30.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-openapi-utils@0.4.1-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.4.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.4.1-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.27-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.7.9-next.1 + +### Patch Changes + +- 4ab00e4: Fixes an issue in `GithubMultiOrgEntityProvider` that caused an error when processing teams without a parent. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.7.9-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-catalog-backend-module-gitlab@0.6.2-next.1 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## @backstage/plugin-catalog-backend-module-ldap@0.11.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## @backstage/plugin-catalog-backend-module-logs@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/plugin-catalog-backend-module-msgraph@0.6.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.7-next.0 + +## @backstage/plugin-catalog-common@1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + +## @backstage/plugin-catalog-graph@0.4.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/catalog-client@1.9.1-next.0 + +## @backstage/plugin-catalog-import@0.12.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-catalog-node@1.15.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## @backstage/plugin-catalog-react@1.15.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/frontend-test-utils@0.2.5-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + +## @backstage/plugin-catalog-unprocessed-entities-common@0.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.4-next.0 + +## @backstage/plugin-config-schema@0.1.64-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/errors@1.2.7-next.0 + +## @backstage/plugin-devtools@0.1.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-devtools-common@0.1.15-next.0 + +## @backstage/plugin-devtools-backend@0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-devtools-common@0.1.15-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/cli-common@0.1.15 + +## @backstage/plugin-devtools-common@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## @backstage/plugin-events-backend@0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-openapi-utils@0.4.1-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/plugin-events-backend-module-aws-sqs@0.4.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/plugin-events-backend-module-azure@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/plugin-events-backend-module-gerrit@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/plugin-events-backend-module-github@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/plugin-events-backend-module-gitlab@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/plugin-events-backend-test-utils@0.1.40-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/plugin-events-node@0.4.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + +## @backstage/plugin-home@0.8.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-home-react@0.1.22-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/theme@0.6.3 + +## @backstage/plugin-home-react@0.1.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + +## @backstage/plugin-kubernetes@0.12.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-kubernetes-react@0.5.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + +## @backstage/plugin-kubernetes-backend@0.19.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + - @backstage/plugin-kubernetes-node@0.2.2-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/catalog-client@1.9.1-next.0 + +## @backstage/plugin-kubernetes-cluster@0.0.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-kubernetes-react@0.5.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + +## @backstage/plugin-kubernetes-common@0.9.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## @backstage/plugin-kubernetes-node@0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + +## @backstage/plugin-kubernetes-react@0.5.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + +## @backstage/plugin-notifications@0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-signals-react@0.0.9-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/theme@0.6.3 + - @backstage/plugin-notifications-common@0.0.8-next.0 + +## @backstage/plugin-notifications-backend@0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-signals-node@0.1.16-next.1 + - @backstage/plugin-notifications-node@0.2.11-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-notifications-common@0.0.8-next.0 + +## @backstage/plugin-notifications-backend-module-email@0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/plugin-notifications-node@0.2.11-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-notifications-common@0.0.8-next.0 + +## @backstage/plugin-notifications-common@0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.2-next.0 + +## @backstage/plugin-notifications-node@0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-signals-node@0.1.16-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-notifications-common@0.0.8-next.0 + +## @backstage/plugin-org@0.6.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## @backstage/plugin-org-react@0.1.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/catalog-client@1.9.1-next.0 + +## @backstage/plugin-permission-backend@0.5.53-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + +## @backstage/plugin-permission-common@0.8.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + +## @backstage/plugin-permission-node@0.8.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## @backstage/plugin-permission-react@0.4.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## @backstage/plugin-proxy-backend@0.5.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + +## @backstage/plugin-scaffolder@1.27.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.3-next.2 + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend@1.29.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.1-next.1 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.1 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.6-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.2 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/integration@1.16.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.27-next.0 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.5-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.27-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.7.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/plugin-notifications-node@0.2.11-next.1 + - @backstage/plugin-notifications-common@0.0.8-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/plugin-scaffolder-node-test-utils@0.1.18-next.1 + +## @backstage/plugin-scaffolder-common@1.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## @backstage/plugin-scaffolder-node@0.6.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-scaffolder-node-test-utils@0.1.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-test-utils@1.2.1-next.1 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + +## @backstage/plugin-scaffolder-react@1.14.3-next.2 + +### Patch Changes + +- 91bb99a: Fix field extension validation not working when field is in dependencies in an array field +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/theme@0.6.3 + - @backstage/version-bridge@1.0.10 + +## @backstage/plugin-search@1.4.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/plugin-search-backend@1.8.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-openapi-utils@0.4.1-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + +## @backstage/plugin-search-backend-module-catalog@0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## @backstage/plugin-search-backend-module-elasticsearch@1.6.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + +## @backstage/plugin-search-backend-module-explore@0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + +## @backstage/plugin-search-backend-module-pg@0.5.40-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + +## @backstage/plugin-search-backend-module-techdocs@0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + - @backstage/plugin-techdocs-node@1.12.16-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## @backstage/plugin-search-backend-node@1.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + +## @backstage/plugin-search-common@1.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## @backstage/plugin-search-react@1.8.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/theme@0.6.3 + - @backstage/version-bridge@1.0.10 + +## @backstage/plugin-signals@0.0.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-signals-react@0.0.9-next.0 + - @backstage/theme@0.6.3 + +## @backstage/plugin-signals-backend@0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-signals-node@0.1.16-next.1 + +## @backstage/plugin-signals-node@0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## @backstage/plugin-signals-react@0.0.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + +## @backstage/plugin-techdocs@1.12.1-next.1 + +### Patch Changes + +- 3710b35: Allow passing down `withSearch` prop to `EntityTechdocsContent` component since it was `true` by default, now user can use the `EntityTechdocsContent` component _without_ showing the search field on top of the content. +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-auth-react@0.1.11-next.0 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/integration@1.16.1-next.0 + - @backstage/theme@0.6.3 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.44-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.12.1-next.1 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.1 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/test-utils@1.7.4-next.0 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + +## @backstage/plugin-techdocs-backend@1.11.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.1 + - @backstage/plugin-techdocs-node@1.12.16-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + - @backstage/integration@1.16.1-next.0 + +## @backstage/plugin-techdocs-node@1.12.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/integration@1.16.1-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + +## @backstage/plugin-techdocs-react@1.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/version-bridge@1.0.10 + +## @backstage/plugin-user-settings@0.8.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-signals-react@0.0.9-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/theme@0.6.3 + - @backstage/plugin-user-settings-common@0.0.1 + +## @backstage/plugin-user-settings-backend@0.2.29-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-signals-node@0.1.16-next.1 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.105-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.12.1-next.1 + - @backstage/plugin-scaffolder-react@1.14.3-next.2 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.1 + - @backstage/plugin-api-docs@0.12.3-next.1 + - @backstage/plugin-scaffolder@1.27.4-next.2 + - @backstage/frontend-app-api@0.10.4-next.0 + - @backstage/plugin-catalog-graph@0.4.15-next.1 + - @backstage/plugin-catalog-import@0.12.9-next.1 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-devtools@0.1.23-next.0 + - @backstage/plugin-home@0.8.4-next.2 + - @backstage/plugin-kubernetes@0.12.3-next.1 + - @backstage/plugin-org@0.6.35-next.1 + - @backstage/plugin-search@1.4.22-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/plugin-user-settings@0.8.18-next.1 + - @backstage/app-defaults@1.5.16-next.0 + - @backstage/cli@0.29.5-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-auth-react@0.1.11-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.13-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.21-next.1 + - @backstage/plugin-notifications@0.5.1-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/plugin-signals@0.0.15-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.1 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/theme@0.6.3 + +## example-app-next@0.0.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.12.1-next.1 + - @backstage/plugin-scaffolder-react@1.14.3-next.2 + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.1 + - @backstage/plugin-api-docs@0.12.3-next.1 + - @backstage/plugin-scaffolder@1.27.4-next.2 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/frontend-app-api@0.10.4-next.0 + - @backstage/frontend-defaults@0.1.5-next.0 + - @backstage/plugin-app@0.1.5-next.0 + - @backstage/plugin-app-visualizer@0.1.15-next.0 + - @backstage/plugin-catalog-graph@0.4.15-next.1 + - @backstage/plugin-catalog-import@0.12.9-next.1 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-home@0.8.4-next.2 + - @backstage/plugin-kubernetes@0.12.3-next.1 + - @backstage/plugin-org@0.6.35-next.1 + - @backstage/plugin-search@1.4.22-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/plugin-user-settings@0.8.18-next.1 + - @backstage/app-defaults@1.5.16-next.0 + - @backstage/cli@0.29.5-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-auth-react@0.1.11-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.13-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.21-next.1 + - @backstage/plugin-notifications@0.5.1-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/plugin-signals@0.0.15-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.1 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/theme@0.6.3 + +## app-next-example-plugin@0.0.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-components@0.16.3-next.0 + +## example-backend@0.0.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-app-backend@0.4.4-next.1 + - @backstage/plugin-auth-backend@0.24.2-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.6-next.1 + - @backstage/plugin-devtools-backend@0.5.1-next.1 + - @backstage/plugin-events-backend@0.4.1-next.1 + - @backstage/plugin-kubernetes-backend@0.19.2-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-proxy-backend@0.5.10-next.1 + - @backstage/plugin-scaffolder-backend@1.29.0-next.2 + - @backstage/plugin-search-backend@1.8.1-next.1 + - @backstage/plugin-signals-backend@0.3.0-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.4-next.1 + - @backstage/plugin-notifications-backend@0.5.1-next.1 + - @backstage/plugin-permission-backend@0.5.53-next.1 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + - @backstage/plugin-techdocs-backend@1.11.5-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.4-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.4-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.4-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.4-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.2 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.6-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.7-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.1 + +## example-backend-legacy@0.2.106-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-app-backend@0.4.4-next.1 + - @backstage/plugin-auth-backend@0.24.2-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-backend@0.4.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-kubernetes-backend@0.19.2-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-proxy-backend@0.5.10-next.1 + - @backstage/plugin-scaffolder-backend@1.29.0-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.5-next.1 + - @backstage/plugin-search-backend@1.8.1-next.1 + - @backstage/plugin-signals-backend@0.3.0-next.2 + - @backstage/plugin-signals-node@0.1.16-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.1-next.1 + - @backstage/plugin-permission-backend@0.5.53-next.1 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + - @backstage/plugin-techdocs-backend@1.11.5-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.4-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.5-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.6.4-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.7-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.40-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/integration@1.16.1-next.0 + +## e2e-test@0.2.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.24-next.2 + - @backstage/errors@1.2.7-next.0 + - @backstage/cli-common@0.1.15 + +## @internal/frontend@0.0.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/version-bridge@1.0.10 + +## @internal/scaffolder@0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.3-next.2 + - @backstage/frontend-plugin-api@0.9.4-next.0 + +## techdocs-cli-embedded-app@0.2.104-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.12.1-next.1 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.1 + - @backstage/app-defaults@1.5.16-next.0 + - @backstage/cli@0.29.5-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/test-utils@1.7.4-next.0 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/theme@0.6.3 + +## @internal/plugin-todo-list@1.0.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + +## @internal/plugin-todo-list-backend@1.0.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## @internal/plugin-todo-list-common@1.0.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.4-next.0 diff --git a/docs/tooling/local-dev/debugging.md b/docs/tooling/local-dev/debugging.md index 39981f2e54..65354442b2 100644 --- a/docs/tooling/local-dev/debugging.md +++ b/docs/tooling/local-dev/debugging.md @@ -56,19 +56,19 @@ In your `launch.json`, add a new entry with the following, ```jsonc { - "name": "Start Backend", - "type": "node", - "request": "launch", - "args": [ - "package", - "start" - ], - "cwd": "${workspaceFolder}/packages/backend", - "program": "${workspaceFolder}/node_modules/.bin/backstage-cli", - "skipFiles": [ - "/**" - ], - "console": "integratedTerminal" + "name": "Start Backend", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}", + "runtimeExecutable": "yarn", + "args": [ + "start-backend", + "--inspect" + ], + "skipFiles": [ + "/**" + ], + "console": "integratedTerminal" }, ``` diff --git a/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx b/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx index 1a783b026a..126bbb9e7d 100644 --- a/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx +++ b/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx @@ -40,7 +40,7 @@ Deploy CLI makes use of [Pulumi](https://www.pulumi.com/docs/) which is an infra You can find the step-by-step installation documentation for Pulumi under the [Deployment section](https://backstage.io/docs/deployment/backstage-deploy/aws-lightsail). -But we summarize the steps to deploy your POC here. You can invoke the the CLI you can use the following command: +But we summarize the steps to deploy your POC here. You can invoke the CLI you can use the following command: ```bash $ npx backstage-deploy aws --create-dockerfile diff --git a/microsite/blog/2024-12-09-kubecon-slc-24.mdx b/microsite/blog/2024-12-09-kubecon-slc-24.mdx new file mode 100644 index 0000000000..c3fa2f70a8 --- /dev/null +++ b/microsite/blog/2024-12-09-kubecon-slc-24.mdx @@ -0,0 +1,201 @@ +--- +# prettier-ignore +title: "Backstage in Salt Lake City: Highlights from BackstageCon and KubeCon + CloudNativeCon North America 2024" +author: André Wanlin, Spotify & Camila Loiola, Spotify +--- + +![Beaver in front of snowcapped mountains peeking over a banner that reads BackstageCon and KubeCon + CloudNativeCon North America 2024, Salt Lake City](assets/2024-12-09/backstagecon-kubecon-2024-salt-lake-city.png) + +**tl;dr:** Salt Lake City did not disappoint! Backstage continues to be at the forefront of many conversations being had at BackstageCon and across KubeCon + CloudNativeCon. If you weren't able to join us, all the [BackstageCon talks][yt] are available for replay on YouTube. Read on for the highlights — plus, photos of super cute pups — as a treat! 🐕 + +[yt]: https://www.youtube.com/playlist?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +{/* truncate */} + +## What everyone was talking about at BackstageCon🦫 + +![Speakers on stage at BackstageCon North America 2024](assets/2024-12-09/kc24slc-spotify-backstagecon.jpg) + +[BackstageCon](https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/co-located-events/backstagecon/) featured a day of talks tailored to the diverse Backstage community. Whether you were an evaluator, adopter, integrator, builder, or an innovator, there was something valuable for everyone. Here were the big themes from the day. + +### Evaluating Backstage ROI + +- Olivier (Avalia Systems) presented what makes digital portals [helpful to C-level executives][olivier]. + +- Himanshu (Harness) shared strategies for adopting Backstage in ways that drive [meaningful value for engineers][himanshu]. + +- Eric (Quantum Metric) explained [how startups can benefit][eric] from what big techies have been contributing to Backstage. + +- Tom (Spotify) shared how developer productivity furthers Spotify’s mission to [empower creators][tom] and what the future holds for Backstage. + +[olivier]: https://youtu.be/kb3F98fKvaQ?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[himanshu]: https://youtu.be/FACtDHQvNf0?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[eric]: https://youtu.be/9qPsuMSw_dM?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[tom]: https://youtu.be/AU9BwkRMmMY?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +### Sharing Backstage adoption journeys + +- A panel discussion — featuring practitioners from Adobe, American Airlines, JPMorgan Chase, Red Hat, and Roku — showcased [real-world adoption stories from large companies][panel], spanning various stages of Backstage usage. Hear how devs at American Airlines can use Scaffolder to get a new site provisioned and deployed on the .aa.com domain in 20 minutes. “I’ve done it in seven,” said Jay Cox, principal engineer. “It used to take a month.” + +- Lizzie (Booz Allen Hamilton) explored corporate barriers to Backstage adoption and lessons learned along the way, including how to navigate [cultural tensions][lizzie] and the importance of listening to your devs, in order to bring the latest advancements in developer experience to a government consulting company that’s going on “110 years young”. + +- Amber and Daniel (Liatrio) elaborated on why [automated governance][amber] belongs inside Backstage portals to facilitate centralized compliance — so your devs don't get held up from going to prod by unforeseen checks. + +[panel]: https://youtu.be/DAjhjS2Xg4Q?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[lizzie]: https://youtu.be/RTYVmMbkdNA?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[amber]: https://youtu.be/GaGbjMJCcRU?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +### Maintaining a Backstage instance + +- Djamaile and Mitch (Spotify) provided [actionable tips][djamaile] for managing Backstage instances, including how to keep them aligned with the latest open source features. + +- Ashna and Mesut (Booking.com) showed how to customize your instance to mirror your company's unique identity and how to leverage reusability for a [smoother user experience for your devs][ashna]. + +- Paul (Red Hat) presented a [platform engineer’s POV][paul] of what it means to maintain a Backstage instance. + +- Yishai (Linear B) spoke about how to approach software engineering intelligence (SEI) and developer productivity metrics inside Backstage, including [do’s and don’ts][yishai]. + +[djamaile]: https://youtu.be/dbLqwEVl52U?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[ashna]: https://youtu.be/QV40Yz2i3jQ?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[paul]: https://youtu.be/CtbfN--mJkE?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[yishai]: https://youtu.be/mxVW2AGoI3A?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +### Building with Backstage core features + +- Avantika and Emma (Spotify) walked us through the advantages of the new backend system, recommending [best practices for plugin development][tika] and showcasing why migrating to this updated version is an extensibility game changer. + +- Will and Ryan (Microsoft) shared how Software Catalog and Templates provide the model to [build visualizations][will] of your cloud native applications. + +[tika]: https://youtu.be/n7GUlLHN2tQ?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[will]: https://youtu.be/U2-Lo-yuvdc?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +### AI-powered Backstage plugins and modules + +Innovative use cases featuring AI integration took center stage. + +- Niall (Amazon Web Services) demonstrated how to [interact with plugin services][niall] using artificial intelligence prompts. + +- Ben (Red Hat) outlined [broader AI integrations][ben] to enhance Backstage, sparking exciting possibilities for the future. + +The sessions offered a wealth of knowledge and inspiration, underscoring the versatility and potential of Backstage for organizations at every level. The Backstage booth was hopping all day long as community members and cloud natives took advantage of being able to ask the experts questions and learn more about the project. + +[niall]: https://youtu.be/DCXzCrIDOAs?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X +[ben]: https://youtu.be/cl6E0A5R_nI?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +## Backstage at the big show: KubeCon⎈ + CloudNativeCon☁️ + +![A view of the crowd entering KubeCon as seen from the top of the convention center escalator](assets/2024-12-09/kc24slc-cncf-entrance.jpg) +📸 _[See more KubeCon photos from the CNCF’s Flickr album](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/) →_ + +My friends, what an intense conference! + +Over the course of three packed days, there were a bunch of activities, including talks, a kiosk, and a Contribfest, all centered around Backstage. + +### Maintainers take the stage + +![Backstage maintainers presenting in a ballroom](assets/2024-12-09/kc24slc-spotify-maintainers.jpg) + +This may be old hat for those who are regular KubeCon attendees, but it’s still pretty exciting to catch up on all the Backstage updates straight from the core maintainers. Spotify’s Ben Lambert and Patrik Oldsberg were in the spotlight in Ballroom C addressing an attentive crowd of Backstage adopters, users, and fans. + +Highlights of their maintainers talk include: + +- **Project updates:** Yarn 4 is now the default, the new built-in event bus has arrived, and the (New) Backend System is now 1.0! +- **Security Audit:** Another security audit has been completed with the helpful support of the CNCF +- **Scaffolder updates:** Addition of Form Decorators and support for Retries! +- **New Frontend System:** Focus on the plugin builder experience! + +Watch their entire talk — “[How to Expand Your IDP: The New Building Blocks of Backstage](https://youtu.be/BzPCJMQH8tg?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X)” — for all the details. + +### Toyota and Akamai in the house + +![A packed ballroom with Backstage displayed on two large screens](assets/2024-12-09/kc24slc-cncf-toyota.jpg) +📸 [CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/) + +There were great talks from Backstage adopters during KubeCon, too. Toyota and Akamai packed the rooms with their Backstage knowledge. + +- “[Shifting Gears: Leveraging CNCF Tools to Streamline Operations at Toyota Connected][toyota]”: Benson and Rob talk about failures and successes adopting CNCF tools (including ArgoCD and Backstage) to unify operations, streamline workflows, and enhance cross-team collaboration. + +- “[From Chaos to Calm: Building a Unified and Scalable CI/CD Pipeline at Akamai][akamai]”: Tomer dives into development efficiency and how you can “conquer cloud-native deployments by adding the right tools, such as Argo Rollouts and Backstage”. + +[toyota]: https://youtu.be/4w_AC81_GZM?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X&t=856 +[akamai]: https://youtu.be/RFVB9CEEn1I?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X + +### And the award goes to… + +![Adobe accepts the CNCF Top End User Award on the Keynote stage at KubeCon + CloudNativeCon North America 2024](assets/2024-12-09/kc24slc-cncf-adobe.jpg) + +📸 [CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/) + +Adobe gave a shoutout to Backstage from the Keynote mainstage on Thursday morning when they (spoiler alert) [accepted the CNCF’s Top End User Award][keynote], thanking the cloud native community and all the projects that they use. + +But Adobe isn’t just a Backstage adopter, they are a model citizen — giving back to the community through their example, having “developed a reference architecture for its IDP, built using Argo, Backstage, Helm, and Kubernetes, which other organizations can use as a template for designing and implementing their systems”. + +As Taylor Dolezal, head of ecosystem at the CNCF, [says][announcement]: “Their commitment to nurturing technological excellence and developer experience exemplifies what we hope to see in the end user ecosystem. It’s not just about tool adoption or code contributions — it’s about synthesizing these learnings into assets that empower others in their cloud native journeys.” + +Way to go, Adobe! + +[keynote]: https://youtu.be/p7J0lAU3AWo +[announcement]: https://www.cncf.io/announcements/2024/11/14/cncf-presents-top-end-user-award-to-adobe/ + +### A bustling CNCF project pavilion + +![A volunteer wearing an “Ask me about Backstage” T-shirt talks to a visitor at the project kiosk](assets/2024-12-09/kc24slc-cncf-kiosk.jpg) + +📸 [CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/) + +The CNCF Projects Pavilion was buzzing with activity all week, and the Backstage kiosk was a hub of excitement. Attendees stopped by with a mix of curiosity and enthusiasm, sparking conversations that highlighted the dynamic nature of our community. + +Curious visitors asked, “What is Backstage all about?”, while adopters sought personalized advice on customizing Backstage for their specific company needs. Contributors dropped in to say, “Hey, you reviewed my pull request!” And professionals proudly shared their achievements as Backstage experts — in fact, now there’s a way to make that expertise official — by becoming a [Certified Backstage Associate (CBA)](https://training.linuxfoundation.org/blog/just-launched-certified-backstage-associate-cba/), a new certification that was just launched by the CNCF and The Linux Foundation. + +Developers eager to give back to the community came to learn how to start contributing, and some of the kindest Backstage fans simply stopped by to say, “Thank you”. Their gratitude and encouragement are a powerful reminder of why we do what we do. + +Every interaction in person made the day special, and we wrapped up with a deep sense of fulfillment and pride in how far Backstage has come. Here's to building an even brighter future together! + +## Contribfest! It’s All About Community👩‍💻 + +![Various developers and their laptops participating in the Backstage Contribfest](assets/2024-12-09/kc24slc-spotify-cncf-contribfest.gif) + +📸 Spotify, [CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/) + +On Thursday, the first-ever Backstage Contribfest session took place — hosted by Yi Cai and Paul Schultz from Red Hat, and André Wanlin, Patrik Oldsberg, and Ben Lambert from Spotify. + +Participants who hadn't yet used or contributed to Backstage eagerly joined the project's contributors community and were eager to help. Together with the group, experienced Backstage engineers stepped in to assist attendees — whether troubleshooting environment setup or explaining how specific framework and plugin features are implemented. It was a great example of a community coming together to support learning and contribution. + +The energy in the room, with 60 enthusiastic participants, was absolutely electric! It was amazing to see ideas bouncing around, impromptu collaboration happening at every corner, and a shared passion for advancing the Backstage project. + +Among the great contributions to come out of this event are: + +- [Add Pagination to Tech Docs Table](https://github.com/backstage/backstage/pull/27694) +- [Add Home Page Quick Start Card](https://github.com/backstage/backstage/pull/27705) +- [Truncate commit message to first newline](https://github.com/backstage/community-plugins/pull/2012) + +A heartfelt thank you to everyone who joined us — it’s your talent and collaborative spirit that truly define the Backstage community. This event was a powerful reminder that it’s the people behind the project who make Backstage what it is today 💚. + +And if you missed out on the fun, it's never too late to join the Backstage community. Just follow along with the [Contribfest slide deck](https://static.sched.com/hosted_files/kccncna2024/53/KubeCon-ContribFest-Backstage-NA-2024.pdf) to get started with contributing! + +## Bonus pups!🐕 + +Nothing improves developer experience like hanging out with some fluffy friends. So please enjoy these photos from KubeCon’s “[Pet A Pup](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/with/54155382123)” station. + +(All 📸 [CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720321905538/with/54155382123). Please note: the last pup is not a pup.) + +![A labrador retriever pup in the middle of three people calmly getting pets](assets/2024-12-09/kc24slc-cncf-bestpup1.jpg) +The best labrador-retriever pup graciously accepting pets from the cloud native community. + +![A fluffy white pup staring at the camera surrounded by attendees](assets/2024-12-09/kc24slc-cncf-bestpup2.jpg) +The best fluffy white pup surrounded by admirers. + +![A lanky racing pup getting pet on the face](assets/2024-12-09/kc24slc-cncf-bestpup3.jpg) +The best racing-style pup getting face scritches. + +![A yellow pup squinting while getting pets from an attendee in a yellow shirt](assets/2024-12-09/kc24slc-cncf-bestpup4.jpg) +The best yellow pup getting pets from his twinsie. + +![A fluffy cat getting pets.](assets/2024-12-09/kc24slc-cncf-bestpup5.jpg) +See? Not a pup. But did get pets. + +[You, too, can give these pups some love](https://www.therapyanimalsutah.org). + +## Cheerio! We’ll see you in London!💂 + +And that’s a wrap on Salt Lake City! [Join us in London](https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/) in April for more community-building fun at BackstageCon and KubeCon + CloudNativeCon Europe 2025! diff --git a/microsite/blog/2024-12-17-backstage-security-audit-2024.mdx b/microsite/blog/2024-12-17-backstage-security-audit-2024.mdx new file mode 100644 index 0000000000..f9a1afef9e --- /dev/null +++ b/microsite/blog/2024-12-17-backstage-security-audit-2024.mdx @@ -0,0 +1,34 @@ +--- +# prettier-ignore +title: The 2024 Backstage Security Audit +author: Patrik Oldsberg, Spotify +authorURL: https://github.com/Rugvip +--- + +**TL;DR** Backstage’s security posture remains strong! Today, we’re releasing the report from the second independent security audit of the Backstage project. + +![Backstage Security Audit & Updates](assets/22-08-23/backstage-security-audit.png) + +As an [Incubating project](https://www.cncf.io/blog/2022/03/15/backstage-project-joins-the-cncf-incubator/) within the [Cloud Native Computing Foundation](https://www.cncf.io/) (CNCF), Backstage is fortunate enough to take advantage of sponsored continuous security audits. The [Open Source Technology Improvement Fund](https://ostif.org/) (OSTIF) sponsors the audits as part of its ongoing efforts to secure the open source software ecosystem, and the audit itself was performed by [X41 D-Sec](https://x41-dsec.de/), who also performed the first audit. Our goal with the audit was to re-evaluate and further improve Backstage’s security posture, focusing on the core Backstage framework and plugins. + +{/* truncate */} + +## Report Findings and Fixes + +The security audit and improvements concluded on October 16. The audit findings totalled three high and one medium severity vulnerability, alongside seven side findings with no direct security impact. All main findings were remedied in the [Backstage 1.31 release](https://backstage.io/docs/releases/v1.31.0), while the majority of the side findings were addressed by the [1.32 release](https://backstage.io/docs/releases/v1.32.0). For details on all findings, see the [full audit report](assets/2024-12-17/X41-Backstage-Audit-2024.pdf). + +We are happy to see that there are no repeated vulnerabilities, perhaps in part due to our new [secure coding practices](https://github.com/backstage/backstage/blob/master/SECURITY.md#coding-practices) following the previous audit, as well as the introduction of the [Backstage Threat Model](https://backstage.io/docs/overview/threat-model). While there was a path traversal vulnerability that was discovered in the TechDocs backend, this was more specific and related to remote paths, rather than the local filesystem. We chose to handle this as an isolated fix as there are no other occurrences of this pattern that we are aware of. + +The [previous security audit](https://backstage.io/blog/2022/08/23/backstage-security-audit/) highlighted the need for Backstage to have its own built-in protection, to be secure by default. This, as well as the need for more robust service-to-service auth, was addressed earlier this year through the new auth system, in [1.24](https://backstage.io/docs/releases/v1.24.0#breaking-auth-improvements) and following releases. The new auth system was in scope for this new security audit, and no findings were made in that area. + +One area with findings in both audits is the way that the auth plugin backend handles sign-in of users. This is a complex area that can often be a source of friction for the adoption experience of Backstage. As part of this audit we have made several updates especially to the documentation for sign-in resolvers, but this remains an area where it is hard to find a solution that is both simple and secure. Of course we err on the side of caution and have updated our documentation to be more strict. We will continue to explore options for improvements to the sign-in system to keep it both simple and secure out of the box, but in the meantime be sure to read the documentation section [sign-in identity and resolver](https://backstage.io/docs/auth/identity-resolver) as you are setting up Backstage. + +We are happy with the results of this security audit, it is yet another way in which we see the continuing maturity of the Backstage projects. On behalf of the Backstage maintainers and community: thanks to the CNCF, OSTIF, and X41 D-Sec for the opportunity to improve the project. + +## Links and References + +- [X41 Blog Post](https://x41-dsec.de/security/research/job/news/2024/12/16/backstage-review-2024/) +- [OSTIF Blog Post](https://ostif.org/backstage-audit-complete/) +- [Full Audit Report](assets/2024-12-17/X41-Backstage-Audit-2024.pdf) +- [Backstage Threat Model](https://backstage.io/docs/overview/threat-model) +- [Backstage Security Policy](https://github.com/backstage/backstage/blob/master/SECURITY.md) diff --git a/microsite/blog/2024-12-18-backstage-wrapped-2024.mdx b/microsite/blog/2024-12-18-backstage-wrapped-2024.mdx new file mode 100644 index 0000000000..a136d644b5 --- /dev/null +++ b/microsite/blog/2024-12-18-backstage-wrapped-2024.mdx @@ -0,0 +1,177 @@ +--- +# prettier-ignore +title: "Backstage Wrapped 2024: The year's Top 5 milestones and highlights" +author: Patrik Oldsberg, Spotify & Ben Lambert, Spotify +--- + +![Bowie the Backstage Beaver in an astronaut outfit riding a firecracker surrounded by fireworks exploding with stats: 210+ open source plugins, 1.6k contributors, 60k total contributions](assets/2024-12-18/wrapped2024-top5.png) + +It was another banner year for everyone's favorite platform for improving developer experience — and we're closing 2024 out with a bang🧨🎆. To give you a snapshot of how the Backstage community is doing, we're counting down our Top 5 milestones for the year (plus a few other highlights sprinkled in). To start things off, let's see what you and your 1,616 fellow contributors were up to last year… + +{/* truncate */} + +--- + +## 5️⃣: 60k+ Contributions from a Global Community of Very Busy Beavers🦫 + + +_Behold! Every commit to the Backstage open source project this year — can you +see your name in there?_ + +As we shared last month when we kicked off [BackstageCon North America](https://youtu.be/OfavM6j4Z5o?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X&t=112), the Backstage community hit a new milestone this year — reaching 60,000 total contributions (discussions, issues, and pull requests) to the project since Spotify donated it to the [Cloud Native Computing Foundation (CNCF)](https://www.cncf.io/projects/backstage/) in 2020. Busy Backstage beavers, indeed. + +And the community was as active as ever in 2024 — if you hit play on the visualization above, you can see all 12.3k commits from the year being made. (Though, instead of busy beavers, it's more like a giant cluster of space spiders shooting galactic laser webs. Pew pew!) + +### The most commits of any CNCF project, by a lot + +![Taylor Dolezal presenting a chart showing the Top 10 CNCF Projects by Number of End User Commits on the Keynote stage at KubeCon Europe 2024](assets/2024-03-27/cncf-keynote-kubecon-2024.jpg) + +Speaking of commits, rewinding back to [KubeCon + CloudNativeCon Europe](https://backstage.io/blog/2024/03/27/backstagecon-kubecon-24/) in March gives us another way to visualize the mightiness of the Backstage community. + +From the keynote stage in Paris, Taylor Dolezal, the head of ecosystem at The Linux Foundation, [presented a chart](https://www.youtube.com/watch?v=MICHGBAe8gc&list=PLj6h78yzYM2N8nw1YcqqKveySH6_0VnI0&index=161) showing the "Top CNCF Projects by Number of End User Commits", using data from the previous four months. + +At the top of the chart, a conspicuous blue bar — more than twice the length as the next longest one — had Taylor noting that, among CNCF projects, Backstage was "rocketing into the forefront when it comes to end user contributions".🚀🚀🚀 + +### Our first Contribfest! + +![A room full of developers working together at the first Backstage Contribfest](assets/2024-12-18/wrapped2024-contribfest.jpg) + +What's better than ogling a nifty visualization or nerding out on a good bar graph? Feeling the buzz of those contributions in person. + +Just last month at KubeCon + CloudNativeCon North America, maintainers from Spotify and Red Hat cohosted the first-ever [Backstage Contribfest](https://backstage.io/blog/2024/12/09/kubecon-slc-24/#contribfest-its-all-about-community). We packed the room with engineers obsessed with developer experience and let them loose on a curated list of issues. The session was good, old-fashioned coding fun — devs sharing ideas and solving problems together — and we look forward to doing it again with all of you. + +If you missed it and want to get in on the action, just follow along with the [Contribfest slide deck](https://static.sched.com/hosted_files/kccncna2024/53/KubeCon-ContribFest-Backstage-NA-2024.pdf). Or meet us in 💂‍♂️London in April for [BackstageCon](https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/co-located-events/backstagecon/) and [KubeCon + CloudNativeCon Europe 2025](https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/)! + +--- + +## 4️⃣: 210+ Open Source Plugins (and Counting)🧩 + +![Bowie the Backstage Beaver surrounded by icons for plugins: Argo CD, Datadog, GitHub Actions, Grafana, Jira, and Kubernetes](assets/2024-12-18/wrapped2024-4-plugins.gif) +_Just a few of the plugins built by the Backstage community_ + +### Plugins, plugins, plugins + +Everybody's building them, everywhere you look. We see official plugins from popular third-party service providers ([DX](https://backstage.spotify.com/marketplace/dx/plugin/dx/), [PagerDuty](https://pagerduty.github.io/backstage-plugin-docs/index.html), [Rootly](https://backstage.spotify.com/marketplace/rootly/plugin/rootly/)), in-house plugins going open source (like these from [DAZN](https://github.com/backstage/community-plugins/blob/main/workspaces/github-pull-requests-board/plugins/github-pull-requests-board/README.md), [Keyloop](https://github.com/backstage/community-plugins/blob/main/workspaces/azure-devops/plugins/azure-devops/README.md), and [SeatGeek](https://github.com/seatgeek/backstage-plugins)), essential plugins built and maintained by ecosystem champions and supporters ([AWS](https://github.com/awslabs/backstage-plugins-for-aws), [GCP](https://github.com/googlecloudplatform/google-cloud-backstage-plugins), [Roadie](https://roadie.io), [Spotify](https://backstage.spotify.com)), as well as creative and [useful](https://github.com/procore-oss/backstage-plugin-announcements) plugins from contributors and enthusiasts from all corners of the Backstage community. + +### A yearlong plugin party + +In 2024, the plugin ecosystem continued to expand — with about a hundred new plugins being introduced over the year and many others getting big updates. + +SeatGeek started the plugin party in February❄️ at a Backstage Community Session where they [demoed](https://www.youtube.com/watch?v=CRw0m3J11Bc&t=526s) five of the seven plugins they've open sourced, including their [Awards Plugin](https://github.com/seatgeek/backstage-plugins/tree/main/plugins/awards) and [Entity Scaffolder Plugin](https://github.com/seatgeek/backstage-plugins/tree/main/plugins/entity-scaffolder-content). + +By spring🌷, new plugins for [Linkerd](https://github.com/backstage/community-plugins/tree/main/workspaces/linkerd) and [Black Duck](https://github.com/backstage/community-plugins/tree/main/workspaces/blackduck/plugins/blackduck) had sprung onto the scene. + +During the summer☀️, the official [PagerDuty](https://pagerduty.github.io/backstage-plugin-docs/index.html) plugin received updates that made it a breeze to configure existing PagerDuty services and also added support for multiple PagerDuty accounts in the same Backstage instance. + +By fall🍁, some of the most-used plugins — including plugins for [Argo CD](https://www.npmjs.com/package/@roadiehq/backstage-plugin-argo-cd), [Datadog](https://www.npmjs.com/package/@roadiehq/backstage-plugin-datadog), [GitHub Actions](https://github.com/backstage/community-plugins/tree/main/workspaces/github-actions/plugins/github-actions), [Grafana](https://github.com/backstage/community-plugins/blob/main/workspaces/grafana/plugins/grafana/docs/index.md), [Jira](https://github.com/AxisCommunications/backstage-plugins/tree/main/plugins/jira-dashboard), [Kubernetes](https://backstage.io/docs/features/kubernetes/), and [Tech Radar](https://github.com/backstage/community-plugins/tree/main/workspaces/tech-radar/plugins/tech-radar) — had already been updated to support the very latest versions of the Backstage framework's [New Frontend System](https://backstage.io/docs/releases/v1.30.0) and [New Backend System](https://github.com/backstage/backstage/issues/24493). (Thanks to the teams at Roadie and Spotify for helping to kickstart a new era of easy-to-install-and-configure plugins!) + +And last but not least, AWS just released the [AWS Config catalog plugin for Backstage](https://github.com/awslabs/backstage-plugins-for-aws/blob/main/plugins/core/catalog-config/README.md) — a great new plugin that makes it easy for their customers to ingest AWS resources into the Backstage Software Catalog. + +Have a plugin you'd like to show off and share with the community? Sign up to demo it at one of our monthly [Backstage Community Sessions](https://github.com/backstage/community/tree/main/backstage-community-sessions#readme)! + +### A shiny new plugins repo + +Alongside all this plugin-building action, there was also plenty of plugin-migrating action. In April, community plugins moved to a repo they could call their own — the [Backstage Community Plugins Repository](https://backstage.io/blog/2024/04/19/community-plugins/). + +With release tooling, workspace tooling, and migration guide all included, [the new repo](https://github.com/backstage/community-plugins) gives plugin owners a leg up on building and shipping plugins. Now you can release independently of the main monorepo, at your own release cadence. + +Special thanks go to Red Hat as maintainers of the [community plugins project area](https://github.com/backstage/backstage/blob/master/OWNERS.md#community-plugins) and to everyone who provided feedback on the migration plan. With the new community plugins repo now established, it will be fascinating to see what new, innovative plugins we'll be talking about this time next year. [Go start building](https://backstage.io/docs/plugins/)! + +--- + +## 3️⃣: 278 Companies Listed in ADOPTERS.md💚 + +![Bowie the Backstage Beaver wearing a I heart Backstage T-shirt and hugging the ADOPTERS.md file](assets/2024-12-18/wrapped2024-3-adopters.gif) +_We 💚 all our Backstage adopters_ + +### One thing in common + +At the top level of the `backstage/backstage` GitHub repo is a little file called [ADOPTERS.md](https://github.com/backstage/backstage/blob/master/ADOPTERS.md) that contains the names of hundreds of companies who have adopted Backstage and added themselves to the list. + +There are companies from all over the world on that list, of all shapes and sizes, including cloud natives and cloud newbies, brand new startups and fast-growing scale-ups, airlines, banks, and healthcare companies, along with online retailers, gaming studios, digital entertainment platforms, and hundred-year-old government consulting firms. + +But no matter how different their industries, their business models, their engineering cultures, or their tech stacks, when they join that list of public Backstage adopters, they all share one thing in common: their commitment to improving developer experience as the surest path to innovation. So while the file is just a simple table, it's also an invitation for other companies to join in that commitment. + +This year, the following companies added themselves to ADOPTERS.md, bringing the total to 278 public Backstage adopters — let's give a big welcome to: [Anuclei](https://anuclei.com), [Fortnox](https://www.fortnox.se), [Wefox](https://www.wefox.com), [Aurora Innovation](https://aurorainnovation.com), [ENSEK](https://ensek.com/), [OP Financial Group](https://www.op.fi/op-financial-group), [Scania](https://www.scania.com), [Senora.dev](https://senora.dev), [Covestro](https://www.covestro.com), [Grupo OLX](https://www.olx.com.br/), [DPG Media](https://www.dpgmediagroup.com), [Baloise](https://www.baloise.ch), [Cigna](https://www.cigna.com/), [Evernorth](https://www.evernorth.com/), [Infobip](https://www.infobip.com/), [CloudScript](https://www.cloudscript.com.br/), [Alauda](https://www.alauda.io/), [New10](https://www.new10.com/), [Tele2 Kazakhstan](https://tele2.kz/), [Altel Digital](https://digital.altel.kz/), and [Axelerant](https://www.axelerant.com/). + +### Plus, thousands more in the wild + +The companies on that list represent just a fraction of the active Backstage adopters out there — we know there are thousands more of you. How do we know? + +We've seen your [amazing talks](https://backstage.io/blog/2024/12/09/kubecon-slc-24/#toyota-and-akamai-in-the-house). We've read your [insightful blog posts](https://backstage.io/blog/2024/09/24/dynatrace-adopter-spotlight/). We've heard your [engaging adoption journeys](https://www.youtube.com/watch?v=nZuEMojNi9A&t=565s). We've enjoyed your [automation workshops](https://philips-labs.github.io/automation-workshop/). And we've celebrated your [well-deserved awards](https://backstage.io/blog/2024/12/09/kubecon-slc-24/#and-the-award-goes-to). + +There are so many different kinds of adopters out there, and so many different ways to share with the community — and we love to see it all. + +### Support the community! Add yourself to ADOPTERS.md + +If you work somewhere that's using Backstage, don't be shy. Jump into 2025 by [adding your company](https://github.com/backstage/backstage/blob/master/ADOPTERS.md) to the public adopters list. We love to see you there, and it's a simple but meaningful way to contribute back to the community.🙏 + +--- + +## 2️⃣: 2 Legit 2 Quit: The Official Backstage Certification Launches🎓 + +![Bowie the Backstage Beaver wearing glasses and holding a book pointing at the badge for Certified Backstage Associate](assets/2024-12-18/wrapped2024-2-cba.gif) +_Time to make it official_ + +With the Backstage community growing across so many companies, the need for Backstage experts grows, as well. Now there's an easy way to spot 'em. + +### Become a Certified Backstage Associate (CBA) + +Last month, the CNCF and Linux Foundation Education [announced](https://training.linuxfoundation.org/blog/just-launched-certified-backstage-associate-cba/) the launch of a new certification: [Certified Backstage Associate (CBA)](https://training.linuxfoundation.org/certification/certified-backstage-associate-cba/). So now you can make your expertise for "building on top of the most popular open source IDP" official: + +> Designed for IT engineers, developers, platform engineers, and other IT professionals, the CBA proves you have the mindset and skills to work in and build Backstage tools that improve performance and drive innovation benefiting your career, your team and your organization. + +It's a huge help for Backstage experts and practitioners, as well as all those Backstage adopters (and future adopters) who prioritize developer experience and productivity amid the increasing complexity of modern software development. + +As Pia Nilsson, head of platform developer experience at Spotify, says in the announcement, "With the CNCF's Certified Backstage Associate program, companies now have a way to identify and tap into that expertise, while helping to contribute back to the growing Backstage community." + +### Enroll today! + +The program to become a Certified Backstage Associate is live, so you can [enroll today](https://training.linuxfoundation.org/certification/certified-backstage-associate-cba/)! + +And if you want to see what domains the 90-minute, multiple-choice CBA exam covers — and hear more about how "earning a Backstage certification can be a career game-changer for developers and IT engineer's careers" — makes sure to read the full announcement on the [The Linux Foundation Education blog](https://training.linuxfoundation.org/blog/just-launched-certified-backstage-associate-cba/). + +--- + +## 1️⃣: Version 1.0 of the Future of Backstage🎉 + +![The top half of Bowie the Backstage Beaver sticking out of the top of a portal, the beaver's bottom half sticking out of the bottom of another portal, with Backend System 1.0! written in between the floating halves](assets/2024-12-18/wrapped2024-1-backend.gif) +_And the number one milestone of 2024 is…Backend System 1.0!_ + +As we saw in the video visualizing a year's worth of commits, there were a lot of changes to Backstage in 2024 — including improved documentation, the introduction of the Framework SIG ([join a Backstage special interest group](https://github.com/backstage/community/tree/main/sigs#sig)!), Yarn 4 as the default, our second security audit, a built-in event bus, major new features to the Scaffolder UI (form decorators and retries — shout-out to [Bogdan Nechyporenko](https://github.com/backstage/backstage/blob/master/OWNERS.md#scaffolder) from Bol.com!), big strides in the plugin-building experience in the [New Frontend System](https://youtu.be/BzPCJMQH8tg?list=PL8iP9yIjU0Q3UUDXdAoCaTC4Ci8asWg-X) — and much, much more. And that was just in the last six months. + +But the 1.0 release of the New Backend System was the biggie of the year. + +### The "New Backend System" becomes _the_ backend system + +After months of testing, feedback, and improvements with the community, the New Backend System landed as a [stable v.1.0 release](https://backstage.io/docs/releases/v1.31.0/) in September — marking the beginning of a new era for building for Backstage. + +The New Backend System (which shall henceforth be known as "_the_ backend system") brings a host of improvements to the way that backends and their features are constructed. Instead of the old convention-based structure that could lead to migration pains, features now fit together with dependency injection, like a jigsaw puzzle, while leveraging powerful core services and extending each other dynamically with additional behaviors. + +And this is just scratching the surface of it. To see what else is new in the backend system — check out [the docs](https://backstage.io/docs/backend-system/)! + +We are very excited about this important milestone after a long period of development and refinement together with our passionate community, and hope that you will find it as refreshing and simple yet powerful as it was envisioned to be. This also lays the foundation for us being able to continue iterating at a high pace without incurring undue end user breakages during upgrades. + +### How to migrate your backends and plugins + +We have documentation for both [migrating backends](https://backstage.io/docs/backend-system/building-backends/migrating) and [migrating plugins](https://backstage.io/docs/backend-system/building-plugins-and-modules/migrating). If you haven't migrated already, we encourage you to do so as soon as possible, so that all adopters and end users can begin to unlock the benefits of the new system! + +And keep the feedback coming, either on the community [Discord](https://discord.gg/backstage-687207715902193673) or through [issues](https://github.com/backstage/backstage/issues/new/choose) on GitHub. If you're looking for a way to help, take a look at these open issues in the [backstage](https://github.com/backstage/backstage/issues/26353) and [community plugins](https://github.com/backstage/community-plugins/issues/1176) repos about deprecating old backend capabilities of already migrated plugins. To the future we go! + +--- + +## We won! Hooray to the community! 🏆 + +![Bowie the Backstage Beaver standing bashfully on a podium with 2024 flashing behind in big letters](assets/2024-12-18/wrapped2024-infoworld.gif) + +To cap off the year, last week Backstage won the "[InfoWorld 2024 Technology of the Year Award for Software Development: Platforms](https://www.linkedin.com/posts/backstage-from-spotify_infoworlds-2024-technology-of-the-year-award-activity-7273338824561246208-KY-w/)"! + +Congrats to [all the project maintainers](https://github.com/backstage/backstage/blob/master/OWNERS.md), the CNCF, and everyone in the Backstage community — including all our contributors, adopters, partners, and end users. It's great to see developer experience recognized for the critical role it plays in innovation. + +Let's do it again next year! diff --git a/microsite/blog/assets/2024-12-09/backstagecon-kubecon-2024-salt-lake-city.png b/microsite/blog/assets/2024-12-09/backstagecon-kubecon-2024-salt-lake-city.png new file mode 100644 index 0000000000..518d71fc36 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/backstagecon-kubecon-2024-salt-lake-city.png differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-adobe.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-adobe.jpg new file mode 100644 index 0000000000..c428da1c1b Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-adobe.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup1.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup1.jpg new file mode 100644 index 0000000000..919a16108d Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup1.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup2.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup2.jpg new file mode 100644 index 0000000000..b169eaa52c Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup2.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup3.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup3.jpg new file mode 100644 index 0000000000..a46e320a97 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup3.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup4.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup4.jpg new file mode 100644 index 0000000000..7fa4a405e0 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup4.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup5.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup5.jpg new file mode 100644 index 0000000000..8847adb161 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-bestpup5.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-entrance.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-entrance.jpg new file mode 100644 index 0000000000..5ec34ddf60 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-entrance.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-kiosk.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-kiosk.jpg new file mode 100644 index 0000000000..a25c55a6b3 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-kiosk.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-cncf-toyota.jpg b/microsite/blog/assets/2024-12-09/kc24slc-cncf-toyota.jpg new file mode 100644 index 0000000000..2727992735 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-cncf-toyota.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-spotify-backstagecon.jpg b/microsite/blog/assets/2024-12-09/kc24slc-spotify-backstagecon.jpg new file mode 100644 index 0000000000..579e12cad9 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-spotify-backstagecon.jpg differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-spotify-cncf-contribfest.gif b/microsite/blog/assets/2024-12-09/kc24slc-spotify-cncf-contribfest.gif new file mode 100644 index 0000000000..1a89c6586c Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-spotify-cncf-contribfest.gif differ diff --git a/microsite/blog/assets/2024-12-09/kc24slc-spotify-maintainers.jpg b/microsite/blog/assets/2024-12-09/kc24slc-spotify-maintainers.jpg new file mode 100644 index 0000000000..8a657886b0 Binary files /dev/null and b/microsite/blog/assets/2024-12-09/kc24slc-spotify-maintainers.jpg differ diff --git a/microsite/blog/assets/2024-12-17/X41-Backstage-Audit-2024.pdf b/microsite/blog/assets/2024-12-17/X41-Backstage-Audit-2024.pdf new file mode 100644 index 0000000000..b783e88ce9 Binary files /dev/null and b/microsite/blog/assets/2024-12-17/X41-Backstage-Audit-2024.pdf differ diff --git a/microsite/blog/assets/2024-12-18/wrapped2024-1-backend.gif b/microsite/blog/assets/2024-12-18/wrapped2024-1-backend.gif new file mode 100644 index 0000000000..e95297287d Binary files /dev/null and b/microsite/blog/assets/2024-12-18/wrapped2024-1-backend.gif differ diff --git a/microsite/blog/assets/2024-12-18/wrapped2024-2-cba.gif b/microsite/blog/assets/2024-12-18/wrapped2024-2-cba.gif new file mode 100644 index 0000000000..fb1fc18e6e Binary files /dev/null and b/microsite/blog/assets/2024-12-18/wrapped2024-2-cba.gif differ diff --git a/microsite/blog/assets/2024-12-18/wrapped2024-3-adopters.gif b/microsite/blog/assets/2024-12-18/wrapped2024-3-adopters.gif new file mode 100644 index 0000000000..bbff387eaa Binary files /dev/null and b/microsite/blog/assets/2024-12-18/wrapped2024-3-adopters.gif differ diff --git a/microsite/blog/assets/2024-12-18/wrapped2024-4-plugins.gif b/microsite/blog/assets/2024-12-18/wrapped2024-4-plugins.gif new file mode 100644 index 0000000000..8297c79dba Binary files /dev/null and b/microsite/blog/assets/2024-12-18/wrapped2024-4-plugins.gif differ diff --git a/microsite/blog/assets/2024-12-18/wrapped2024-contribfest.jpg b/microsite/blog/assets/2024-12-18/wrapped2024-contribfest.jpg new file mode 100644 index 0000000000..cd0cafdab1 Binary files /dev/null and b/microsite/blog/assets/2024-12-18/wrapped2024-contribfest.jpg differ diff --git a/microsite/blog/assets/2024-12-18/wrapped2024-infoworld.gif b/microsite/blog/assets/2024-12-18/wrapped2024-infoworld.gif new file mode 100644 index 0000000000..5d1ac13529 Binary files /dev/null and b/microsite/blog/assets/2024-12-18/wrapped2024-infoworld.gif differ diff --git a/microsite/blog/assets/2024-12-18/wrapped2024-top5.png b/microsite/blog/assets/2024-12-18/wrapped2024-top5.png new file mode 100644 index 0000000000..97194ebc2b Binary files /dev/null and b/microsite/blog/assets/2024-12-18/wrapped2024-top5.png differ diff --git a/microsite/data/plugins/3scale.yaml b/microsite/data/plugins/3scale.yaml index fa568c17bf..1b27e1ee84 100644 --- a/microsite/data/plugins/3scale.yaml +++ b/microsite/data/plugins/3scale.yaml @@ -4,7 +4,7 @@ author: Red Hat authorUrl: https://redhat.com category: Discovery description: Synchronize 3scale content into the Backstage catalog. -documentation: https://janus-idp.io/plugins/3scale -iconUrl: https://janus-idp.io/images/plugins/3scale.svg -npmPackageName: '@janus-idp/backstage-plugin-3scale-backend' +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/3scale/plugins/3scale-backend/README.md +iconUrl: /img/3scale.svg +npmPackageName: '@backstage-community/plugin-3scale-backend' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/analytics-module-matomo.yaml b/microsite/data/plugins/analytics-module-matomo.yaml index a90d2897bb..88ce08c868 100644 --- a/microsite/data/plugins/analytics-module-matomo.yaml +++ b/microsite/data/plugins/analytics-module-matomo.yaml @@ -4,7 +4,7 @@ author: Red Hat authorUrl: https://redhat.com category: Monitoring description: Track usage of your Backstage instance using Matomo Analytics. -documentation: https://github.com/janus-idp/backstage-plugins/blob/main/plugins/analytics-module-matomo/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/analytics/plugins/analytics-module-matomo/README.md iconUrl: /img/matomo.png -npmPackageName: '@janus-idp/backstage-plugin-analytics-module-matomo' +npmPackageName: '@backstage-community/plugin-analytics-module-matomo' addedDate: '2023-10-17' diff --git a/microsite/data/plugins/cyclops-modules.yaml b/microsite/data/plugins/cyclops-modules.yaml new file mode 100644 index 0000000000..f2c083295e --- /dev/null +++ b/microsite/data/plugins/cyclops-modules.yaml @@ -0,0 +1,14 @@ +--- +title: Cyclops Modules +author: Cyclops UI +authorUrl: https://cyclops-ui.com/ +category: App Delivery +description: Manage Cyclops Modules through Backstage catalog +documentation: https://github.com/cyclops-ui/backstage-plugins#readme +iconUrl: /img/cyclops.svg +npmPackageName: '@cyclopsui/backstage-plugin-cyclops-modules' +tags: + - Kubernetes + - Productivity + - Delivery +addedDate: '2024-01-02' diff --git a/microsite/data/plugins/feedback.yaml b/microsite/data/plugins/feedback.yaml index 8e8e00165e..fce9588653 100644 --- a/microsite/data/plugins/feedback.yaml +++ b/microsite/data/plugins/feedback.yaml @@ -4,7 +4,7 @@ author: Red Hat authorUrl: https://redhat.com category: Quality description: A plugin for collecting user feedbacks for your application. # Max 170 characters -documentation: https://github.com/janus-idp/backstage-plugins/tree/main/plugins/feedback#readme +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/entity-feedback/plugins/entity-feedback/README.md iconUrl: /img/plugin-feedback-logo.svg -npmPackageName: '@janus-idp/backstage-plugin-feedback' +npmPackageName: '@backstage-community/plugin-entity-feedback' addedDate: '2024-04-09' diff --git a/microsite/data/plugins/github-codespaces.yaml b/microsite/data/plugins/github-codespaces.yaml index 043be3200b..90f90d778c 100644 --- a/microsite/data/plugins/github-codespaces.yaml +++ b/microsite/data/plugins/github-codespaces.yaml @@ -5,7 +5,7 @@ authorUrl: https://github.com/adityasinghal26 category: Development description: Integrates GitHub Codespaces for a Backstage component with the Authenticated User. documentation: https://github.com/adityasinghal26/backstage-plugins/tree/main/plugins/github-codespaces -iconUrl: https://github.com/adityasinghal26/backstage-plugins/blob/main/plugins/github-codespaces/images/GitHubLogo.png +iconUrl: https://avatars.githubusercontent.com/u/9919?s=200&v=4 npmPackageName: '@adityasinghal26/plugin-github-codespaces' tags: - github diff --git a/microsite/data/plugins/gitops-cluster.yaml b/microsite/data/plugins/gitops-cluster.yaml index 8e67c9c25d..395ab8ec75 100644 --- a/microsite/data/plugins/gitops-cluster.yaml +++ b/microsite/data/plugins/gitops-cluster.yaml @@ -5,7 +5,6 @@ authorUrl: https://www.weave.works/ category: Kubernetes description: Create GitOps-managed Kubernetes clusters. Currently, it supports provisioning EKS clusters on GitHub via GitHub Actions. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/gitops-profiles/plugins/gitops-profiles -iconUrl: https://res-5.cloudinary.com/crunchbase-production/image/upload/c_lpad,h_256,w_256,f_auto,q_auto:eco/v1462316670/i9d3delzvx1erzjhmcws.png npmPackageName: '@backstage-community/plugin-gitops-profiles' tags: - kubernetes diff --git a/microsite/data/plugins/jfrog-artifactory.yaml b/microsite/data/plugins/jfrog-artifactory.yaml index 6765fe3d8d..b4f1ef567e 100644 --- a/microsite/data/plugins/jfrog-artifactory.yaml +++ b/microsite/data/plugins/jfrog-artifactory.yaml @@ -4,7 +4,7 @@ author: Red Hat authorUrl: https://redhat.com category: Image description: View container image details from JFrog Artifactory in Backstage. -documentation: https://janus-idp.io/plugins/jfrog-artifactory -iconUrl: https://janus-idp.io/images/plugins/jfrog-artifactory.svg -npmPackageName: '@janus-idp/backstage-plugin-jfrog-artifactory' +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/jfrog-artifactory/plugins/jfrog-artifactory/README.md +iconUrl: /img/jfrog-artifactory.svg +npmPackageName: '@backstage-community/plugin-jfrog-artifactory' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/keycloak.yaml b/microsite/data/plugins/keycloak.yaml index 3da89c3d0a..4136f50f95 100644 --- a/microsite/data/plugins/keycloak.yaml +++ b/microsite/data/plugins/keycloak.yaml @@ -4,7 +4,7 @@ author: Red Hat authorUrl: https://redhat.com category: Authentication/Authorization description: Load users and groups from Keycloak, enabling use of multiple authentication providers to be applied to Backstage entities. -documentation: https://janus-idp.io/plugins/keycloak -iconUrl: https://janus-idp.io/images/plugins/keycloak.svg -npmPackageName: '@janus-idp/backstage-plugin-keycloak-backend' +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/keycloak/plugins/catalog-backend-module-keycloak/README.md +iconUrl: /img/keycloak.svg +npmPackageName: '@backstage-community/plugin-catalog-backend-module-keycloak' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/kiali.yaml b/microsite/data/plugins/kiali.yaml index a85aa6444a..86299c5045 100644 --- a/microsite/data/plugins/kiali.yaml +++ b/microsite/data/plugins/kiali.yaml @@ -5,6 +5,6 @@ authorUrl: https://redhat.com category: Istio description: Configure, visualize, validate and troubleshoot your mesh with Istio documentation: https://janus-idp.io/plugins/kiali -iconUrl: https://janus-idp.io/images/plugins/kiali.svg +iconUrl: /img/kiali.svg npmPackageName: '@janus-idp/backstage-plugin-kiali' addedDate: '2023-07-25' diff --git a/microsite/data/plugins/knative-event-mesh.yaml b/microsite/data/plugins/knative-event-mesh.yaml new file mode 100644 index 0000000000..6ecb219b32 --- /dev/null +++ b/microsite/data/plugins/knative-event-mesh.yaml @@ -0,0 +1,10 @@ +--- +title: Knative Event Mesh +author: Knative Community +authorUrl: https://github.com/knative-extensions/backstage-plugins +category: Monitoring +description: A plugin that provides a way to view and manage Knative Event Mesh resources. +documentation: https://knative.dev/docs/install/installing-backstage-plugins/ +npmPackageName: '@knative-extensions/plugin-knative-event-mesh-backend' +iconUrl: https://raw.githubusercontent.com/knative/community/refs/heads/main/icons/logo.svg +addedDate: '2024-12-16' diff --git a/microsite/data/plugins/nexus-repository-manager.yaml b/microsite/data/plugins/nexus-repository-manager.yaml index aca1e366e2..77b62c841d 100644 --- a/microsite/data/plugins/nexus-repository-manager.yaml +++ b/microsite/data/plugins/nexus-repository-manager.yaml @@ -4,7 +4,7 @@ author: Red Hat authorUrl: https://redhat.com category: Image description: View information about the build artifacts in your Nexus Repository Manager in Backstage. -documentation: https://janus-idp.io/plugins/nexus-repository-manager -iconUrl: https://janus-idp.io/images/plugins/nexus-repository-manager.svg -npmPackageName: '@janus-idp/backstage-plugin-nexus-repository-manager' +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/nexus-repository-manager/plugins/nexus-repository-manager/README.md +iconUrl: /img/nexus-repository-manager.svg +npmPackageName: '@backstage-community/plugin-nexus-repository-manager' addedDate: '2023-10-25' diff --git a/microsite/data/plugins/npm.yaml b/microsite/data/plugins/npm.yaml new file mode 100644 index 0000000000..67f3de976f --- /dev/null +++ b/microsite/data/plugins/npm.yaml @@ -0,0 +1,9 @@ +--- +title: NPM +author: Christoph Jerolimov +authorUrl: https://github.com/christoph-jerolimov +category: Artifacts +description: A plugin that shows meta info and latest versions from a npm registry. +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/npm/plugins/npm/README.md +npmPackageName: '@backstage-community/plugin-npm' +addedDate: '2024-11-29' diff --git a/microsite/data/plugins/ocm.yaml b/microsite/data/plugins/ocm.yaml index 6cf77ca678..1756029b27 100644 --- a/microsite/data/plugins/ocm.yaml +++ b/microsite/data/plugins/ocm.yaml @@ -4,7 +4,7 @@ author: Red Hat authorUrl: https://redhat.com category: Infrastructure description: View clusters from OCM's MultiClusterHub and MultiCluster Engine in Backstage. -documentation: https://janus-idp.io/plugins/ocm -iconUrl: https://janus-idp.io/images/plugins/ocm.svg -npmPackageName: '@janus-idp/backstage-plugin-ocm' +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/ocm/plugins/ocm/README.md +iconUrl: /img/ocm.svg +npmPackageName: '@backstage-community/plugin-ocm' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/quay.yaml b/microsite/data/plugins/quay.yaml index 79ae1c3408..9bcbf82de8 100644 --- a/microsite/data/plugins/quay.yaml +++ b/microsite/data/plugins/quay.yaml @@ -4,7 +4,7 @@ author: Red Hat authorUrl: https://redhat.com category: Image description: View container image details from Quay in Backstage. -documentation: https://janus-idp.io/plugins/quay -iconUrl: https://janus-idp.io/images/plugins/quay.svg -npmPackageName: '@janus-idp/backstage-plugin-quay' +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/quay/plugins/quay/README.md +iconUrl: /img/quay.svg +npmPackageName: '@backstage-community/plugin-quay' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/rollbar.yaml b/microsite/data/plugins/rollbar.yaml index 0dd39d5fe9..3777705b38 100644 --- a/microsite/data/plugins/rollbar.yaml +++ b/microsite/data/plugins/rollbar.yaml @@ -5,6 +5,6 @@ authorUrl: https://github.com/andrewthauer category: Monitoring description: View Rollbar errors for your services in Backstage. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/rollbar/plugins/rollbar -iconUrl: https://rollbar.com/assets/media/rollbar-mark-color.png +iconUrl: https://cdn.rollbar.com/wp-content/themes/rollbar/assets/img/logo-white-rollbar.svg npmPackageName: '@backstage-community/plugin-rollbar' addedDate: '2020-11-03' diff --git a/microsite/data/plugins/scaffolder-backend-datolabs-gcp.yaml b/microsite/data/plugins/scaffolder-backend-datolabs-gcp.yaml new file mode 100644 index 0000000000..528506c02d --- /dev/null +++ b/microsite/data/plugins/scaffolder-backend-datolabs-gcp.yaml @@ -0,0 +1,10 @@ +--- +title: Scaffolder Google Cloud Platform (GCP) actions +author: Datolabs +authorUrl: https://www.datolabs.io +category: Scaffolder +description: A collection of actions for interacting with Google Cloud Platform (GCP). +documentation: https://github.com/datolabs-io/backstage-plugins/blob/main/workspaces/scaffolder-backend-module-gcp/plugins/scaffolder-backend-module-gcp/README.md +iconUrl: https://avatars1.githubusercontent.com/u/2810941?s=280&v=4 +npmPackageName: '@datolabs/plugin-scaffolder-backend-module-gcp' +addedDate: '2024-12-20' diff --git a/microsite/data/plugins/synergy.yaml b/microsite/data/plugins/synergy.yaml new file mode 100644 index 0000000000..6c5e722322 --- /dev/null +++ b/microsite/data/plugins/synergy.yaml @@ -0,0 +1,10 @@ +--- +title: Synergy +author: Jitesh Yadav +authorUrl: https://github.com/jiteshy +category: Collaboration +description: An inner-source dashboard for managing in-house open-source projects, issues, and attracting maintainers to foster collaboration." +documentation: https://github.com/jiteshy/backstage-plugin-synergy/blob/main/README.md +iconUrl: /img/synergy-logo.png +npmPackageName: '@jiteshy/backstage-plugin-synergy' +addedDate: '2024-12-03' diff --git a/microsite/data/plugins/tech-radar.yaml b/microsite/data/plugins/tech-radar.yaml index 37f4e02b92..5db68eef27 100644 --- a/microsite/data/plugins/tech-radar.yaml +++ b/microsite/data/plugins/tech-radar.yaml @@ -5,6 +5,6 @@ authorUrl: https://github.com/spotify category: Discovery description: Visualize the your company's official guidelines of different areas of software development. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/tech-radar/plugins/tech-radar -iconUrl: https://www.materialui.co/materialIcons/action/track_changes_white_192x192.png +iconUrl: /img/tech-radar.svg npmPackageName: '@backstage-community/plugin-tech-radar' addedDate: '2020-11-03' diff --git a/microsite/data/plugins/tekton.yaml b/microsite/data/plugins/tekton.yaml index 27540a81d3..71aa433a83 100644 --- a/microsite/data/plugins/tekton.yaml +++ b/microsite/data/plugins/tekton.yaml @@ -4,7 +4,7 @@ author: Red Hat authorUrl: https://redhat.com category: CI/CD description: Easily view Tekton PipelineRun status for your services in Backstage. -documentation: https://janus-idp.io/plugins/tekton -iconUrl: https://janus-idp.io/images/plugins/tekton.svg -npmPackageName: '@janus-idp/backstage-plugin-tekton' +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/tekton/plugins/tekton/README.md +iconUrl: /img/tekton.svg +npmPackageName: '@backstage-community/plugin-tekton' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/topology.yaml b/microsite/data/plugins/topology.yaml index 9d3b816bd4..f1b74ef45b 100644 --- a/microsite/data/plugins/topology.yaml +++ b/microsite/data/plugins/topology.yaml @@ -4,7 +4,7 @@ author: Red Hat authorUrl: https://redhat.com category: Kubernetes description: Visualize the deployment status and related resources of your applications deployed on any Kubernetes cluster. -documentation: https://janus-idp.io/plugins/topology -iconUrl: https://janus-idp.io/images/plugins/topology.svg -npmPackageName: '@janus-idp/backstage-plugin-topology' +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/topology/plugins/topology/README.md +iconUrl: /img/topology.svg +npmPackageName: '@backstage-community/plugin-topology' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/wiz.yaml b/microsite/data/plugins/wiz.yaml new file mode 100644 index 0000000000..1496231dfa --- /dev/null +++ b/microsite/data/plugins/wiz.yaml @@ -0,0 +1,10 @@ +--- +title: Wiz +author: roadie.io +authorUrl: https://github.com/RoadieHQ +category: Monitoring +description: View Wiz issues status in Backstage. +documentation: https://roadie.io/backstage/plugins/wiz/ +iconUrl: https://roadie.io/images/wiz-logo.png +npmPackageName: '@roadiehq/backstage-plugin-wiz' +addedDate: '2024-10-14' diff --git a/microsite/sidebars.js b/microsite/sidebars.js index 2647143065..2474b15aac 100644 --- a/microsite/sidebars.js +++ b/microsite/sidebars.js @@ -49,6 +49,101 @@ module.exports = { 'getting-started/keeping-backstage-updated', ], 'Core Features': [ + { + type: 'category', + label: 'Auth and Identity', + items: [ + 'auth/index', + { + type: 'category', + label: 'Included providers', + items: [ + 'auth/auth0/provider', + 'auth/atlassian/provider', + 'auth/aws-alb/provider', + 'auth/microsoft/provider', + 'auth/microsoft/easy-auth', + 'auth/bitbucket/provider', + 'auth/bitbucketServer/provider', + 'auth/cloudflare/provider', + 'auth/github/provider', + 'auth/gitlab/provider', + 'auth/google/provider', + 'auth/google/gcp-iap-auth', + 'auth/guest/provider', + 'auth/okta/provider', + 'auth/oauth2-proxy/provider', + 'auth/onelogin/provider', + 'auth/vmware-cloud/provider', + ], + }, + 'auth/identity-resolver', + 'auth/oauth', + 'auth/oidc', + 'auth/add-auth-provider', + 'auth/service-to-service-auth', + 'auth/autologout', + 'auth/troubleshooting', + ], + }, + { + type: 'category', + label: 'Kubernetes', + items: [ + 'features/kubernetes/overview', + 'features/kubernetes/installation', + 'features/kubernetes/configuration', + 'features/kubernetes/authentication', + 'features/kubernetes/authentication-strategies', + 'features/kubernetes/troubleshooting', + 'features/kubernetes/proxy', + ], + }, + { + type: 'category', + label: 'Notifications', + items: [ + 'notifications/index', + 'notifications/processors', + 'notifications/usage', + ], + }, + { + type: 'category', + label: 'Permissions', + items: [ + 'permissions/overview', + 'permissions/concepts', + 'permissions/getting-started', + 'permissions/writing-a-policy', + 'permissions/frontend-integration', + 'permissions/custom-rules', + { + type: 'category', + label: 'Tutorial: using Permissions in your plugin', + items: [ + 'permissions/plugin-authors/01-setup', + 'permissions/plugin-authors/02-adding-a-basic-permission-check', + 'permissions/plugin-authors/03-adding-a-resource-permission-check', + 'permissions/plugin-authors/04-authorizing-access-to-paginated-data', + 'permissions/plugin-authors/05-frontend-authorization', + ], + }, + ], + }, + { + type: 'category', + label: 'Search', + items: [ + 'features/search/search-overview', + 'features/search/getting-started', + 'features/search/concepts', + 'features/search/architecture', + 'features/search/search-engines', + 'features/search/collators', + 'features/search/how-to-guides', + ], + }, { type: 'category', label: 'Software Catalog', @@ -70,19 +165,6 @@ module.exports = { 'features/software-catalog/faq', ], }, - { - type: 'category', - label: 'Kubernetes', - items: [ - 'features/kubernetes/overview', - 'features/kubernetes/installation', - 'features/kubernetes/configuration', - 'features/kubernetes/authentication', - 'features/kubernetes/authentication-strategies', - 'features/kubernetes/troubleshooting', - 'features/kubernetes/proxy', - ], - }, { type: 'category', label: 'Software Templates', @@ -104,19 +186,6 @@ module.exports = { 'features/software-templates/experimental', ], }, - { - type: 'category', - label: 'Backstage Search', - items: [ - 'features/search/search-overview', - 'features/search/getting-started', - 'features/search/concepts', - 'features/search/architecture', - 'features/search/search-engines', - 'features/search/collators', - 'features/search/how-to-guides', - ], - }, { type: 'category', label: 'TechDocs', @@ -285,189 +354,142 @@ module.exports = { 'conf/writing', 'conf/defining', ], - Notifications: ['notifications/index'], - 'Auth and identity': [ - 'auth/index', + Framework: [ { type: 'category', - label: 'Included providers', + label: 'Backend System', items: [ - 'auth/auth0/provider', - 'auth/atlassian/provider', - 'auth/aws-alb/provider', - 'auth/microsoft/provider', - 'auth/microsoft/easy-auth', - 'auth/bitbucket/provider', - 'auth/bitbucketServer/provider', - 'auth/cloudflare/provider', - 'auth/github/provider', - 'auth/gitlab/provider', - 'auth/google/provider', - 'auth/google/gcp-iap-auth', - 'auth/guest/provider', - 'auth/okta/provider', - 'auth/oauth2-proxy/provider', - 'auth/onelogin/provider', - 'auth/vmware-cloud/provider', + 'backend-system/index', + { + type: 'category', + label: 'Architecture', + items: [ + 'backend-system/architecture/index', + 'backend-system/architecture/services', + 'backend-system/architecture/plugins', + 'backend-system/architecture/extension-points', + 'backend-system/architecture/modules', + 'backend-system/architecture/feature-loaders', + 'backend-system/architecture/naming-patterns', + ], + }, + { + type: 'category', + label: 'Building Backends', + items: [ + 'backend-system/building-backends/index', + 'backend-system/building-backends/migrating', + ], + }, + { + type: 'category', + label: 'Building Plugins & Modules', + items: [ + 'backend-system/building-plugins-and-modules/index', + 'backend-system/building-plugins-and-modules/testing', + 'backend-system/building-plugins-and-modules/migrating', + ], + }, + { + type: 'category', + label: 'Core Services', + items: [ + 'backend-system/core-services/index', + 'backend-system/core-services/auth', + 'backend-system/core-services/cache', + 'backend-system/core-services/database', + 'backend-system/core-services/discovery', + 'backend-system/core-services/http-auth', + 'backend-system/core-services/http-router', + 'backend-system/core-services/identity', + 'backend-system/core-services/lifecycle', + 'backend-system/core-services/logger', + 'backend-system/core-services/permissions', + 'backend-system/core-services/plugin-metadata', + 'backend-system/core-services/root-config', + 'backend-system/core-services/root-health', + 'backend-system/core-services/root-http-router', + 'backend-system/core-services/root-lifecycle', + 'backend-system/core-services/root-logger', + 'backend-system/core-services/scheduler', + 'backend-system/core-services/token-manager', + 'backend-system/core-services/url-reader', + 'backend-system/core-services/user-info', + ], + }, ], }, - 'auth/identity-resolver', - 'auth/oauth', - 'auth/oidc', - 'auth/add-auth-provider', - 'auth/service-to-service-auth', - 'auth/autologout', - 'auth/troubleshooting', - ], - Permissions: [ - 'permissions/overview', - 'permissions/concepts', - 'permissions/getting-started', - 'permissions/writing-a-policy', - 'permissions/frontend-integration', - 'permissions/custom-rules', { type: 'category', - label: 'Tutorial: using Permissions in your plugin', + label: 'New Frontend System', items: [ - 'permissions/plugin-authors/01-setup', - 'permissions/plugin-authors/02-adding-a-basic-permission-check', - 'permissions/plugin-authors/03-adding-a-resource-permission-check', - 'permissions/plugin-authors/04-authorizing-access-to-paginated-data', - 'permissions/plugin-authors/05-frontend-authorization', + 'frontend-system/index', + { + type: 'category', + label: 'Architecture', + items: [ + 'frontend-system/architecture/index', + 'frontend-system/architecture/app', + 'frontend-system/architecture/plugins', + 'frontend-system/architecture/extensions', + 'frontend-system/architecture/extension-blueprints', + 'frontend-system/architecture/extension-overrides', + 'frontend-system/architecture/references', + 'frontend-system/architecture/utility-apis', + 'frontend-system/architecture/routes', + 'frontend-system/architecture/naming-patterns', + 'frontend-system/architecture/migrations', + ], + }, + { + type: 'category', + label: 'Building Plugins', + items: [ + 'frontend-system/building-plugins/index', + 'frontend-system/building-plugins/testing', + 'frontend-system/building-plugins/common-extension-blueprints', + 'frontend-system/building-plugins/built-in-data-refs', + 'frontend-system/building-plugins/migrating', + ], + }, + { + type: 'category', + label: 'Building Apps', + items: [ + 'frontend-system/building-apps/index', + 'frontend-system/building-apps/configuring-extensions', + 'frontend-system/building-apps/built-in-extensions', + 'frontend-system/building-apps/plugin-conversion', + 'frontend-system/building-apps/migrating', + ], + }, + { + type: 'category', + label: 'Utility APIs', + items: [ + 'frontend-system/utility-apis/index', + 'frontend-system/utility-apis/creating', + 'frontend-system/utility-apis/consuming', + 'frontend-system/utility-apis/configuring', + ], + }, ], }, - ], - Tooling: [ { - type: 'category', - label: 'Backstage CLI', - items: [ + 'Backstage CLI': [ 'tooling/cli/overview', 'tooling/cli/build-system', 'tooling/cli/commands', - ], - }, - { - type: 'category', - label: 'Local Development', - items: [ - 'tooling/local-dev/linking-local-packages', - 'tooling/local-dev/debugging', - 'tooling/local-dev/profiling', - ], - }, - 'tooling/package-metadata', - ], - 'New Backend System': [ - 'backend-system/index', - { - type: 'category', - label: 'Architecture', - items: [ - 'backend-system/architecture/index', - 'backend-system/architecture/services', - 'backend-system/architecture/plugins', - 'backend-system/architecture/extension-points', - 'backend-system/architecture/modules', - 'backend-system/architecture/feature-loaders', - 'backend-system/architecture/naming-patterns', - ], - }, - { - type: 'category', - label: 'Building Backends', - items: [ - 'backend-system/building-backends/index', - 'backend-system/building-backends/migrating', - ], - }, - { - type: 'category', - label: 'Building Plugins & Modules', - items: [ - 'backend-system/building-plugins-and-modules/index', - 'backend-system/building-plugins-and-modules/testing', - 'backend-system/building-plugins-and-modules/migrating', - ], - }, - { - type: 'category', - label: 'Core Services', - items: [ - 'backend-system/core-services/index', - 'backend-system/core-services/auth', - 'backend-system/core-services/cache', - 'backend-system/core-services/database', - 'backend-system/core-services/discovery', - 'backend-system/core-services/http-auth', - 'backend-system/core-services/http-router', - 'backend-system/core-services/identity', - 'backend-system/core-services/lifecycle', - 'backend-system/core-services/logger', - 'backend-system/core-services/permissions', - 'backend-system/core-services/plugin-metadata', - 'backend-system/core-services/root-config', - 'backend-system/core-services/root-health', - 'backend-system/core-services/root-http-router', - 'backend-system/core-services/root-lifecycle', - 'backend-system/core-services/root-logger', - 'backend-system/core-services/scheduler', - 'backend-system/core-services/token-manager', - 'backend-system/core-services/url-reader', - 'backend-system/core-services/user-info', - ], - }, - ], - 'New Frontend System': [ - 'frontend-system/index', - { - type: 'category', - label: 'Architecture', - items: [ - 'frontend-system/architecture/index', - 'frontend-system/architecture/app', - 'frontend-system/architecture/plugins', - 'frontend-system/architecture/extensions', - 'frontend-system/architecture/extension-blueprints', - 'frontend-system/architecture/extension-overrides', - 'frontend-system/architecture/references', - 'frontend-system/architecture/utility-apis', - 'frontend-system/architecture/routes', - 'frontend-system/architecture/naming-patterns', - 'frontend-system/architecture/migrations', - ], - }, - { - type: 'category', - label: 'Building Plugins', - items: [ - 'frontend-system/building-plugins/index', - 'frontend-system/building-plugins/testing', - 'frontend-system/building-plugins/common-extension-blueprints', - 'frontend-system/building-plugins/built-in-data-refs', - 'frontend-system/building-plugins/migrating', - ], - }, - { - type: 'category', - label: 'Building Apps', - items: [ - 'frontend-system/building-apps/index', - 'frontend-system/building-apps/configuring-extensions', - 'frontend-system/building-apps/built-in-extensions', - 'frontend-system/building-apps/plugin-conversion', - 'frontend-system/building-apps/migrating', - ], - }, - { - type: 'category', - label: 'Utility APIs', - items: [ - 'frontend-system/utility-apis/index', - 'frontend-system/utility-apis/creating', - 'frontend-system/utility-apis/consuming', - 'frontend-system/utility-apis/configuring', + { + type: 'category', + label: 'Local Development', + items: [ + 'tooling/local-dev/linking-local-packages', + 'tooling/local-dev/debugging', + 'tooling/local-dev/profiling', + ], + }, + 'tooling/package-metadata', ], }, ], @@ -477,19 +499,6 @@ module.exports = { 'dls/contributing-to-storybook', 'dls/figma', ], - 'API Reference': [ - { - type: 'category', - label: 'Guides', - items: ['api/utility-apis'], - }, - { - type: 'category', - label: 'API Reference', - items: ['reference/index'], - }, - 'api/deprecations', - ], Tutorials: [ 'tutorials/quickstart-app-plugin', 'tutorials/react-router-stable-migration', @@ -505,22 +514,7 @@ module.exports = { 'tutorials/enable-public-entry', 'tutorials/setup-opentelemetry', ], - 'Architecture Decision Records (ADRs)': [ - 'architecture-decisions/adrs-overview', - 'architecture-decisions/adrs-adr001', - 'architecture-decisions/adrs-adr002', - 'architecture-decisions/adrs-adr003', - 'architecture-decisions/adrs-adr004', - 'architecture-decisions/adrs-adr005', - 'architecture-decisions/adrs-adr006', - 'architecture-decisions/adrs-adr007', - 'architecture-decisions/adrs-adr008', - 'architecture-decisions/adrs-adr009', - 'architecture-decisions/adrs-adr010', - 'architecture-decisions/adrs-adr011', - 'architecture-decisions/adrs-adr012', - 'architecture-decisions/adrs-adr013', - ], + FAQ: ['faq/index', 'faq/product', 'faq/technical'], Accessibility: ['accessibility/index'], Contribute: [ @@ -528,7 +522,33 @@ module.exports = { 'contribute/getting-involved', 'contribute/project-structure', ], - References: ['references/glossary'], + References: [ + { + type: 'category', + label: 'Architecture Decision Records (ADRs)', + items: [ + 'architecture-decisions/adrs-overview', + 'architecture-decisions/adrs-adr001', + 'architecture-decisions/adrs-adr002', + 'architecture-decisions/adrs-adr003', + 'architecture-decisions/adrs-adr004', + 'architecture-decisions/adrs-adr005', + 'architecture-decisions/adrs-adr006', + 'architecture-decisions/adrs-adr007', + 'architecture-decisions/adrs-adr008', + 'architecture-decisions/adrs-adr009', + 'architecture-decisions/adrs-adr010', + 'architecture-decisions/adrs-adr011', + 'architecture-decisions/adrs-adr012', + 'architecture-decisions/adrs-adr013', + 'architecture-decisions/adrs-adr014', + ], + }, + 'api/deprecations', + 'references/glossary', + 'api/utility-apis', + 'reference/index', + ], }, releases: { 'Release Notes': releases.map(release => `releases/${release}`), diff --git a/microsite/src/pages/community/index.tsx b/microsite/src/pages/community/index.tsx index a32f5edd13..171a5efcdf 100644 --- a/microsite/src/pages/community/index.tsx +++ b/microsite/src/pages/community/index.tsx @@ -101,6 +101,16 @@ const Community = () => { url: 'https://statusneo.com/backstage', logo: 'img/partner-logo-statusneo.png', }, + { + name: 'Alauda', + url: 'https://www.alauda.io/community/169249', + logo: 'img/partner-logo-alauda.png', + }, + { + name: 'Liatrio', + url: 'https://www.liatrio.com/service-offerings/backstage', + logo: 'img/partner-logo-liatrio.png', + }, ]; //#endregion diff --git a/microsite/static/img/3scale.svg b/microsite/static/img/3scale.svg new file mode 100644 index 0000000000..46551958aa --- /dev/null +++ b/microsite/static/img/3scale.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microsite/static/img/cyclops.svg b/microsite/static/img/cyclops.svg new file mode 100644 index 0000000000..fbc297443c --- /dev/null +++ b/microsite/static/img/cyclops.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/microsite/static/img/jfrog-artifactory.svg b/microsite/static/img/jfrog-artifactory.svg new file mode 100644 index 0000000000..ded672b4bc --- /dev/null +++ b/microsite/static/img/jfrog-artifactory.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microsite/static/img/keycloak.svg b/microsite/static/img/keycloak.svg new file mode 100644 index 0000000000..871bd5b0f8 --- /dev/null +++ b/microsite/static/img/keycloak.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microsite/static/img/kiali.svg b/microsite/static/img/kiali.svg new file mode 100644 index 0000000000..bfc8510040 --- /dev/null +++ b/microsite/static/img/kiali.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microsite/static/img/nexus-repository-manager.svg b/microsite/static/img/nexus-repository-manager.svg new file mode 100644 index 0000000000..6f145811cc --- /dev/null +++ b/microsite/static/img/nexus-repository-manager.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/microsite/static/img/ocm.svg b/microsite/static/img/ocm.svg new file mode 100644 index 0000000000..6ee5c74f9e --- /dev/null +++ b/microsite/static/img/ocm.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microsite/static/img/partner-logo-alauda.png b/microsite/static/img/partner-logo-alauda.png new file mode 100644 index 0000000000..b43719deb9 Binary files /dev/null and b/microsite/static/img/partner-logo-alauda.png differ diff --git a/microsite/static/img/partner-logo-liatrio.png b/microsite/static/img/partner-logo-liatrio.png new file mode 100644 index 0000000000..bd6238cf8c Binary files /dev/null and b/microsite/static/img/partner-logo-liatrio.png differ diff --git a/microsite/static/img/quay.svg b/microsite/static/img/quay.svg new file mode 100644 index 0000000000..cf3c5e435e --- /dev/null +++ b/microsite/static/img/quay.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microsite/static/img/synergy-logo.png b/microsite/static/img/synergy-logo.png new file mode 100644 index 0000000000..42eb59c704 Binary files /dev/null and b/microsite/static/img/synergy-logo.png differ diff --git a/microsite/static/img/tech-radar.svg b/microsite/static/img/tech-radar.svg new file mode 100644 index 0000000000..350ff4f9cc --- /dev/null +++ b/microsite/static/img/tech-radar.svg @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/microsite/static/img/tekton.svg b/microsite/static/img/tekton.svg new file mode 100644 index 0000000000..a5fdd252df --- /dev/null +++ b/microsite/static/img/tekton.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microsite/static/img/topology.svg b/microsite/static/img/topology.svg new file mode 100644 index 0000000000..21d84a888a --- /dev/null +++ b/microsite/static/img/topology.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 6197b0463e..ef2b96b95d 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -2840,90 +2840,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-darwin-arm64@npm:1.9.3" +"@swc/core-darwin-arm64@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-darwin-arm64@npm:1.10.6" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-darwin-x64@npm:1.9.3" +"@swc/core-darwin-x64@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-darwin-x64@npm:1.10.6" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.9.3" +"@swc/core-linux-arm-gnueabihf@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.6" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-linux-arm64-gnu@npm:1.9.3" +"@swc/core-linux-arm64-gnu@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-linux-arm64-gnu@npm:1.10.6" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-linux-arm64-musl@npm:1.9.3" +"@swc/core-linux-arm64-musl@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-linux-arm64-musl@npm:1.10.6" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-linux-x64-gnu@npm:1.9.3" +"@swc/core-linux-x64-gnu@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-linux-x64-gnu@npm:1.10.6" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-linux-x64-musl@npm:1.9.3" +"@swc/core-linux-x64-musl@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-linux-x64-musl@npm:1.10.6" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-win32-arm64-msvc@npm:1.9.3" +"@swc/core-win32-arm64-msvc@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-win32-arm64-msvc@npm:1.10.6" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-win32-ia32-msvc@npm:1.9.3" +"@swc/core-win32-ia32-msvc@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-win32-ia32-msvc@npm:1.10.6" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-win32-x64-msvc@npm:1.9.3" +"@swc/core-win32-x64-msvc@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-win32-x64-msvc@npm:1.10.6" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.9.3 - resolution: "@swc/core@npm:1.9.3" + version: 1.10.6 + resolution: "@swc/core@npm:1.10.6" dependencies: - "@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/core-darwin-arm64": 1.10.6 + "@swc/core-darwin-x64": 1.10.6 + "@swc/core-linux-arm-gnueabihf": 1.10.6 + "@swc/core-linux-arm64-gnu": 1.10.6 + "@swc/core-linux-arm64-musl": 1.10.6 + "@swc/core-linux-x64-gnu": 1.10.6 + "@swc/core-linux-x64-musl": 1.10.6 + "@swc/core-win32-arm64-msvc": 1.10.6 + "@swc/core-win32-ia32-msvc": 1.10.6 + "@swc/core-win32-x64-msvc": 1.10.6 "@swc/counter": ^0.1.3 "@swc/types": ^0.1.17 peerDependencies: @@ -2952,7 +2952,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 4d83aee0b4d9c543f247d680796e5b9cb69997369dcd81642c2603e185312dfb1674328a7ceb1d352c21275155a71789f76dafe8853055d076b6241d5760bbed + checksum: 574595e21c0b23904a8813b8c698aa32a66f47faa8c0e3b52c1cd2e2f764eb7cbc587d253a16070db18c518b55d9f88146ecf9a1b3e308471a8e2290078bc7e9 languageName: node linkType: hard @@ -8804,11 +8804,11 @@ __metadata: linkType: hard "nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" bin: nanoid: bin/nanoid.cjs - checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 + checksum: dfe0adbc0c77e9655b550c333075f51bb28cfc7568afbf3237249904f9c86c9aaaed1f113f0fddddba75673ee31c758c30c43d4414f014a52a7a626efc5958c9 languageName: node linkType: hard @@ -9836,14 +9836,14 @@ __metadata: linkType: hard "prism-react-renderer@npm:^2.1.0, prism-react-renderer@npm:^2.3.0": - version: 2.4.0 - resolution: "prism-react-renderer@npm:2.4.0" + version: 2.4.1 + resolution: "prism-react-renderer@npm:2.4.1" dependencies: "@types/prismjs": ^1.26.0 clsx: ^2.0.0 peerDependencies: react: ">=16.0.0" - checksum: d15d944a8cbf05f7b04deecd2cf4ffb08229a6027918641b6f046cd8ab24b65ca4ebe4ac8e95a53a7d7cefb1bba8df3ce394fe4f1d75418e34fa92553dc63ef7 + checksum: ddd5490a1335629addde9535db7872f0aee8dbce048818dd6e4c3972c779780af13d669c12d3f2fbb54c5b22d1578e50945099ef1a24dd445f33774e87d85e6e languageName: node linkType: hard diff --git a/mkdocs.yml b/mkdocs.yml index 748cdd8232..a7e693e5fc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -158,6 +158,10 @@ nav: - Reading Backstage Configuration: 'conf/reading.md' - Writing Backstage Configuration: 'conf/writing.md' - Defining Configuration for your Plugin: 'conf/defining.md' + - Notifications: + - Getting Started: 'notifications/index.md' + - Usage: 'notifications/usage.md' + - Processors: 'notifications/processors.md' - Authentication and identity: - Adding Authentication: 'auth/index.md' - Included providers: diff --git a/package.json b/package.json index 82038342d0..3ff22d8253 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.34.0-next.1", + "version": "1.35.0-next.2", "private": true, "repository": { "type": "git", diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index fae2ed578e..cbbe7e9562 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/app-defaults +## 1.5.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/theme@0.6.3 + +## 1.5.15 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.15.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-permission-react@0.4.29 + +## 1.5.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 1.5.15-next.1 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 32e11099bb..207da40eeb 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/app-defaults", - "version": "1.5.15-next.1", + "version": "1.5.16-next.0", "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 c3ff62c4c9..cc5ac8b148 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.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-components@0.16.3-next.0 + +## 0.0.18 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + +## 0.0.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + ## 0.0.18-next.1 ### Patch Changes diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index a70e35d2d2..22c0b7edf9 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.18-next.1", + "version": "0.0.19-next.0", "description": "Backstage internal example plugin", "backstage": { "role": "frontend-plugin", diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index 6c9e385cdc..3770cb564c 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,213 @@ # example-app-next +## 0.0.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.12.1-next.1 + - @backstage/plugin-scaffolder-react@1.14.3-next.2 + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.1 + - @backstage/plugin-api-docs@0.12.3-next.1 + - @backstage/plugin-scaffolder@1.27.4-next.2 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/frontend-app-api@0.10.4-next.0 + - @backstage/frontend-defaults@0.1.5-next.0 + - @backstage/plugin-app@0.1.5-next.0 + - @backstage/plugin-app-visualizer@0.1.15-next.0 + - @backstage/plugin-catalog-graph@0.4.15-next.1 + - @backstage/plugin-catalog-import@0.12.9-next.1 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-home@0.8.4-next.2 + - @backstage/plugin-kubernetes@0.12.3-next.1 + - @backstage/plugin-org@0.6.35-next.1 + - @backstage/plugin-search@1.4.22-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/plugin-user-settings@0.8.18-next.1 + - @backstage/app-defaults@1.5.16-next.0 + - @backstage/cli@0.29.5-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-auth-react@0.1.11-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.13-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.21-next.1 + - @backstage/plugin-notifications@0.5.1-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/plugin-signals@0.0.15-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.1 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/theme@0.6.3 + +## 0.0.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-home@0.8.4-next.1 + - @backstage/plugin-scaffolder-react@1.14.3-next.1 + - @backstage/plugin-scaffolder@1.27.4-next.1 + - @backstage/plugin-api-docs@0.12.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.0 + - @backstage/plugin-catalog-graph@0.4.15-next.0 + - @backstage/plugin-catalog-import@0.12.9-next.0 + - @backstage/plugin-kubernetes@0.12.3-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.21-next.0 + - @backstage/plugin-org@0.6.35-next.0 + - @backstage/plugin-search@1.4.22-next.0 + - @backstage/plugin-techdocs@1.12.1-next.0 + - @backstage/plugin-user-settings@0.8.18-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-app@0.1.4 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-notifications@0.5.0 + - @backstage/plugin-signals@0.0.14 + - @backstage/core-compat-api@0.3.4 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.0 + +## 0.0.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.8.4-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/plugin-scaffolder-react@1.14.3-next.0 + - @backstage/plugin-scaffolder@1.27.4-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.0 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-app-api@1.15.3 + - @backstage/core-compat-api@0.3.4 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-app-api@0.10.3 + - @backstage/frontend-defaults@0.1.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/integration-react@1.2.2 + - @backstage/theme@0.6.3 + - @backstage/plugin-api-docs@0.12.2 + - @backstage/plugin-app@0.1.4 + - @backstage/plugin-app-visualizer@0.1.14 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-graph@0.4.14 + - @backstage/plugin-catalog-import@0.12.8 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-kubernetes@0.12.2 + - @backstage/plugin-kubernetes-cluster@0.0.20 + - @backstage/plugin-notifications@0.5.0 + - @backstage/plugin-org@0.6.34 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search@1.4.21 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-search-react@1.8.4 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/plugin-techdocs-react@1.2.12 + - @backstage/plugin-user-settings@0.8.17 + +## 0.0.18 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/cli@0.29.4 + - @backstage/plugin-home@0.8.3 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/core-app-api@1.15.3 + - @backstage/plugin-app@0.1.4 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-scaffolder-react@1.14.2 + - @backstage/plugin-scaffolder@1.27.2 + - @backstage/plugin-search-react@1.8.4 + - @backstage/plugin-search@1.4.21 + - @backstage/plugin-notifications@0.5.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/plugin-api-docs@0.12.2 + - @backstage/core-components@0.16.2 + - @backstage/plugin-catalog-graph@0.4.14 + - @backstage/plugin-catalog-import@0.12.8 + - @backstage/plugin-kubernetes@0.12.2 + - @backstage/plugin-kubernetes-cluster@0.0.20 + - @backstage/plugin-org@0.6.34 + - @backstage/plugin-user-settings@0.8.17 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-app-api@0.10.3 + - @backstage/frontend-defaults@0.1.4 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-app-visualizer@0.1.14 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19 + - @backstage/plugin-techdocs-react@1.2.12 + +## 0.0.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-notifications@0.5.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/plugin-scaffolder@1.27.2-next.2 + - @backstage/plugin-api-docs@0.12.2-next.2 + - @backstage/plugin-catalog-graph@0.4.14-next.2 + - @backstage/plugin-catalog-import@0.12.8-next.2 + - @backstage/plugin-org@0.6.34-next.2 + - @backstage/plugin-user-settings@0.8.17-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-defaults@0.1.4-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-app@0.1.4-next.2 + - @backstage/plugin-app-visualizer@0.1.14-next.2 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.2 + - @backstage/plugin-home@0.8.3-next.2 + - @backstage/plugin-kubernetes@0.12.2-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.20-next.2 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-search@1.4.21-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-signals@0.0.14-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 0.0.18-next.1 ### Patch Changes diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 98b633f13f..621c759317 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.18-next.1", + "version": "0.0.19-next.2", "backstage": { "role": "frontend" }, diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index ae9fb7b63b..53964609ee 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,196 @@ # example-app +## 0.2.105-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.12.1-next.1 + - @backstage/plugin-scaffolder-react@1.14.3-next.2 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.1 + - @backstage/plugin-api-docs@0.12.3-next.1 + - @backstage/plugin-scaffolder@1.27.4-next.2 + - @backstage/frontend-app-api@0.10.4-next.0 + - @backstage/plugin-catalog-graph@0.4.15-next.1 + - @backstage/plugin-catalog-import@0.12.9-next.1 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-devtools@0.1.23-next.0 + - @backstage/plugin-home@0.8.4-next.2 + - @backstage/plugin-kubernetes@0.12.3-next.1 + - @backstage/plugin-org@0.6.35-next.1 + - @backstage/plugin-search@1.4.22-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/plugin-user-settings@0.8.18-next.1 + - @backstage/app-defaults@1.5.16-next.0 + - @backstage/cli@0.29.5-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-auth-react@0.1.11-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.13-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.21-next.1 + - @backstage/plugin-notifications@0.5.1-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/plugin-signals@0.0.15-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.1 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/theme@0.6.3 + +## 0.2.105-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-home@0.8.4-next.1 + - @backstage/plugin-scaffolder-react@1.14.3-next.1 + - @backstage/plugin-scaffolder@1.27.4-next.1 + - @backstage/plugin-api-docs@0.12.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.0 + - @backstage/plugin-catalog-graph@0.4.15-next.0 + - @backstage/plugin-catalog-import@0.12.9-next.0 + - @backstage/plugin-kubernetes@0.12.3-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.21-next.0 + - @backstage/plugin-org@0.6.35-next.0 + - @backstage/plugin-search@1.4.22-next.0 + - @backstage/plugin-techdocs@1.12.1-next.0 + - @backstage/plugin-user-settings@0.8.18-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-devtools@0.1.22 + - @backstage/plugin-notifications@0.5.0 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.0 + +## 0.2.105-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.8.4-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/plugin-scaffolder-react@1.14.3-next.0 + - @backstage/plugin-scaffolder@1.27.4-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.0 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-app-api@1.15.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-app-api@0.10.3 + - @backstage/integration-react@1.2.2 + - @backstage/theme@0.6.3 + - @backstage/plugin-api-docs@0.12.2 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-graph@0.4.14 + - @backstage/plugin-catalog-import@0.12.8 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-devtools@0.1.22 + - @backstage/plugin-kubernetes@0.12.2 + - @backstage/plugin-kubernetes-cluster@0.0.20 + - @backstage/plugin-notifications@0.5.0 + - @backstage/plugin-org@0.6.34 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search@1.4.21 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-search-react@1.8.4 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/plugin-techdocs-react@1.2.12 + - @backstage/plugin-user-settings@0.8.17 + +## 0.2.104 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/cli@0.29.4 + - @backstage/plugin-home@0.8.3 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/core-app-api@1.15.3 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-scaffolder-react@1.14.2 + - @backstage/plugin-scaffolder@1.27.2 + - @backstage/plugin-search-react@1.8.4 + - @backstage/plugin-search@1.4.21 + - @backstage/plugin-notifications@0.5.0 + - @backstage/theme@0.6.3 + - @backstage/plugin-api-docs@0.12.2 + - @backstage/core-components@0.16.2 + - @backstage/plugin-catalog-graph@0.4.14 + - @backstage/plugin-catalog-import@0.12.8 + - @backstage/plugin-kubernetes@0.12.2 + - @backstage/plugin-kubernetes-cluster@0.0.20 + - @backstage/plugin-org@0.6.34 + - @backstage/plugin-user-settings@0.8.17 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-app-api@0.10.3 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-devtools@0.1.22 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19 + - @backstage/plugin-techdocs-react@1.2.12 + +## 0.2.104-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-notifications@0.5.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/plugin-scaffolder@1.27.2-next.2 + - @backstage/plugin-api-docs@0.12.2-next.2 + - @backstage/plugin-catalog-graph@0.4.14-next.2 + - @backstage/plugin-catalog-import@0.12.8-next.2 + - @backstage/plugin-org@0.6.34-next.2 + - @backstage/plugin-user-settings@0.8.17-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.2 + - @backstage/plugin-devtools@0.1.22-next.2 + - @backstage/plugin-home@0.8.3-next.2 + - @backstage/plugin-kubernetes@0.12.2-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.20-next.2 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-search@1.4.21-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-signals@0.0.14-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 0.2.104-next.1 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index b73a936a84..25c40c08c8 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.104-next.1", + "version": "0.2.105-next.2", "backstage": { "role": "frontend" }, diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index ccf06b17bd..7e914bdc9b 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -164,7 +164,10 @@ const routes = ( /> } /> - } /> + } + /> } diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 6f17ee737d..c675aeddb3 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,76 @@ # @backstage/backend-app-api +## 1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/cli-common@0.1.15 + +## 1.1.1-next.0 + +### Patch Changes + +- 02534c7: Corrected spelling mistake in error message +- Updated dependencies + - @backstage/config-loader@1.9.5-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 1.1.0 + +### Minor Changes + +- ebf083d: Service factories added by feature loaders now have lower priority and will be ignored if a factory for the same service is added directly by `backend.add(serviceFactory)`. +- 12eac85: **EXPERIMENTAL**: Adds a new `instanceMetadataService` to hold information about a specific backend instance. + +### Patch Changes + +- eef3ef1: Removed unused `express` dependencies. +- ae2408b: Add a `toString` on the default `BackendFeatureMeta` implementations +- 5c9cc05: Use native fetch instead of node-fetch +- 0e9c9fa: As soon as a backend termination signal is received, call before shutting down root lifecycle hooks. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 1.1.0-next.2 + +### Minor Changes + +- ebf083d: Service factories added by feature loaders now have lower priority and will be ignored if a factory for the same service is added directly by `backend.add(serviceFactory)`. + +### Patch Changes + +- 0e9c9fa: As soon as a backend termination signal is received, call before shutting down root lifecycle hooks. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 1.1.0-next.1 ### Minor Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 60005fed34..7595af8ecc 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-app-api", - "version": "1.1.0-next.1", + "version": "1.1.1-next.1", "description": "Core API used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts index f6d65e883e..39a54747d5 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts @@ -14,42 +14,38 @@ * limitations under the License. */ -import { rootLifecycleServiceFactory } from '@backstage/backend-defaults/rootLifecycle'; -import { lifecycleServiceFactory } from '@backstage/backend-defaults/lifecycle'; -import { loggerServiceFactory } from '@backstage/backend-defaults/logger'; import { createServiceRef, createServiceFactory, - coreServices, createBackendPlugin, createBackendModule, createExtensionPoint, createBackendFeatureLoader, + ServiceRef, } from '@backstage/backend-plugin-api'; import { BackendInitializer } from './BackendInitializer'; import { instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; - -class MockLogger { - debug() {} - info() {} - warn() {} - error() {} - child() { - return this; - } -} +import { mockServices } from '@backstage/backend-test-utils'; const baseFactories = [ - lifecycleServiceFactory, - rootLifecycleServiceFactory, - createServiceFactory({ - service: coreServices.rootLogger, - deps: {}, - factory: () => new MockLogger(), - }), - loggerServiceFactory, + mockServices.rootLifecycle.factory(), + mockServices.lifecycle.factory(), + mockServices.rootLogger.factory(), + mockServices.logger.factory(), ]; +function mkNoopFactory(ref: ServiceRef<{}, 'plugin'>) { + const fn = jest.fn().mockReturnValue({}); + return Object.assign( + fn, + createServiceFactory({ + service: ref, + deps: {}, + factory: fn, + }), + ); +} + const testPlugin = createBackendPlugin({ pluginId: 'test', register(reg) { @@ -167,6 +163,151 @@ describe('BackendInitializer', () => { expect(moduleInit).toHaveBeenCalled(); }); + it('should ignore services provided by feature loaders that have already been explicitly added', async () => { + const ref = createServiceRef<{}>({ id: '1' }); + const factory1 = mkNoopFactory(ref); + const factory2 = mkNoopFactory(ref); + const factory3 = mkNoopFactory(ref); + + const init = new BackendInitializer([...baseFactories, factory1]); + init.add(factory2); + init.add( + createBackendFeatureLoader({ + deps: {}, + *loader() { + yield factory3; + }, + }), + ); + init.add( + createBackendPlugin({ + pluginId: 'tester', + register(reg) { + reg.registerInit({ + deps: { ref }, + async init() {}, + }); + }, + }), + ); + + await init.start(); + + expect(factory1).not.toHaveBeenCalled(); + expect(factory2).toHaveBeenCalled(); + expect(factory3).not.toHaveBeenCalled(); + }); + + it('should include all multiton service factories', async () => { + expect.assertions(5); + + const ref = createServiceRef({ id: '1', multiton: true }); + const factory1 = mkNoopFactory(ref).mockResolvedValue(1); + const factory2 = mkNoopFactory(ref).mockResolvedValue(2); + const factory3 = mkNoopFactory(ref).mockResolvedValue(3); + const factory4 = mkNoopFactory(ref).mockResolvedValue(4); + + const init = new BackendInitializer([...baseFactories, factory1]); + init.add(factory2); + init.add( + createBackendFeatureLoader({ + deps: {}, + *loader() { + yield factory3; + yield factory4; + }, + }), + ); + init.add( + createBackendPlugin({ + pluginId: 'tester', + register(reg) { + reg.registerInit({ + deps: { ns: ref }, + async init({ ns }) { + expect(ns).toEqual([1, 2, 3, 4]); + }, + }); + }, + }), + ); + + await init.start(); + + expect(factory1).toHaveBeenCalled(); + expect(factory2).toHaveBeenCalled(); + expect(factory3).toHaveBeenCalled(); + expect(factory4).toHaveBeenCalled(); + }); + + // Note: this is an important escape hatch in case to loaders conflict and you need to select the winning service factory + it('should allow duplicate service from feature loaders if overridden', async () => { + const ref = createServiceRef<{}>({ id: '1' }); + const factory1 = mkNoopFactory(ref); + const factory2 = mkNoopFactory(ref); + const factory3 = mkNoopFactory(ref); + const factory4 = mkNoopFactory(ref); + + const init = new BackendInitializer([...baseFactories, factory1]); + init.add(factory2); + init.add( + createBackendFeatureLoader({ + deps: {}, + *loader() { + yield factory3; + yield factory4; + }, + }), + ); + init.add( + createBackendPlugin({ + pluginId: 'tester', + register(reg) { + reg.registerInit({ + deps: { ref }, + async init() {}, + }); + }, + }), + ); + + await init.start(); + + expect(factory1).not.toHaveBeenCalled(); + expect(factory2).toHaveBeenCalled(); + expect(factory3).not.toHaveBeenCalled(); + expect(factory4).not.toHaveBeenCalled(); + }); + + it('should reject duplicate service factories from feature loader without an explicit override', async () => { + const ref = createServiceRef<{}>({ id: '1' }); + const factory1 = mkNoopFactory(ref); + const factory2 = mkNoopFactory(ref); + const factory3 = mkNoopFactory(ref); + + const init = new BackendInitializer([...baseFactories, factory1]); + init.add( + createBackendFeatureLoader({ + deps: {}, + *loader() { + yield factory2; + }, + }), + ); + init.add( + createBackendFeatureLoader({ + deps: {}, + *loader() { + yield factory3; + }, + }), + ); + + await expect(init.start()).rejects.toThrow( + 'Duplicate service implementations provided for 1 by both feature loader created at', + ); + }); + it('should refuse to override already initialized services through loaded features', async () => { const ref1 = createServiceRef<{ x: number }>({ id: '1', @@ -549,12 +690,8 @@ describe('BackendInitializer', () => { const extA = createExtensionPoint({ id: 'a' }); const extB = createExtensionPoint({ id: 'b' }); const init = new BackendInitializer([ - rootLifecycleServiceFactory, - createServiceFactory({ - service: coreServices.rootLogger, - deps: {}, - factory: () => new MockLogger(), - }), + mockServices.rootLifecycle.factory(), + mockServices.rootLogger.factory(), ]); init.add(testPlugin); init.add( @@ -727,7 +864,7 @@ describe('BackendInitializer', () => { }); it('should properly add plugins + modules to the instance metadata service', async () => { - expect.assertions(1); + expect.assertions(2); const backend = new BackendInitializer(baseFactories); const plugin = createBackendPlugin({ pluginId: 'test', @@ -761,6 +898,13 @@ describe('BackendInitializer', () => { type: 'plugin', }, ]); + expect(instanceMetadata.getInstalledFeatures().map(String)).toEqual( + [ + 'plugin{pluginId=test}', + 'module{moduleId=test,pluginId=test}', + 'plugin{pluginId=instance-metadata}', + ], + ); }, }); }, diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 3e7b46fc9e..aa48c26877 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -111,13 +111,33 @@ function createInstanceMetadataServiceFactory( .getRegistrations() .map(feature => { if (feature.type === 'plugin') { - return { type: 'plugin', pluginId: feature.pluginId }; + return Object.defineProperty( + { + type: 'plugin', + pluginId: feature.pluginId, + }, + 'toString', + { + enumerable: false, + configurable: true, + value: () => `plugin{pluginId=${feature.pluginId}}`, + }, + ); } else if (feature.type === 'module') { - return { - type: 'module', - pluginId: feature.pluginId, - moduleId: feature.moduleId, - }; + return Object.defineProperty( + { + type: 'module', + pluginId: feature.pluginId, + moduleId: feature.moduleId, + }, + 'toString', + { + enumerable: false, + configurable: true, + value: () => + `module{moduleId=${feature.moduleId},pluginId=${feature.pluginId}}`, + }, + ); } // Ignore unknown feature types. return undefined; @@ -449,6 +469,11 @@ export class BackendInitializer { // The startup failed, but we may still want to do cleanup so we continue silently } + const rootLifecycleService = await this.#getRootLifecycleImpl(); + + // Root services like the health one need to immediatelly be notified of the shutdown + await rootLifecycleService.beforeShutdown(); + // Get all plugins. const allPlugins = new Set(); for (const feature of this.#registrations) { @@ -468,14 +493,14 @@ export class BackendInitializer { ); // Once all plugin shutdown hooks are done, run root shutdown hooks. - const lifecycleService = await this.#getRootLifecycleImpl(); - await lifecycleService.shutdown(); + await rootLifecycleService.shutdown(); } // Bit of a hacky way to grab the lifecycle services, potentially find a nicer way to do this async #getRootLifecycleImpl(): Promise< RootLifecycleService & { startup(): Promise; + beforeShutdown(): Promise; shutdown(): Promise; } > { @@ -519,6 +544,11 @@ export class BackendInitializer { } async #applyBackendFeatureLoaders(loaders: InternalBackendFeatureLoader[]) { + const servicesAddedByLoaders = new Map< + string, + InternalBackendFeatureLoader + >(); + for (const loader of loaders) { const deps = new Map(); const missingRefs = new Set(); @@ -564,8 +594,32 @@ export class BackendInitializer { if (isBackendFeatureLoader(feature)) { newLoaders.push(feature); } else { - didAddServiceFactory ||= isServiceFactory(feature); - this.#addFeature(feature); + // This block makes sure that feature loaders do not provide duplicate + // implementations for the same service, but at the same time allows + // service factories provided by feature loaders to be overridden by + // ones that are explicitly installed with backend.add(serviceFactory). + // + // If a factory has already been explicitly installed, the service + // factory provided by the loader will simply be ignored. + if (isServiceFactory(feature) && !feature.service.multiton) { + const conflictingLoader = servicesAddedByLoaders.get( + feature.service.id, + ); + if (conflictingLoader) { + throw new Error( + `Duplicate service implementations provided for ${feature.service.id} by both feature loader ${loader.description} and feature loader ${conflictingLoader.description}`, + ); + } + + // Check that this service wasn't already explicitly added by backend.add(serviceFactory) + if (!this.#serviceRegistry.hasBeenAdded(feature.service)) { + didAddServiceFactory = true; + servicesAddedByLoaders.set(feature.service.id, loader); + this.#addFeature(feature); + } + } else { + this.#addFeature(feature); + } } } diff --git a/packages/backend-app-api/src/wiring/ServiceRegistry.ts b/packages/backend-app-api/src/wiring/ServiceRegistry.ts index 0abd5605ae..c4b9dcb2a3 100644 --- a/packages/backend-app-api/src/wiring/ServiceRegistry.ts +++ b/packages/backend-app-api/src/wiring/ServiceRegistry.ts @@ -22,8 +22,8 @@ import { } from '@backstage/backend-plugin-api'; import { ConflictError, stringifyError } from '@backstage/errors'; // Direct internal import to avoid duplication -// eslint-disable-next-line @backstage/no-forbidden-package-imports -import { InternalServiceFactory } from '@backstage/backend-plugin-api/src/services/system/types'; +// eslint-disable-next-line @backstage/no-relative-monorepo-imports +import { InternalServiceFactory } from '../../../backend-plugin-api/src/services/system/types'; import { DependencyGraph } from '../lib/DependencyGraph'; /** * Keep in sync with `@backstage/backend-plugin-api/src/services/system/types.ts` @@ -191,6 +191,13 @@ export class ServiceRegistry { } } + hasBeenAdded(ref: ServiceRef) { + if (ref.id === coreServices.pluginMetadata.id) { + return true; + } + return this.#addedFactoryIds.has(ref.id); + } + add(factory: ServiceFactory) { const factoryId = factory.service.id; if (factoryId === coreServices.pluginMetadata.id) { diff --git a/packages/backend-app-api/src/wiring/createInitializationLogger.ts b/packages/backend-app-api/src/wiring/createInitializationLogger.ts index de323f914b..2a472dec5b 100644 --- a/packages/backend-app-api/src/wiring/createInitializationLogger.ts +++ b/packages/backend-app-api/src/wiring/createInitializationLogger.ts @@ -75,7 +75,7 @@ export function createInitializationLogger( ? `, waiting for ${starting.size} other plugins to finish before shutting down the process` : ''; logger?.error( - `Plugin '${pluginId}' thew an error during startup${status}`, + `Plugin '${pluginId}' threw an error during startup${status}`, ); }, onAllStarted() { diff --git a/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts b/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts index 1fd7fcbbec..32c1fbcd0e 100644 --- a/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts +++ b/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts @@ -36,6 +36,7 @@ describe('createSpecializedBackend', () => { deps: {}, factory: async () => ({ addStartupHook: () => {}, + addBeforeShutdownHook: () => {}, addShutdownHook: () => {}, }), }), @@ -44,6 +45,7 @@ describe('createSpecializedBackend', () => { deps: {}, factory: async () => ({ addStartupHook: () => {}, + addBeforeShutdownHook: () => {}, addShutdownHook: () => {}, }), }), diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 693ece9cd0..485def32bd 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,154 @@ # @backstage/backend-defaults +## 0.7.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-app-api@1.1.1-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/cli-node@0.2.12-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/cli-common@0.1.15 + - @backstage/integration@1.16.1-next.0 + +## 0.7.0-next.0 + +### Minor Changes + +- ec547b8: Ensure that an error handler middleware exists at the end of each plugin `httpRouter` handler chain. This makes it so that exceptions thrown by plugin routes are caught and encoded in the standard error format. + + If you were using the standard `MiddlewareFactory` just to put an `error` middleware in you router, you can now remove that at your earliest convenience since it's redundant. If you have custom error handlers in your plugin router, those will continue to function as previously. If you were relying on thrown errors propagating all the way down to the root HTTP router, you will find that they no longer do that, and may want to hoist your error handling up to the plugin level instead. + +### Patch Changes + +- 575613f: Go back to using `node-fetch` for gitlab +- 8ecf8cb: Exclude `@backstage/backend-common` from schema collection if `@backstage/backend-defaults` is present +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/backend-app-api@1.1.1-next.0 + - @backstage/config-loader@1.9.5-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.11 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.6.0 + +### Minor Changes + +- fd5d337: 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. + +- 3f34ea9: Throttles Bitbucket Server API calls +- 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 + ``` + +- 29180ec: **BREAKING PRODUCERS**: The `LifecycleMiddlewareOptions.startupRequestPauseTimeout` has been removed. Use the `backend.lifecycle.startupRequestPauseTimeout` setting in your `app-config.yaml` file to customize how the `createLifecycleMiddleware` function should behave. Also the root config service is required as an option when calling the `createLifecycleMiddleware` function: + + ```diff + - createLifecycleMiddleware({ lifecycle, startupRequestPauseTimeout }) + + createLifecycleMiddleware({ config, lifecycle }) + ``` + +- 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 + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 5b1e68c: Immediately close all connections when shutting down in local development. +- 8863b38: Export `PluginTokenHandler` and `pluginTokenHandlerDecoratorServiceRef` to allow for custom decoration of the plugin token handler without having to re-implement the entire handler. +- 29180ec: Fix server response time by moving the lifecycle startup hooks back to the plugin lifecycle service. +- 57e0b11: 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. +- 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`. +- 57e0b11: The default `authServiceFactory` now correctly depends on the plugin scoped `Logger` services rather than the root scoped one. +- 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 +- 0e9c9fa: Implements the `DefaultRootLifecycleService.addBeforeShutdownHook` method, and updates `DefaultRootHttpRouterService` and `DefaultRootHealthService` to listen to that event to stop accepting traffic and close service connections. +- d0cbd82: Remove use of the `stoppable` library on the `DefaultRootHttpRouterService` as Node's native http server [close](https://nodejs.org/api/http.html#serverclosecallback) method already drains requests. +- 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/integration@1.16.0 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/backend-app-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/cli-node@0.2.11 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + +## 0.6.0-next.2 + +### Minor Changes + +- fd5d337: 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. + +- 3f34ea9: Throttles Bitbucket Server API calls + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 57e0b11: 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. +- 57e0b11: The default `authServiceFactory` now correctly depends on the plugin scoped `Logger` services rather than the root scoped one. +- 0e9c9fa: Implements the `DefaultRootLifecycleService.addBeforeShutdownHook` method, and updates `DefaultRootHttpRouterService` and `DefaultRootHealthService` to listen to that event to stop accepting traffic and close service connections. +- d0cbd82: Remove use of the `stoppable` library on the `DefaultRootHttpRouterService` as Node's native http server [close](https://nodejs.org/api/http.html#serverclosecallback) method already drains requests. + Also, we pass a new `lifecycleMiddleware` to the `rootHttpRouterServiceFactory` configure function that must be called manually if you don't call `applyDefaults`. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + ## 0.6.0-next.1 ### Patch Changes diff --git a/packages/backend-defaults/config.d.ts b/packages/backend-defaults/config.d.ts index 8272bc5ca8..aa97313921 100644 --- a/packages/backend-defaults/config.d.ts +++ b/packages/backend-defaults/config.d.ts @@ -28,6 +28,29 @@ export interface Config { */ baseUrl: string; + lifecycle?: { + /** + * The maximum time that paused requests will wait for the service to start, before returning an error. + * Defaults to 5 seconds + * Supported formats: + * - A string in the format of '1d', '2 seconds' etc. as supported by the `ms` + * library. + * - A standard ISO formatted duration string, e.g. 'P2DT6H' or 'PT1M'. + * - An object with individual units (in plural) as keys, e.g. `{ days: 2, hours: 6 }`. + */ + startupRequestPauseTimeout?: string | HumanDuration; + /** + * The minimum time that the HTTP server will delay the shutdown of the backend. During this delay health checks will be set to failing, allowing traffic to drain. + * Defaults to 0 seconds. + * Supported formats: + * - A string in the format of '1d', '2 seconds' etc. as supported by the `ms` + * library. + * - A standard ISO formatted duration string, e.g. 'P2DT6H' or 'PT1M'. + * - An object with individual units (in plural) as keys, e.g. `{ days: 2, hours: 6 }`. + */ + serverShutdownDelay?: string | HumanDuration; + }; + /** Address that the backend should listen to. */ listen?: | string @@ -63,6 +86,19 @@ export interface Config { * Options used by the default auth, httpAuth and userInfo services. */ auth?: { + /** + * Keys shared by all backends for signing and validating backend tokens. + * @deprecated this will be removed when the backwards compatibility is no longer needed with backend-common + */ + keys?: { + /** + * Secret for generating tokens. Should be a base64 string, recommended + * length is 24 bytes. + * + * @visibility secret + */ + secret: string; + }[]; /** * This disables the otherwise default auth policy, which requires all * requests to be authenticated with either user or service credentials. @@ -552,6 +588,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 d8240c429c..e29bb0da81 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-defaults", - "version": "0.6.0-next.1", + "version": "0.7.0-next.1", "description": "Backend defaults used by Backstage backend apps", "backstage": { "role": "node-library" @@ -169,13 +169,13 @@ "node-fetch": "^2.7.0", "node-forge": "^1.3.1", "p-limit": "^3.1.0", + "p-throttle": "^4.1.1", "path-to-regexp": "^8.0.0", "pg": "^8.11.3", "pg-connection-string": "^2.3.0", "pg-format": "^1.0.4", "raw-body": "^2.4.1", "selfsigned": "^2.0.0", - "stoppable": "^1.1.0", "tar": "^6.1.12", "triple-beam": "^1.4.1", "uuid": "^11.0.0", diff --git a/packages/backend-defaults/report-httpRouter.api.md b/packages/backend-defaults/report-httpRouter.api.md index 4f6c6f06dc..55c3f0b208 100644 --- a/packages/backend-defaults/report-httpRouter.api.md +++ b/packages/backend-defaults/report-httpRouter.api.md @@ -10,7 +10,6 @@ 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'; @@ -51,9 +50,10 @@ export const httpRouterServiceFactory: ServiceFactory< // @public export interface LifecycleMiddlewareOptions { + // (undocumented) + config: RootConfigService; // (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/src/CreateBackend.test.ts b/packages/backend-defaults/src/CreateBackend.test.ts index 55fdbe5a6a..57977e9647 100644 --- a/packages/backend-defaults/src/CreateBackend.test.ts +++ b/packages/backend-defaults/src/CreateBackend.test.ts @@ -47,6 +47,7 @@ describe('createBackend', () => { deps: {}, factory: async () => ({ addStartupHook: () => {}, + addBeforeShutdownHook: () => {}, addShutdownHook: () => {}, }), }), @@ -57,6 +58,7 @@ describe('createBackend', () => { deps: {}, factory: async () => ({ addStartupHook: () => {}, + addBeforeShutdownHook: () => {}, addShutdownHook: () => {}, }), }), diff --git a/packages/backend-defaults/src/entrypoints/auth/JwksClient.ts b/packages/backend-defaults/src/entrypoints/auth/JwksClient.ts index 44f0082424..f956ceb70a 100644 --- a/packages/backend-defaults/src/entrypoints/auth/JwksClient.ts +++ b/packages/backend-defaults/src/entrypoints/auth/JwksClient.ts @@ -22,7 +22,7 @@ import { FlattenedJWSInput, JWSHeaderParameters, } from 'jose'; -import { GetKeyFunction } from 'jose/dist/types/types'; +import { GetKeyFunction } from 'jose'; const CLOCK_MARGIN_S = 10; diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts index 38b8862a4c..a244614135 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts @@ -109,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'); @@ -134,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({ diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts index 129f0a8c95..91910292e6 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts @@ -59,7 +59,7 @@ 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, @@ -89,6 +89,7 @@ export const authServiceFactory = createServiceFactory({ const userTokens = UserTokenHandler.create({ discovery, + logger, }); const pluginTokens = pluginTokenHandlerDecorator( diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts index 281dca6d9e..9aec52bc08 100644 --- a/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts @@ -120,7 +120,8 @@ export class DefaultPluginTokenHandler implements 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 }; diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.ts index 658a88a368..eb863a807a 100644 --- a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.ts +++ b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.ts @@ -18,7 +18,7 @@ import { Config } from '@backstage/config'; import { HumanDuration, durationToMilliseconds } from '@backstage/types'; import { promises as fs } from 'fs'; import { JWK, exportJWK, importPKCS8, importSPKI } from 'jose'; -import { KeyLike } from 'jose/dist/types/types'; +import { KeyLike } from 'jose'; import { KeyPayload } from './types'; import { PluginKeySource } from './types'; 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/database/DatabaseManager.ts b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts index 75e7d35eee..5ca70cab86 100644 --- a/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts +++ b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts @@ -28,7 +28,7 @@ import { Knex } from 'knex'; import { MysqlConnector } from './connectors/mysql'; import { PgConnector } from './connectors/postgres'; import { Sqlite3Connector } from './connectors/sqlite3'; -import { Connector, PluginDatabaseManager } from './types'; +import { Connector } from './types'; /** * Provides a config lookup path for a plugin's config block. @@ -72,7 +72,7 @@ export class DatabaseManagerImpl { } /** - * Generates a PluginDatabaseManager for consumption by plugins. + * Generates a DatabaseService for consumption by plugins. * * @param pluginId - The plugin that the database manager should be created for. Plugin names * should be unique as they are used to look up database config overrides under @@ -84,7 +84,7 @@ export class DatabaseManagerImpl { logger: LoggerService; lifecycle: LifecycleService; }, - ): PluginDatabaseManager { + ): DatabaseService { const client = this.getClientType(pluginId).client; const connector = this.connectors[client]; if (!connector) { @@ -265,7 +265,7 @@ export class DatabaseManager { private constructor(private readonly impl: DatabaseManagerImpl) {} /** - * Generates a PluginDatabaseManager for consumption by plugins. + * Generates a DatabaseService for consumption by plugins. * * @param pluginId - The plugin that the database manager should be created for. Plugin names * should be unique as they are used to look up database config overrides under @@ -277,7 +277,7 @@ export class DatabaseManager { logger: LoggerService; lifecycle: LifecycleService; }, - ): PluginDatabaseManager { + ): DatabaseService { return this.impl.forPlugin(pluginId, deps); } } diff --git a/packages/backend-defaults/src/entrypoints/database/types.ts b/packages/backend-defaults/src/entrypoints/database/types.ts index beded85d65..2a264ed928 100644 --- a/packages/backend-defaults/src/entrypoints/database/types.ts +++ b/packages/backend-defaults/src/entrypoints/database/types.ts @@ -17,8 +17,6 @@ import { LifecycleService, LoggerService } from '@backstage/backend-plugin-api'; import { Knex } from 'knex'; -export type { DatabaseService as PluginDatabaseManager } from '@backstage/backend-plugin-api'; - export interface Connector { getClient( pluginId: string, diff --git a/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts b/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts index 47793c82f7..b6c2c38d8a 100644 --- a/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts +++ b/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts @@ -24,7 +24,7 @@ import { readHttpServerOptions } from '../rootHttpRouter/http/config'; type Target = string | { internal: string; external: string }; /** - * HostDiscovery is a basic PluginEndpointDiscovery implementation + * HostDiscovery is a basic DiscoveryService implementation * that can handle plugins that are hosted in a single or multiple deployments. * * The deployment may be scaled horizontally, as long as the external URL diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.test.ts b/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.test.ts new file mode 100644 index 0000000000..31eecf14bb --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.test.ts @@ -0,0 +1,81 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createLifecycleMiddleware } from './createLifecycleMiddleware'; +import { BackendLifecycleImpl } from '../rootLifecycle/rootLifecycleServiceFactory'; +import { mockServices } from '@backstage/backend-test-utils'; +import { ServiceUnavailableError } from '@backstage/errors'; + +describe('createLifecycleMiddleware', () => { + it('should pause requests when plugin is not ready', async () => { + const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); + + const middleware = createLifecycleMiddleware({ lifecycle }); + + const next = jest.fn(); + middleware({} as any, {} as any, next); + expect(next).not.toHaveBeenCalled(); + await lifecycle.startup(); + + // pending call + expect(next).toHaveBeenCalledWith(); + + // new call + const next2 = jest.fn(); + middleware({} as any, {} as any, next2); + expect(next2).toHaveBeenCalledWith(); + }); + + it('should throw ServiceUnavailableError after shutdown', async () => { + const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); + const middleware = createLifecycleMiddleware({ lifecycle }); + + const next = jest.fn(); + middleware({} as any, {} as any, next); + expect(next).not.toHaveBeenCalled(); + await lifecycle.shutdown(); + + // pending call + expect(next).toHaveBeenCalledWith( + new ServiceUnavailableError('Service is shutting down'), + ); + + // new call + const next2 = jest.fn(); + middleware({} as any, {} as any, next2); + expect(next2).toHaveBeenCalledWith( + new ServiceUnavailableError('Service is shutting down'), + ); + }); + + it('should throw ServiceUnavailableError after timeout', async () => { + const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); + const middleware = createLifecycleMiddleware({ + lifecycle, + startupRequestPauseTimeout: { milliseconds: 1 }, + }); + + const next = jest.fn(); + middleware({} as any, {} as any, next); + expect(next).not.toHaveBeenCalled(); + + await new Promise(r => setTimeout(r, 2)); + + expect(next).toHaveBeenCalledWith( + new ServiceUnavailableError('Service has not started up yet'), + ); + }); +}); diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.ts b/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.ts new file mode 100644 index 0000000000..99fb82a41e --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.ts @@ -0,0 +1,108 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { RootLifecycleService } from '@backstage/backend-plugin-api'; +import { ServiceUnavailableError } from '@backstage/errors'; +import { HumanDuration, durationToMilliseconds } from '@backstage/types'; +import { RequestHandler } from 'express'; + +export const DEFAULT_STARTUP_REQUEST_PAUSE_TIMEOUT = { seconds: 5 }; +export const DEFAULT_SERVER_SHUTDOWN_TIMEOUT = { seconds: 0 }; + +/** + * Options for {@link createLifecycleMiddleware}. + * @public + */ +export interface LifecycleMiddlewareOptions { + lifecycle: RootLifecycleService; + /** + * The maximum time that paused requests will wait for the service to start, before returning an error. + * + * Defaults to 5 seconds. + */ + startupRequestPauseTimeout?: HumanDuration; +} + +/** + * Creates a middleware that pauses requests until the service has started. + * + * @remarks + * + * Requests that arrive before the service has started will be paused until startup is complete. + * If the service does not start within the provided timeout, the request will be rejected with a + * {@link @backstage/errors#ServiceUnavailableError}. + * + * If the service is shutting down, all requests will be rejected with a + * {@link @backstage/errors#ServiceUnavailableError}. + * + * @public + */ +export function createLifecycleMiddleware( + options: LifecycleMiddlewareOptions, +): RequestHandler { + const { lifecycle, startupRequestPauseTimeout } = options; + + let state: 'init' | 'up' | 'down' = 'init'; + const waiting = new Set<{ + next: (err?: Error) => void; + timeout: NodeJS.Timeout; + }>(); + + lifecycle.addStartupHook(async () => { + if (state === 'init') { + state = 'up'; + for (const item of waiting) { + clearTimeout(item.timeout); + item.next(); + } + waiting.clear(); + } + }); + + lifecycle.addShutdownHook(async () => { + state = 'down'; + for (const item of waiting) { + clearTimeout(item.timeout); + item.next(new ServiceUnavailableError('Service is shutting down')); + } + waiting.clear(); + }); + + return (_req, _res, next) => { + if (state === 'up') { + next(); + return; + } else if (state === 'down') { + next(new ServiceUnavailableError('Service is shutting down')); + return; + } + + const timeoutMs = durationToMilliseconds( + startupRequestPauseTimeout ?? DEFAULT_STARTUP_REQUEST_PAUSE_TIMEOUT, + ); + + const item = { + next, + timeout: setTimeout(() => { + if (waiting.delete(item)) { + next(new ServiceUnavailableError('Service has not started up yet')); + } + }, timeoutMs), + }; + + waiting.add(item); + }; +} diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.test.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.test.ts index 3b85c8cb92..36ca2da61b 100644 --- a/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.test.ts +++ b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.test.ts @@ -20,10 +20,14 @@ import { mockServices } from '@backstage/backend-test-utils'; import { ServiceUnavailableError } from '@backstage/errors'; describe('createLifecycleMiddleware', () => { + const config = mockServices.rootConfig.mock(); it('should pause requests when plugin is not ready', async () => { const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); - const middleware = createLifecycleMiddleware({ lifecycle }); + const middleware = createLifecycleMiddleware({ + config, + lifecycle, + }); const next = jest.fn(); middleware({} as any, {} as any, next); @@ -41,7 +45,7 @@ describe('createLifecycleMiddleware', () => { it('should throw ServiceUnavailableError after shutdown', async () => { const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); - const middleware = createLifecycleMiddleware({ lifecycle }); + const middleware = createLifecycleMiddleware({ config, lifecycle }); const next = jest.fn(); middleware({} as any, {} as any, next); @@ -65,7 +69,15 @@ describe('createLifecycleMiddleware', () => { const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); const middleware = createLifecycleMiddleware({ lifecycle, - startupRequestPauseTimeout: { milliseconds: 1 }, + config: mockServices.rootConfig({ + data: { + backend: { + lifecycle: { + startupRequestPauseTimeout: { milliseconds: 1 }, + }, + }, + }, + }), }); const next = jest.fn(); diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.ts index 3f8ee3ea69..366d19f8bf 100644 --- a/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.ts +++ b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.ts @@ -14,7 +14,11 @@ * limitations under the License. */ -import { LifecycleService } from '@backstage/backend-plugin-api'; +import { + RootConfigService, + LifecycleService, +} from '@backstage/backend-plugin-api'; +import { readDurationFromConfig } from '@backstage/config'; import { ServiceUnavailableError } from '@backstage/errors'; import { HumanDuration, durationToMilliseconds } from '@backstage/types'; import { RequestHandler } from 'express'; @@ -26,13 +30,8 @@ export const DEFAULT_TIMEOUT = { seconds: 5 }; * @public */ export interface LifecycleMiddlewareOptions { + config: RootConfigService; lifecycle: LifecycleService; - /** - * The maximum time that paused requests will wait for the service to start, before returning an error. - * - * Defaults to 5 seconds. - */ - startupRequestPauseTimeout?: HumanDuration; } /** @@ -52,7 +51,7 @@ export interface LifecycleMiddlewareOptions { export function createLifecycleMiddleware( options: LifecycleMiddlewareOptions, ): RequestHandler { - const { lifecycle, startupRequestPauseTimeout = DEFAULT_TIMEOUT } = options; + const { config, lifecycle } = options; let state: 'init' | 'up' | 'down' = 'init'; const waiting = new Set<{ @@ -81,6 +80,14 @@ export function createLifecycleMiddleware( waiting.clear(); }); + let startupRequestPauseTimeout: HumanDuration = DEFAULT_TIMEOUT; + + if (config.has('backend.lifecycle.startupRequestPauseTimeout')) { + startupRequestPauseTimeout = readDurationFromConfig(config, { + key: 'backend.lifecycle.startupRequestPauseTimeout', + }); + } + const timeoutMs = durationToMilliseconds(startupRequestPauseTimeout); return (_req, _res, next) => { diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts b/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts index 0557cb636d..1f2b989018 100644 --- a/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts @@ -27,6 +27,7 @@ import { createCredentialsBarrier, createAuthIntegrationRouter, } from './http'; +import { MiddlewareFactory } from '../rootHttpRouter'; /** * HTTP route registration for plugins. @@ -47,8 +48,17 @@ export const httpRouterServiceFactory = createServiceFactory({ rootHttpRouter: coreServices.rootHttpRouter, auth: coreServices.auth, httpAuth: coreServices.httpAuth, + logger: coreServices.logger, }, - async factory({ auth, httpAuth, config, plugin, rootHttpRouter, lifecycle }) { + async factory({ + auth, + httpAuth, + config, + plugin, + rootHttpRouter, + lifecycle, + logger, + }) { const router = PromiseRouter(); rootHttpRouter.use(`/api/${plugin.getId()}`, router); @@ -59,13 +69,19 @@ export const httpRouterServiceFactory = createServiceFactory({ }); router.use(createAuthIntegrationRouter({ auth })); - router.use(createLifecycleMiddleware({ lifecycle })); + router.use(createLifecycleMiddleware({ config, lifecycle })); router.use(credentialsBarrier.middleware); router.use(createCookieAuthRefreshMiddleware({ auth, httpAuth })); + const pluginRoutes = PromiseRouter(); + router.use(pluginRoutes); + + const middleware = MiddlewareFactory.create({ config, logger }); + router.use(middleware.error()); + return { use(handler: Handler): void { - router.use(handler); + pluginRoutes.use(handler); }, addAuthPolicy(policy: HttpRouterServiceAuthPolicy): void { credentialsBarrier.addAuthPolicy(policy); diff --git a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts index 0eee5c18c6..ca9085273c 100644 --- a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts @@ -53,11 +53,11 @@ describe('DefaultRootHealthService', () => { it(`should return a 500 response if the server has stopped`, async () => { let mockServerStartedFn = () => {}; - let mockServerStoppedFn = () => {}; + let mockServerBeforeStoppedFn = () => {}; const lifecycle = mockServices.rootLifecycle.mock({ addStartupHook: jest.fn(fn => (mockServerStartedFn = fn)), - addShutdownHook: jest.fn(fn => (mockServerStoppedFn = fn)), + addBeforeShutdownHook: jest.fn(fn => (mockServerBeforeStoppedFn = fn)), }); const service = new DefaultRootHealthService({ @@ -65,11 +65,11 @@ describe('DefaultRootHealthService', () => { }); mockServerStartedFn(); - mockServerStoppedFn(); + mockServerBeforeStoppedFn(); await expect(service.getReadiness()).resolves.toEqual({ status: 503, payload: { - message: 'Backend has not started yet', + message: 'Backend is shuttting down', status: 'error', }, }); diff --git a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts index c8b4ad5394..b201079b4f 100644 --- a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts @@ -23,14 +23,14 @@ import { /** @internal */ export class DefaultRootHealthService implements RootHealthService { - #isRunning = false; + #state: 'init' | 'up' | 'down' = 'init'; constructor(readonly options: { lifecycle: RootLifecycleService }) { options.lifecycle.addStartupHook(() => { - this.#isRunning = true; + this.#state = 'up'; }); - options.lifecycle.addShutdownHook(() => { - this.#isRunning = false; + options.lifecycle.addBeforeShutdownHook(() => { + this.#state = 'down'; }); } @@ -39,12 +39,18 @@ export class DefaultRootHealthService implements RootHealthService { } async getReadiness(): Promise<{ status: number; payload?: any }> { - if (!this.#isRunning) { + if (this.#state === 'init') { return { status: 503, payload: { message: 'Backend has not started yet', status: 'error' }, }; } + if (this.#state === 'down') { + return { + status: 503, + payload: { message: 'Backend is shuttting down', status: 'error' }, + }; + } return { status: 200, payload: { status: 'ok' } }; } 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/createHttpServer.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts index 5c526ba1e2..fbb6ac5805 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts @@ -16,7 +16,6 @@ import * as http from 'http'; import * as https from 'https'; -import stoppableServer from 'stoppable'; import { RequestListener } from 'http'; import { LoggerService } from '@backstage/backend-plugin-api'; import { HttpServerOptions, ExtendedHttpServer } from './types'; @@ -33,13 +32,6 @@ export async function createHttpServer( deps: { logger: LoggerService }, ): Promise { const server = await createServer(listener, options, deps); - - const stopper = stoppableServer(server, 0); - // The stopper here is actually the server itself, so if we try - // to call stopper.stop() down in the stop implementation, we'll - // be calling ourselves. - const stopServer = stopper.stop.bind(stopper); - return Object.assign(server, { start() { return new Promise((resolve, reject) => { @@ -61,7 +53,13 @@ export async function createHttpServer( stop() { return new Promise((resolve, reject) => { - stopServer((error?: Error) => { + if (process.env.NODE_ENV === 'development') { + // Ensure that various polling connections are shut down fast in development + server.closeAllConnections(); + } else { + server.closeIdleConnections(); + } + server.close(error => { if (error) { reject(error); } else { diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.ts index 510fdd9586..fc1fc59bcb 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.ts @@ -17,7 +17,6 @@ import { Config } from '@backstage/config'; import helmet from 'helmet'; import { HelmetOptions } from 'helmet'; -import { ContentSecurityPolicyOptions } from 'helmet/dist/types/middlewares/content-security-policy'; import kebabCase from 'lodash/kebabCase'; /** @@ -81,10 +80,15 @@ function readCspDirectives(config?: Config): CspDirectives { return result; } +type ContentSecurityPolicyDirectives = Exclude< + HelmetOptions['contentSecurityPolicy'], + boolean | undefined +>['directives']; + export function applyCspDirectives( directives: CspDirectives, -): ContentSecurityPolicyOptions['directives'] { - const result: ContentSecurityPolicyOptions['directives'] = +): ContentSecurityPolicyDirectives { + const result: ContentSecurityPolicyDirectives = helmet.contentSecurityPolicy.getDefaultDirectives(); // TODO(Rugvip): We currently use non-precompiled AJV for validation in the frontend, which uses eval. diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts index dea0159dff..0f2b6463e4 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts @@ -21,17 +21,207 @@ import { import { Express } from 'express'; import request from 'supertest'; import { rootHttpRouterServiceFactory } from './rootHttpRouterServiceFactory'; -import { coreServices } from '@backstage/backend-plugin-api'; +import { + ServiceFactory, + coreServices, + createServiceFactory, +} from '@backstage/backend-plugin-api'; +import { BackendLifecycleImpl } from '../rootLifecycle/rootLifecycleServiceFactory'; + +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 () => { + const { app, tester } = await createExpressApp( + mockServices.rootConfig.factory({ + data: { + backend: { + listen: { port: 0 }, + }, + }, + }), + ); + + 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 + + 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', + ); + }); + + it('should wait the server to shutdown', async () => { + jest.useFakeTimers(); + + const serverStopMock = jest.fn(); + let app: Express | undefined = undefined; + const lifecycleMock = new BackendLifecycleImpl(mockServices.rootLogger()); const tester = ServiceFactoryTester.from( rootHttpRouterServiceFactory({ configure(options) { - options.applyDefaults(); + options.app.use(options.healthRouter); + options.app.get('/test', (_req, res) => { + res.status(200).send({ status: 'ok' }).end(); + }); + options.app.use(options.middleware.error()); app = options.app; + options.server.addListener('close', serverStopMock); }, }), { @@ -42,33 +232,95 @@ describe('rootHttpRouterServiceFactory', () => { backend: { baseUrl: 'http://localhost', listen: { host: '', port: 0 }, + lifecycle: { + serverShutdownDelay: '30s', + }, }, }, }), + createServiceFactory({ + service: coreServices.rootLifecycle, + deps: {}, + factory() { + return lifecycleMock; + }, + }), ], }, ); - // Trigger creation of the http service, accessing the app instance through the configure callback await tester.getSubject(); - 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', - }); - + // Trigger creation of the http service, accessing the app instance through the configure callback const lifecycle = await tester.getService(coreServices.rootLifecycle); 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('/test').expect(200, { status: 'ok', }); - expect('test').toBe('test'); + await request(app) + .get('/.backstage/health/v1/liveness') + .expect(200, { status: 'ok' }); + + await request(app).get('/.backstage/health/v1/readiness').expect(200, { + status: 'ok', + }); + + const beforeShutdownPromise = (lifecycle as any) + .beforeShutdown() + .then(() => { + return (lifecycle as any).shutdown(); + }); + + // Continue accepting requests + await request(app!).get('/test').expect(200, { + status: 'ok', + }); + + await request(app) + .get('/.backstage/health/v1/liveness') + .expect(200, { status: 'ok' }); + + // Immediately start failing the readiness health check + await request(app).get('/.backstage/health/v1/readiness').expect(503, { + message: 'Backend is shuttting down', + status: 'error', + }); + + jest.advanceTimersByTime(29999); + + // Still accepting requests 1 ms before shutdown + await request(app!).get('/test').expect(200, { + status: 'ok', + }); + + await request(app) + .get('/.backstage/health/v1/liveness') + .expect(200, { status: 'ok' }); + + await request(app).get('/.backstage/health/v1/readiness').expect(503, { + message: 'Backend is shuttting down', + status: 'error', + }); + + jest.advanceTimersByTime(1); + + await request(app) + .get('/.backstage/health/v1/liveness') + .expect(200, { status: 'ok' }); + + await request(app).get('/.backstage/health/v1/readiness').expect(503, { + message: 'Backend is shuttting down', + status: 'error', + }); + + return expect( + beforeShutdownPromise.then(() => { + expect(serverStopMock).toHaveBeenCalled(); + jest.useRealTimers(); + }), + ).resolves.toBeUndefined(); }); }); diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts index 59811c15d4..e5c64124fd 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts @@ -30,6 +30,8 @@ import { } from './http'; import { DefaultRootHttpRouter } from './DefaultRootHttpRouter'; import { createHealthRouter } from './createHealthRouter'; +import { durationToMilliseconds } from '@backstage/types'; +import { readDurationFromConfig } from '@backstage/config'; /** * @public @@ -89,7 +91,8 @@ 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')), @@ -120,6 +123,18 @@ const rootHttpRouterServiceFactoryWithOptions = ( }, }); + if (config.has('backend.lifecycle.serverShutdownDelay')) { + const serverShutdownDelay = readDurationFromConfig(config, { + key: 'backend.lifecycle.serverShutdownDelay', + }); + lifecycle.addBeforeShutdownHook(async () => { + const timeoutMs = durationToMilliseconds(serverShutdownDelay); + return await new Promise(resolve => { + setTimeout(resolve, timeoutMs); + }); + }); + } + lifecycle.addShutdownHook(() => server.stop()); await server.start(); diff --git a/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts index e724c2f5cb..abba4beece 100644 --- a/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts @@ -65,6 +65,39 @@ export class BackendLifecycleImpl implements RootLifecycleService { ); } + #hasBeforeShutdown = false; + #beforeShutdownTasks: Array<{ hook: () => void | Promise }> = []; + + addBeforeShutdownHook(hook: () => void): void { + if (this.#hasBeforeShutdown) { + throw new Error( + 'Attempt to add before shutdown hook after shutdown has started', + ); + } + this.#beforeShutdownTasks.push({ hook }); + } + + async beforeShutdown(): Promise { + if (this.#hasBeforeShutdown) { + return; + } + this.#hasBeforeShutdown = true; + + this.logger.debug( + `Running ${this.#beforeShutdownTasks.length} before shutdown tasks...`, + ); + await Promise.all( + this.#beforeShutdownTasks.map(async ({ hook }) => { + try { + await hook(); + this.logger.debug(`Before shutdown hook succeeded`); + } catch (error) { + this.logger.error(`Before shutdown hook failed, ${error}`); + } + }), + ); + } + #hasShutdown = false; #shutdownTasks: Array<{ hook: LifecycleServiceShutdownHook; diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts index 3c641feadf..1ce1401829 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts @@ -55,7 +55,11 @@ describe('PluginTaskManagerImpl', () => { const manager = new PluginTaskSchedulerImpl( async () => knex, mockServices.logger.mock(), - { addShutdownHook, addStartupHook: jest.fn() }, + { + addShutdownHook, + addBeforeShutdownHook: jest.fn(), + addStartupHook: jest.fn(), + }, ); return { knex, manager }; } diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts index 069b772a15..e04e2c5b47 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts @@ -44,7 +44,7 @@ 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) { + if (pathSegments.length < 1) { throw new Error(`Invalid Azure Blob Storage URL format: ${url}`); } @@ -171,7 +171,7 @@ export class AzureBlobStorageUrlReader implements UrlReaderService { }, ); } catch (e) { - if (e.$metadata && e.$metadata.httpStatusCode === 304) { + if (e.statusCode === 304) { throw new NotModifiedError(); } diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts index c37cb59308..d327f80704 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts @@ -37,6 +37,20 @@ import { Minimatch } from 'minimatch'; import { ReaderFactory, ReadTreeResponseFactory } from './types'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import pThrottle from 'p-throttle'; + +// 1 per second +const throttle = pThrottle({ + limit: 1, + interval: 1000, +}); + +const throttledFetch = throttle( + async (url: RequestInfo, options?: RequestInit) => { + return await fetch(url, options); + }, +); + /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket Server APIs. * @@ -79,7 +93,7 @@ export class BitbucketServerUrlReader implements UrlReaderService { let response: Response; try { - response = await fetch(bitbucketUrl.toString(), { + response = await throttledFetch(bitbucketUrl.toString(), { headers: { ...requestOptions.headers, ...(etag && { 'If-None-Match': etag }), @@ -129,7 +143,7 @@ export class BitbucketServerUrlReader implements UrlReaderService { url, this.integration.config, ); - const archiveResponse = await fetch( + const archiveResponse = await throttledFetch( downloadUrl, getBitbucketServerRequestOptions(this.integration.config), ); @@ -198,7 +212,7 @@ export class BitbucketServerUrlReader implements UrlReaderService { // https://docs.atlassian.com/bitbucket-server/rest/7.9.0/bitbucket-rest.html#idp211 (branches docs) const branchListUrl = `${this.integration.config.apiBaseUrl}/projects/${project}/repos/${repoName}/branches${branchParameter}`; - const branchListResponse = await fetch( + const branchListResponse = await throttledFetch( branchListUrl, getBitbucketServerRequestOptions(this.integration.config), ); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts index c1d8c02a53..77a8d31623 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts @@ -14,6 +14,9 @@ * limitations under the License. */ +// NOTE(freben): Intentionally uses node-fetch because of https://github.com/backstage/backstage/issues/28190 +import fetch, { Response } from 'node-fetch'; + import { UrlReaderService, UrlReaderServiceReadTreeOptions, @@ -34,8 +37,10 @@ import { import parseGitUrl from 'git-url-parse'; import { trimEnd, trimStart } from 'lodash'; import { Minimatch } from 'minimatch'; +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. @@ -98,7 +103,12 @@ export class GitlabUrlReader implements UrlReaderService { } if (response.ok) { - return ReadUrlResponseFactory.fromResponse(response); + return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { + etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), + }); } const message = `${url} could not be read as ${builtUrl}, ${response.status} ${response.statusText}`; @@ -220,7 +230,7 @@ export class GitlabUrlReader implements UrlReaderService { } return await this.deps.treeResponseFactory.fromTarArchive({ - response: archiveGitLabResponse, + stream: Readable.from(archiveGitLabResponse.body), subpath: filepath, etag: commitSha, filter: options?.filter, diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md index 7d12dd6d13..c465d51571 100644 --- a/packages/backend-dynamic-feature-service/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,5 +1,106 @@ # @backstage/backend-dynamic-feature-service +## 0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-app-api@1.1.1-next.1 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/cli-node@0.2.12-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-events-backend@0.4.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + - @backstage/plugin-app-node@0.1.29-next.1 + - @backstage/cli-common@0.1.15 + +## 0.5.3-next.0 + +### Patch Changes + +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-app-api@1.1.1-next.0 + - @backstage/config-loader@1.9.5-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-events-backend@0.4.1-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.11 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-app-node@0.1.29-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## 0.5.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/backend-app-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/cli-node@0.2.11 + - @backstage/plugin-events-backend@0.4.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-app-node@0.1.28 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## 0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-app-node@0.1.28-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.5.2-next.1 ### Patch Changes diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index 49b7e73a68..c412933d30 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.2-next.1", + "version": "0.5.3-next.1", "description": "Backstage dynamic feature service", "backstage": { "role": "node-library" diff --git a/packages/backend-dynamic-feature-service/report.api.md b/packages/backend-dynamic-feature-service/report.api.md index 6e53f3747f..e2ad34c84d 100644 --- a/packages/backend-dynamic-feature-service/report.api.md +++ b/packages/backend-dynamic-feature-service/report.api.md @@ -8,6 +8,8 @@ import { BackstagePackageJson } from '@backstage/cli-node'; import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; import { Config } from '@backstage/config'; import { ConfigSchema } from '@backstage/config-loader'; +import { DatabaseService } from '@backstage/backend-plugin-api'; +import { DiscoveryService } from '@backstage/backend-plugin-api'; import { EventBroker } from '@backstage/plugin-events-node'; import { EventsBackend } from '@backstage/plugin-events-backend'; import { EventsService } from '@backstage/plugin-events-node'; @@ -22,8 +24,6 @@ import { PackageRole } from '@backstage/cli-node'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; import { PermissionPolicy } from '@backstage/plugin-permission-node'; import { PluginCacheManager } from '@backstage/backend-common'; -import { PluginDatabaseManager } from '@backstage/backend-common'; -import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { RootLoggerService } from '@backstage/backend-plugin-api'; import { Router } from 'express'; import { SchedulerService } from '@backstage/backend-plugin-api'; @@ -274,10 +274,10 @@ export interface LegacyBackendPluginInstaller { export type LegacyPluginEnvironment = { logger: Logger; cache: PluginCacheManager; - database: PluginDatabaseManager; + database: DatabaseService; config: Config; reader: UrlReaderService; - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; tokenManager: TokenManager; permissions: PermissionEvaluator; scheduler: SchedulerService; diff --git a/packages/backend-dynamic-feature-service/src/manager/types.ts b/packages/backend-dynamic-feature-service/src/manager/types.ts index 89ac140bc6..d056a9a1b2 100644 --- a/packages/backend-dynamic-feature-service/src/manager/types.ts +++ b/packages/backend-dynamic-feature-service/src/manager/types.ts @@ -16,12 +16,7 @@ import { Logger } from 'winston'; import { Config } from '@backstage/config'; -import { - PluginCacheManager, - PluginDatabaseManager, - PluginEndpointDiscovery, - TokenManager, -} from '@backstage/backend-common'; +import { PluginCacheManager, TokenManager } from '@backstage/backend-common'; import { Router } from 'express'; import { IdentityApi } from '@backstage/plugin-auth-node'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; @@ -36,6 +31,8 @@ import { UrlReaderService, SchedulerService, SchedulerServiceTaskRunner, + DatabaseService, + DiscoveryService, } from '@backstage/backend-plugin-api'; import { PackagePlatform, PackageRole } from '@backstage/cli-node'; import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; @@ -60,10 +57,10 @@ import { ScannedPluginPackage } from '../scanner'; export type LegacyPluginEnvironment = { logger: Logger; cache: PluginCacheManager; - database: PluginDatabaseManager; + database: DatabaseService; config: Config; reader: UrlReaderService; - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; tokenManager: TokenManager; permissions: PermissionEvaluator; scheduler: SchedulerService; diff --git a/packages/backend-legacy/CHANGELOG.md b/packages/backend-legacy/CHANGELOG.md index 45577af311..6097a0cfc4 100644 --- a/packages/backend-legacy/CHANGELOG.md +++ b/packages/backend-legacy/CHANGELOG.md @@ -1,5 +1,174 @@ # example-backend-legacy +## 0.2.106-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-app-backend@0.4.4-next.1 + - @backstage/plugin-auth-backend@0.24.2-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-backend@0.4.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-kubernetes-backend@0.19.2-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-proxy-backend@0.5.10-next.1 + - @backstage/plugin-scaffolder-backend@1.29.0-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.5-next.1 + - @backstage/plugin-search-backend@1.8.1-next.1 + - @backstage/plugin-signals-backend@0.3.0-next.2 + - @backstage/plugin-signals-node@0.1.16-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.1-next.1 + - @backstage/plugin-permission-backend@0.5.53-next.1 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + - @backstage/plugin-techdocs-backend@1.11.5-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.4-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.5-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.6.4-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.7-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.40-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/integration@1.16.1-next.0 + +## 0.2.106-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-signals-backend@0.3.0-next.1 + - @backstage/plugin-techdocs-backend@1.11.5-next.1 + - @backstage/plugin-scaffolder-backend@1.29.0-next.1 + +## 0.2.106-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-scaffolder-backend@1.29.0-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.0 + - @backstage/plugin-permission-backend@0.5.53-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-events-backend@0.4.1-next.0 + - @backstage/plugin-app-backend@0.4.4-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.4-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-kubernetes-backend@0.19.2-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-proxy-backend@0.5.10-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.5-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.1-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.5-next.0 + - @backstage/plugin-search-backend@1.8.1-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.6.4-next.0 + - @backstage/plugin-search-backend-module-explore@0.2.7-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.40-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-signals-backend@0.2.5-next.0 + - @backstage/plugin-signals-node@0.1.16-next.0 + - @backstage/plugin-techdocs-backend@1.11.5-next.0 + +## 0.2.105 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0 + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/integration@1.16.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.6.3 + - @backstage/plugin-auth-backend@0.24.1 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.4 + - @backstage/plugin-search-backend-module-catalog@0.2.6 + - @backstage/plugin-search-backend-module-explore@0.2.6 + - @backstage/plugin-app-backend@0.4.3 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-events-backend@0.4.0 + - @backstage/plugin-search-backend@1.8.0 + - @backstage/plugin-permission-backend@0.5.52 + - @backstage/plugin-signals-backend@0.2.4 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/plugin-techdocs-backend@1.11.4 + - @backstage/plugin-proxy-backend@0.5.9 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4 + - @backstage/plugin-kubernetes-backend@0.19.1 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.4 + - @backstage/plugin-search-backend-module-pg@0.5.39 + - @backstage/plugin-signals-node@0.1.15 + +## 0.2.105-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0-next.2 + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-app-backend@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-kubernetes-backend@0.19.1-next.2 + - @backstage/plugin-proxy-backend@0.5.9-next.2 + - @backstage/plugin-search-backend@1.8.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-signals-backend@0.2.4-next.2 + - @backstage/plugin-techdocs-backend@1.11.4-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-permission-backend@0.5.52-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.5.4-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.6-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.39-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.2.105-next.1 ### Patch Changes diff --git a/packages/backend-legacy/package.json b/packages/backend-legacy/package.json index 09157adb3a..849bf0bf83 100644 --- a/packages/backend-legacy/package.json +++ b/packages/backend-legacy/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-legacy", - "version": "0.2.105-next.1", + "version": "0.2.106-next.2", "backstage": { "role": "backend" }, diff --git a/packages/backend-legacy/src/index.ts b/packages/backend-legacy/src/index.ts index 8ef969ff2b..c883603efb 100644 --- a/packages/backend-legacy/src/index.ts +++ b/packages/backend-legacy/src/index.ts @@ -47,7 +47,6 @@ import search from './plugins/search'; import techdocs from './plugins/techdocs'; import app from './plugins/app'; import permission from './plugins/permission'; -import signals from './plugins/signals'; import { PluginEnvironment } from './types'; import { ServerPermissionClient } from '@backstage/plugin-permission-node'; import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; @@ -137,7 +136,6 @@ async function main() { const appEnv = useHotMemoize(module, () => createEnv('app')); const permissionEnv = useHotMemoize(module, () => createEnv('permission')); const eventsEnv = useHotMemoize(module, () => createEnv('events')); - const signalsEnv = useHotMemoize(module, () => createEnv('signals')); const apiRouter = Router(); apiRouter.use('/catalog', await catalog(catalogEnv)); @@ -149,7 +147,6 @@ async function main() { apiRouter.use('/kubernetes', await kubernetes(kubernetesEnv)); apiRouter.use('/proxy', await proxy(proxyEnv)); apiRouter.use('/permission', await permission(permissionEnv)); - apiRouter.use('/signals', await signals(signalsEnv)); apiRouter.use(notFoundHandler()); const service = createServiceBuilder(module) diff --git a/packages/backend-legacy/src/plugins/search.ts b/packages/backend-legacy/src/plugins/search.ts index dcdcfa9b79..1991b282e1 100644 --- a/packages/backend-legacy/src/plugins/search.ts +++ b/packages/backend-legacy/src/plugins/search.ts @@ -15,7 +15,6 @@ */ import { useHotCleanup } from '@backstage/backend-common'; -import { DefaultCatalogCollatorFactory } from '@backstage/plugin-search-backend-module-catalog'; import { ToolDocumentCollatorFactory } from '@backstage/plugin-search-backend-module-explore'; import { createRouter } from '@backstage/plugin-search-backend'; import { ElasticSearchSearchEngine } from '@backstage/plugin-search-backend-module-elasticsearch'; @@ -67,16 +66,6 @@ export default async function createPlugin( initialDelay: { seconds: 3 }, }); - // Collators are responsible for gathering documents known to plugins. This - // particular collator gathers entities from the software catalog. - indexBuilder.addCollator({ - schedule, - factory: DefaultCatalogCollatorFactory.fromConfig(env.config, { - discovery: env.discovery, - tokenManager: env.tokenManager, - }), - }); - indexBuilder.addCollator({ schedule, factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, { diff --git a/packages/backend-legacy/src/plugins/signals.ts b/packages/backend-legacy/src/plugins/signals.ts deleted file mode 100644 index 33b1af5edf..0000000000 --- a/packages/backend-legacy/src/plugins/signals.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2023 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Router } from 'express'; -import { createRouter } from '@backstage/plugin-signals-backend'; -import { PluginEnvironment } from '../types'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - return await createRouter({ - logger: env.logger, - events: env.events, - identity: env.identity, - discovery: env.discovery, - config: env.config, - }); -} diff --git a/packages/backend-legacy/src/types.ts b/packages/backend-legacy/src/types.ts index 3f5d163925..b106f5d85a 100644 --- a/packages/backend-legacy/src/types.ts +++ b/packages/backend-legacy/src/types.ts @@ -16,12 +16,7 @@ import { Logger } from 'winston'; import { Config } from '@backstage/config'; -import { - PluginCacheManager, - PluginDatabaseManager, - PluginEndpointDiscovery, - TokenManager, -} from '@backstage/backend-common'; +import { PluginCacheManager, TokenManager } from '@backstage/backend-common'; import { IdentityApi } from '@backstage/plugin-auth-node'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; import { EventBroker, EventsService } from '@backstage/plugin-events-node'; @@ -29,15 +24,17 @@ import { SignalsService } from '@backstage/plugin-signals-node'; import { UrlReaderService, SchedulerService, + DatabaseService, + DiscoveryService, } from '@backstage/backend-plugin-api'; export type PluginEnvironment = { logger: Logger; cache: PluginCacheManager; - database: PluginDatabaseManager; + database: DatabaseService; config: Config; reader: UrlReaderService; - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; tokenManager: TokenManager; permissions: PermissionEvaluator; scheduler: SchedulerService; diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md index d2d2cabc79..cdcd1f76ed 100644 --- a/packages/backend-openapi-utils/CHANGELOG.md +++ b/packages/backend-openapi-utils/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/backend-openapi-utils +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 0.4.0 + +### Minor Changes + +- afcebea: Fixed a Typescript error when trying to use the new OpenAPI server-side generated code. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 0.4.0-next.2 + +### Minor Changes + +- afcebea: Fixed a Typescript error when trying to use the new OpenAPI server-side generated code. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + ## 0.3.1-next.1 ### Patch Changes diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index fdb597abd3..0513354ebe 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.1-next.1", + "version": "0.4.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 592188d929..da2139d959 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,66 @@ # @backstage/backend-plugin-api +## 1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/cli-common@0.1.15 + +## 1.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## 1.1.0 + +### Minor Changes + +- 12eac85: **EXPERIMENTAL**: Adds a new `instanceMetadataService` to hold information about a specific backend instance. + +### Patch Changes + +- eef3ef1: Removed unused `express` dependencies. +- 0e9c9fa: The `RootLifecycleService` now has a new `addBeforeShutdownHook` method, and hooks added through this method will run immediately when a termination event is received. + + The backend will not proceed with the shutdown and run the `Shutdown` hooks until all `BeforeShutdown` hooks have completed. + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## 1.1.0-next.2 + +### Patch Changes + +- 0e9c9fa: The `RootLifecycleService` now has a new `addBeforeShutdownHook` method, and hooks added through this method will run immediately when a termination event is received. + + The backend will not proceed with the shutdown and run the `Shutdown` hooks until all `BeforeShutdown` hooks have completed. + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.1.0-next.1 ### Minor Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 25983cafac..7e4fa19c84 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.1.0-next.1", + "version": "1.1.1-next.1", "description": "Core API used by Backstage backend plugins", "backstage": { "role": "node-library" diff --git a/packages/backend-plugin-api/report.api.md b/packages/backend-plugin-api/report.api.md index a886ba4271..8416c6c200 100644 --- a/packages/backend-plugin-api/report.api.md +++ b/packages/backend-plugin-api/report.api.md @@ -507,7 +507,10 @@ export interface RootHttpRouterService { } // @public -export interface RootLifecycleService extends LifecycleService {} +export interface RootLifecycleService extends LifecycleService { + // (undocumented) + addBeforeShutdownHook(hook: () => void | Promise): void; +} // @public export interface RootLoggerService extends LoggerService {} diff --git a/packages/backend-plugin-api/src/services/definitions/RootLifecycleService.ts b/packages/backend-plugin-api/src/services/definitions/RootLifecycleService.ts index b962fa68ba..2fc9556938 100644 --- a/packages/backend-plugin-api/src/services/definitions/RootLifecycleService.ts +++ b/packages/backend-plugin-api/src/services/definitions/RootLifecycleService.ts @@ -23,4 +23,6 @@ import { LifecycleService } from './LifecycleService'; * * @public */ -export interface RootLifecycleService extends LifecycleService {} +export interface RootLifecycleService extends LifecycleService { + addBeforeShutdownHook(hook: () => void | Promise): void; +} diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 9e90f4f006..a5bb8cf63b 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,79 @@ # @backstage/backend-test-utils +## 1.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-app-api@1.1.1-next.1 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 1.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/backend-app-api@1.1.1-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 1.2.0 + +### Minor Changes + +- de6f280: **BREAKING** Upgraded @keyv/redis and keyv packages to resolve a bug related to incorrect resolution of cache keys. + + This is a breaking change for clients using the `redis` store for cache with `useRedisSets` option set to false since cache keys will be calculated differently (without the sets:namespace: prefix). For clients with default configuration (or useRedisSets set to false) the cache keys will stay the same, but since @keyv/redis library no longer supports redis sets they won't be utilised anymore. + + If you were using `useRedisSets` option in configuration make sure to remove it from `app-config.yaml`: + + ```diff + backend: + cache: + store: redis + connection: redis://user:pass@cache.example.com:6379 + - useRedisSets: false + ``` + +### Patch Changes + +- 0e9c9fa: Mock the new `RootLifecycleService.addBeforeShutdownHook` method. +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/backend-app-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 1.2.0-next.2 + +### Patch Changes + +- 0e9c9fa: Mock the new `RootLifecycleService.addBeforeShutdownHook` method. +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 1.2.0-next.1 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 6ff84c0664..e29109c7a4 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.2.0-next.1", + "version": "1.2.1-next.1", "description": "Test helpers library for Backstage backends", "backstage": { "role": "node-library" diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts index a2c3b34ead..b9bca62767 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -472,6 +472,7 @@ export namespace mockServices { export const factory = () => rootLifecycleServiceFactory; export const mock = simpleMock(coreServices.rootLifecycle, () => ({ addShutdownHook: jest.fn(), + addBeforeShutdownHook: jest.fn(), addStartupHook: jest.fn(), })); } diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index 96bf0f7dc1..4471f6ed24 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -27,11 +27,11 @@ import { mockServices } from '../services'; import { ConfigReader } from '@backstage/config'; import express from 'express'; // Direct internal import to avoid duplication -// eslint-disable-next-line @backstage/no-forbidden-package-imports +// eslint-disable-next-line @backstage/no-relative-monorepo-imports import { InternalBackendFeature, InternalBackendRegistrations, -} from '@backstage/backend-plugin-api/src/wiring/types'; +} from '../../../../backend-plugin-api/src/wiring/types'; import { DefaultRootHttpRouter, ExtendedHttpServer, @@ -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 ddca06959f..1275ca743c 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,168 @@ # example-backend +## 0.0.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-app-backend@0.4.4-next.1 + - @backstage/plugin-auth-backend@0.24.2-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.6-next.1 + - @backstage/plugin-devtools-backend@0.5.1-next.1 + - @backstage/plugin-events-backend@0.4.1-next.1 + - @backstage/plugin-kubernetes-backend@0.19.2-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-proxy-backend@0.5.10-next.1 + - @backstage/plugin-scaffolder-backend@1.29.0-next.2 + - @backstage/plugin-search-backend@1.8.1-next.1 + - @backstage/plugin-signals-backend@0.3.0-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.4-next.1 + - @backstage/plugin-notifications-backend@0.5.1-next.1 + - @backstage/plugin-permission-backend@0.5.53-next.1 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + - @backstage/plugin-techdocs-backend@1.11.5-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.4-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.4-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.4-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.4-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.2 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.6-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.7-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.1 + +## 0.0.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.1 + - @backstage/plugin-signals-backend@0.3.0-next.1 + - @backstage/plugin-techdocs-backend@1.11.5-next.1 + - @backstage/plugin-scaffolder-backend@1.29.0-next.1 + - @backstage/plugin-notifications-backend@0.5.1-next.0 + +## 0.0.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-openapi@0.2.6-next.0 + - @backstage/plugin-devtools-backend@0.5.1-next.0 + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-scaffolder-backend@1.29.0-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.0 + - @backstage/plugin-permission-backend@0.5.53-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-events-backend@0.4.1-next.0 + - @backstage/plugin-app-backend@0.4.4-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/plugin-notifications-backend@0.5.1-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.4-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.4-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.4-next.0 + - @backstage/plugin-kubernetes-backend@0.19.2-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.4-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-proxy-backend@0.5.10-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.6-next.0 + - @backstage/plugin-search-backend@1.8.1-next.0 + - @backstage/plugin-search-backend-module-explore@0.2.7-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-signals-backend@0.2.5-next.0 + - @backstage/plugin-techdocs-backend@1.11.5-next.0 + +## 0.0.33 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0 + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4 + - @backstage/plugin-auth-backend@0.24.1 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.4 + - @backstage/plugin-search-backend-module-catalog@0.2.6 + - @backstage/plugin-search-backend-module-explore@0.2.6 + - @backstage/plugin-app-backend@0.4.3 + - @backstage/plugin-events-backend@0.4.0 + - @backstage/plugin-search-backend@1.8.0 + - @backstage/plugin-permission-backend@0.5.52 + - @backstage/plugin-devtools-backend@0.5.0 + - @backstage/plugin-signals-backend@0.2.4 + - @backstage/plugin-notifications-backend@0.5.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/plugin-techdocs-backend@1.11.4 + - @backstage/plugin-proxy-backend@0.5.9 + - @backstage/plugin-kubernetes-backend@0.19.1 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3 + - @backstage/plugin-catalog-backend-module-openapi@0.2.5 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.3 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5 + +## 0.0.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0-next.2 + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 + - @backstage/plugin-notifications-backend@0.5.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-app-backend@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 + - @backstage/plugin-devtools-backend@0.5.0-next.2 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-kubernetes-backend@0.19.1-next.2 + - @backstage/plugin-proxy-backend@0.5.9-next.2 + - @backstage/plugin-search-backend@1.8.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-signals-backend@0.2.4-next.2 + - @backstage/plugin-techdocs-backend@1.11.4-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 + - @backstage/plugin-permission-backend@0.5.52-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.2 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.6-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.0.33-next.1 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index fb7e396397..6409dfae7a 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.0.33-next.1", + "version": "0.0.34-next.2", "backstage": { "role": "backend" }, @@ -62,7 +62,7 @@ "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-signals-backend": "workspace:^", "@backstage/plugin-techdocs-backend": "workspace:^", - "@opentelemetry/auto-instrumentations-node": "^0.52.0", + "@opentelemetry/auto-instrumentations-node": "^0.54.0", "@opentelemetry/exporter-prometheus": "^0.54.0", "@opentelemetry/sdk-node": "^0.54.0", "example-app": "link:../app" diff --git a/packages/backend/src/instanceMetadata.ts b/packages/backend/src/instanceMetadata.ts index dd499aa40a..5f835f3117 100644 --- a/packages/backend/src/instanceMetadata.ts +++ b/packages/backend/src/instanceMetadata.ts @@ -30,7 +30,9 @@ export default createBackendPlugin({ }, async init({ instanceMetadata, logger }) { logger.info( - `Installed features on this instance: ${instanceMetadata.getInstalledFeatures()}`, + `Installed features on this instance: ${instanceMetadata + .getInstalledFeatures() + .join(', ')}`, ); }, }); diff --git a/packages/canon/.storybook/main.ts b/packages/canon/.storybook/main.ts index 41df32404b..cf7921268e 100644 --- a/packages/canon/.storybook/main.ts +++ b/packages/canon/.storybook/main.ts @@ -1,7 +1,4 @@ import type { StorybookConfig } from '@storybook/react-webpack5'; -import { VanillaExtractPlugin } from '@vanilla-extract/webpack-plugin'; -import { merge } from 'webpack-merge'; - import { join, dirname } from 'path'; /** @@ -28,13 +25,8 @@ const config: StorybookConfig = { framework: { name: getAbsolutePath('@storybook/react-webpack5'), options: { - plugins: [new VanillaExtractPlugin()], + plugins: [], }, }, - 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 index 8557b339b0..c88b10b392 100644 --- a/packages/canon/.storybook/manager.ts +++ b/packages/canon/.storybook/manager.ts @@ -3,10 +3,8 @@ import { create } from '@storybook/theming'; const theme = create({ base: 'light', - brandTitle: 'My custom Storybook', - brandUrl: 'https://example.com', + brandTitle: 'Canon', brandImage: 'logo.svg', - brandTarget: '_self', }); addons.setConfig({ diff --git a/packages/canon/.storybook/preview.tsx b/packages/canon/.storybook/preview.tsx index bb0c497d2d..1ac53acd86 100644 --- a/packages/canon/.storybook/preview.tsx +++ b/packages/canon/.storybook/preview.tsx @@ -6,7 +6,12 @@ import { withThemeByDataAttribute } from '@storybook/addon-themes'; import '../docs/components/styles.css'; // Canon specific styles -import '../src/theme/styles.css'; +import '../src/css/core.css'; +import '../src/css/components.css'; + +// Custom themes +import './themes/backstage.css'; +import { CanonProvider } from '../src/contexts/canon'; const preview: Preview = { parameters: { @@ -19,16 +24,70 @@ const preview: Preview = { backgrounds: { disable: true, }, + options: { + storySort: { + method: 'alphabetical', + order: ['Core Concepts', 'Components'], + }, + }, + viewport: { + viewports: { + xs: { + name: 'XSmall', + styles: { + width: '320px', + height: '100%', + }, + }, + small: { + name: 'Small', + styles: { + width: '640px', + height: '100%', + }, + }, + medium: { + name: 'Medium', + styles: { + width: '768px', + height: '100%', + }, + }, + large: { + name: 'Large', + styles: { + width: '1024px', + height: '100%', + }, + }, + xlarge: { + name: 'XLarge', + styles: { + width: '1280px', + height: '100%', + }, + }, + '2xl': { + name: '2XL', + styles: { + width: '1536px', + height: '100%', + }, + }, + }, + }, }, decorators: [ withThemeByDataAttribute({ themes: { - light: 'light', - dark: 'dark', + Light: 'light', + Dark: 'dark', + 'Backstage Light': 'backstage-light', + 'Backstage Dark': 'backstage-dark', }, - defaultTheme: 'light', + defaultTheme: 'Light', }), - (Story, context) => { + Story => { document.body.style.backgroundColor = 'var(--canon-background)'; const docsStoryElements = document.getElementsByClassName('docs-story'); @@ -37,7 +96,11 @@ const preview: Preview = { 'var(--canon-background)'; }); - return ; + return ( + + + + ); }, ], }; diff --git a/packages/canon/.storybook/themes/backstage.css b/packages/canon/.storybook/themes/backstage.css new file mode 100644 index 0000000000..780876501b --- /dev/null +++ b/packages/canon/.storybook/themes/backstage.css @@ -0,0 +1,88 @@ +[data-theme-name='legacy'][data-theme='light'], +[data-theme-name='legacy'][data-theme='dark'] { + --canon-font-regular: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; + + .cn-button { + border-radius: 60px; + font-weight: 400; + text-transform: uppercase; + font-size: 0.875rem; + transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, + box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, + border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + line-height: 1.75; + border-radius: 4px; + background-color: #1f5493; + padding: 6px 16px; + box-shadow: none; + + &:hover { + box-shadow: none; + } + + &.cn-button-primary { + color: #fff; + background-color: rgb(21, 58, 102); + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), + 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); + + &:hover { + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), + 0px 4px 5px 0px rgba(0, 0, 0, 0.14), + 0px 1px 10px 0px rgba(0, 0, 0, 0.12); + } + } + + &.cn-button-secondary { + background-color: transparent; + border: 1px solid rgba(31, 84, 147, 0.5); + color: #1f5493; + + &:hover { + border: 1px solid #1f5493; + background-color: rgba(31, 84, 147, 0.04); + } + } + + &.cn-button-tertiary { + background-color: transparent; + border: none; + color: #1f5493; + } + } +} + +[data-theme-name='legacy'][data-theme='light'] { + /* Colors */ + --canon-accent: #2e77d0; + --canon-background: #f8f8f8; + --canon-surface-1: #fff; + --canon-surface-2: #f4f4f4; + + /* Text colors */ + --canon-text-primary: #000; + --canon-text-primary-on-accent: #fff; + --canon-text-secondary: #646464; +} + +[data-theme-name='legacy'][data-theme='dark'] { + /* Colors */ + --canon-accent: #fff; + --canon-background: #000; + --canon-surface-1: #121212; + --canon-surface-2: #1a1a1a; + + /* Borders */ + --canon-border-base: rgba(255, 255, 255, 0.2); + --canon-border-warning: #f50000; + --canon-border-error: #f87503; + --canon-border-selected: #25d262; + + /* 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/catalog-info.yaml b/packages/canon/catalog-info.yaml index 37aa7b1caf..8369c314b3 100644 --- a/packages/canon/catalog-info.yaml +++ b/packages/canon/catalog-info.yaml @@ -6,4 +6,4 @@ metadata: spec: lifecycle: experimental type: backstage-web-library - owner: maintainers + owner: design-system-maintainers diff --git a/packages/canon/docs/Home.mdx b/packages/canon/docs/Home.mdx index 3a00de5d07..5b85ab15ad 100644 --- a/packages/canon/docs/Home.mdx +++ b/packages/canon/docs/Home.mdx @@ -43,33 +43,43 @@ import { list } from './components/Roadmap/list'; link="/?path=/docs/components-box--docs" /> + + + + + - - - - + + - - + diff --git a/packages/canon/docs/Iconography.mdx b/packages/canon/docs/Iconography.mdx index 48cbd2e431..83d181af12 100644 --- a/packages/canon/docs/Iconography.mdx +++ b/packages/canon/docs/Iconography.mdx @@ -1,6 +1,8 @@ -import { Unstyled, Source } from '@storybook/blocks'; +import { Unstyled, Source, Meta } from '@storybook/blocks'; import { Title, Text, IconLibrary } from './components'; +<Meta title="Core Concepts/Iconography" /> + <Unstyled> <Title type="h1">Iconography diff --git a/packages/canon/docs/Layout.mdx b/packages/canon/docs/Layout.mdx index ed72087cca..9145f71aed 100644 --- a/packages/canon/docs/Layout.mdx +++ b/packages/canon/docs/Layout.mdx @@ -1,7 +1,9 @@ -import { Unstyled, Source } from '@storybook/blocks'; +import { Unstyled, Source, Meta } from '@storybook/blocks'; import { Title, Text, LayoutComponents } from './components'; import * as Table from './components/Table'; + + Layout @@ -42,6 +44,11 @@ import * as Table from './components/Table'; Layout Helpers -TBD + + 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/Responsive.mdx b/packages/canon/docs/Responsive.mdx new file mode 100644 index 0000000000..85292ee555 --- /dev/null +++ b/packages/canon/docs/Responsive.mdx @@ -0,0 +1,150 @@ +import { Unstyled, Meta, Canvas, Source } from '@storybook/blocks'; +import { + Columns, + Text, + ComponentStatus, + Banner, + Title, + Roadmap, +} from './components'; +import { list } from './components/Roadmap/list'; +import * as HeadingStories from '../src/components/Heading/Heading.stories'; +import * as TextStories from '../src/components/Text/Text.stories'; +import * as Table from './components/Table'; +import { Chip } from './components/Chip'; + + + + + +Responsive + + Canon is built on a responsive design system, meaning that the components are + designed to adapt to different screen sizes. By default we offer a set of + breakpoints that you can use to create responsive components. + + + + Breakpoints + + + + + + Breakpoint prefix + Minimum width + CSS + + + + + + xs + + + 0px + + + {`{ ... }`} + + + + + sm + + + 640px + + + {`@media (min-width: 640px) { ... }`} + + + + + md + + + 768px + + + {`@media (min-width: 768px) { ... }`} + + + + + lg + + + 1024px + + + {`@media (min-width: 1024px) { ... }`} + + + + + xl + + + 1280px + + + {`@media (min-width: 1280px) { ... }`} + + + + + 2xl + + + 1536px + + + {`@media (min-width: 1536px) { ... }`} + + + + + +Responsive components + + + Canon components are designed to be responsive, meaning that they will adapt + to different screen sizes. Not every component is responsive, but the ones + that are will have a prop to control the responsive behavior. + + + + The behaviour is the same for each component. For each prop, instead of adding + the value, you add an object with the value and the breakpoint prefix. + + +Button + +// Responsive value + +`} dark /> + +How to update breakpoints + + + The set of keys are not to be changed, but you can update the minimum width of + each breakpoint in the theme provider. + + +`} + dark +/> + + diff --git a/packages/canon/docs/Theme.mdx b/packages/canon/docs/Theme.mdx index cab948c6ba..1ea7c5c4c6 100644 --- a/packages/canon/docs/Theme.mdx +++ b/packages/canon/docs/Theme.mdx @@ -1,7 +1,9 @@ -import { Unstyled, Source } from '@storybook/blocks'; +import { Unstyled, Source, Meta } from '@storybook/blocks'; import { Title, Text, Chip } from './components'; import * as Table from './components/Table'; +{' '} + Theming @@ -38,7 +40,7 @@ import * as Table from './components/Table'; --canon-outline-focus: #ccc; --canon-text-primary: #f0f0f0; --canon-text-secondary: #666; - --canon-font-sans: 'Geist', serif; + --canon-font-regular: 'Geist', serif; --canon-font-mono: 'Monospace', monospace; /* ... other values */ } @@ -53,7 +55,7 @@ import * as Table from './components/Table'; --canon-outline-focus: #ccc; --canon-text-primary: #fff; --canon-text-secondary: #666; - --canon-font-sans: 'Geist', serif; + --canon-font-regular: 'Geist', serif; --canon-font-mono: 'Monospace', monospace; /* ... other values */ } @@ -144,7 +146,7 @@ import * as Table from './components/Table'; - --canon-font-sans + --canon-font-regular The sans-serif font for the theme. diff --git a/packages/canon/docs/Typography.mdx b/packages/canon/docs/Typography.mdx new file mode 100644 index 0000000000..802b9881be --- /dev/null +++ b/packages/canon/docs/Typography.mdx @@ -0,0 +1,48 @@ +import { Unstyled, Meta, Canvas } from '@storybook/blocks'; +import { + Columns, + Text, + ComponentStatus, + Banner, + Title, + Roadmap, +} from './components'; +import { list } from './components/Roadmap/list'; +import * as HeadingStories from '../src/components/Heading/Heading.stories'; +import * as TextStories from '../src/components/Text/Text.stories'; + + + + + +Typography + + Canon offers a suite of typography components designed to seamlessly align + with the rest of your Backstage instance. While you can customize their + appearance to match your brand, the underlying API remains consistent and + unchanged. Each component is built on a responsive structure, allowing you to + define different typography values for various breakpoints. + + +Heading + + Headings are used to structure the content of your page. They are used to + create a hierarchy of information and to make the content more readable. The + best way to use add these headings to your page is to import the [Heading + component](?path=/docs/components-heading--docs). + + + + +Text + + Canon provides four distinct text variants, each offering different font sizes + carefully designed to cover the majority of use cases. These variants are + versatile and can be paired with regular and bold of font weights. You can use + the [Text component](?path=/docs/components-text--docs) to add text to your + page. + + + + + diff --git a/packages/canon/docs/components/Banner/index.tsx b/packages/canon/docs/components/Banner/Banner.tsx similarity index 90% rename from packages/canon/docs/components/Banner/index.tsx rename to packages/canon/docs/components/Banner/Banner.tsx index c3036eac03..3199e65bc0 100644 --- a/packages/canon/docs/components/Banner/index.tsx +++ b/packages/canon/docs/components/Banner/Banner.tsx @@ -14,7 +14,6 @@ * limitations under the License. */ import React from 'react'; -import { bannerIconStyles, bannerStyles } from './banner.css'; export const Banner = ({ children, @@ -24,8 +23,8 @@ export const Banner = ({ variant?: 'info' | 'warning'; }) => { return ( -
-
+
+
p { + margin: 0; + } + + &.info { + background-color: #f2f2f2; + border-color: #cdcdcd; + color: #888888; + } + + &.warning { + background-color: #fff2b9; + border-color: #ffd000; + color: #d79927; + } + + & .icon { + width: 32px; + height: 32px; + background-color: rgba(215, 153, 39, 0.2); + border-radius: 6px; + margin-right: 16px; + display: flex; + align-items: center; + justify-content: center; + } +} diff --git a/packages/canon/docs/components/Chip/index.tsx b/packages/canon/docs/components/Chip/Chip.tsx similarity index 87% rename from packages/canon/docs/components/Chip/index.tsx rename to packages/canon/docs/components/Chip/Chip.tsx index 81609dda61..e6e1d1b1c4 100644 --- a/packages/canon/docs/components/Chip/index.tsx +++ b/packages/canon/docs/components/Chip/Chip.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; -import { chipStyles } from './chip.css'; export const Chip = ({ children, @@ -24,5 +23,5 @@ export const Chip = ({ children: React.ReactNode; head?: boolean; }) => { - return {children}; + return {children}; }; diff --git a/packages/canon/docs/components/Chip/chip.css.ts b/packages/canon/docs/components/Chip/chip.css.ts deleted file mode 100644 index 027a722f84..0000000000 --- a/packages/canon/docs/components/Chip/chip.css.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.ts b/packages/canon/docs/components/Chip/index.ts new file mode 100644 index 0000000000..ff9e4794c5 --- /dev/null +++ b/packages/canon/docs/components/Chip/index.ts @@ -0,0 +1,16 @@ +/* + * 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 { Chip } from './Chip'; diff --git a/packages/canon/docs/components/Chip/styles.css b/packages/canon/docs/components/Chip/styles.css new file mode 100644 index 0000000000..95cf7cef34 --- /dev/null +++ b/packages/canon/docs/components/Chip/styles.css @@ -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. + */ + +.chip { + display: inline-flex; + align-items: center; + font-family: monospace; + font-size: 13px; + border-radius: 6px; + padding: 0px 8px; + height: 24px; + margin-right: 4px; + background-color: #f0f0f0; + color: #5d5d5d; + + &.head { + background-color: #eaf2fd; + color: #2563eb; + } +} diff --git a/packages/canon/docs/components/Columns/index.tsx b/packages/canon/docs/components/Columns/Columns.tsx similarity index 90% rename from packages/canon/docs/components/Columns/index.tsx rename to packages/canon/docs/components/Columns/Columns.tsx index 0d6f27f04d..115ec50010 100644 --- a/packages/canon/docs/components/Columns/index.tsx +++ b/packages/canon/docs/components/Columns/Columns.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; -import { styles } from './columns.css'; export const Columns = ({ children, @@ -25,7 +24,7 @@ export const Columns = ({ style?: React.CSSProperties; }) => { return ( -
+
{children}
); diff --git a/packages/canon/docs/components/Columns/index.ts b/packages/canon/docs/components/Columns/index.ts new file mode 100644 index 0000000000..05de0850be --- /dev/null +++ b/packages/canon/docs/components/Columns/index.ts @@ -0,0 +1,16 @@ +/* + * 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 { Columns } from './Columns'; diff --git a/plugins/search-backend-module-catalog/src/alpha.ts b/packages/canon/docs/components/Columns/styles.css similarity index 84% rename from plugins/search-backend-module-catalog/src/alpha.ts rename to packages/canon/docs/components/Columns/styles.css index e5554e85bd..c34acfc406 100644 --- a/plugins/search-backend-module-catalog/src/alpha.ts +++ b/packages/canon/docs/components/Columns/styles.css @@ -14,8 +14,9 @@ * limitations under the License. */ -import { default as feature } from './module'; - -/** @alpha */ -const _feature = feature; -export default _feature; +.columns { + display: grid; + grid-template-columns: repeat(3, 1fr); + row-gap: 20px; + column-gap: 80px; +} diff --git a/packages/canon/docs/components/ComponentStatus/index.tsx b/packages/canon/docs/components/ComponentStatus/ComponentStatus.tsx similarity index 83% rename from packages/canon/docs/components/ComponentStatus/index.tsx rename to packages/canon/docs/components/ComponentStatus/ComponentStatus.tsx index 64d552ea97..0159e27b32 100644 --- a/packages/canon/docs/components/ComponentStatus/index.tsx +++ b/packages/canon/docs/components/ComponentStatus/ComponentStatus.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; -import { container, pill, title } from './component-status.css'; export const ComponentStatus = ({ name, @@ -29,15 +28,15 @@ export const ComponentStatus = ({ link?: string; }) => { return ( -
+
{link ? ( - + {name} ) : ( - {name} + {name} )} - + {status === 'notStarted' && 'Not Started'} {status === 'inProgress' && 'In Progress'} {status === 'alpha' && 'Alpha'} diff --git a/packages/canon/docs/components/ComponentStatus/component-status.css.ts b/packages/canon/docs/components/ComponentStatus/component-status.css.ts deleted file mode 100644 index 5cce5adb5d..0000000000 --- a/packages/canon/docs/components/ComponentStatus/component-status.css.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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.ts b/packages/canon/docs/components/ComponentStatus/index.ts new file mode 100644 index 0000000000..238c001289 --- /dev/null +++ b/packages/canon/docs/components/ComponentStatus/index.ts @@ -0,0 +1,16 @@ +/* + * 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 { ComponentStatus } from './ComponentStatus'; diff --git a/packages/canon/docs/components/ComponentStatus/styles.css b/packages/canon/docs/components/ComponentStatus/styles.css new file mode 100644 index 0000000000..6ef02ccf3f --- /dev/null +++ b/packages/canon/docs/components/ComponentStatus/styles.css @@ -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. + */ + +.component-status { + display: flex; + justify-content: space-between; + + & .title { + color: #3b59ff; + font-size: 16px; + font-weight: 400; + text-decoration: none; + } + + & .pill { + display: inline-flex; + align-items: center; + color: #000; + border-radius: 40px; + padding: 0px 8px; + height: 24px; + font-size: 12px; + font-weight: 600; + border-style: solid; + border-width: 1px; + margin-left: 8px; + + &.notStarted { + background-color: #f2f2f2; + border-color: #cdcdcd; + color: #888888; + } + + &.inProgress { + background-color: #fff2b9; + border-color: #ffd000; + color: #d79927; + } + + &.alpha { + background-color: #d7f9d7; + border-color: #4ed14a; + color: #3a9837; + } + + &.beta { + background-color: #d7f9d7; + border-color: #4ed14a; + color: #3a9837; + } + + &.stable { + background-color: #d7f9d7; + border-color: #4ed14a; + color: #3a9837; + } + } +} diff --git a/packages/canon/docs/components/IconLibrary/index.tsx b/packages/canon/docs/components/IconLibrary/IconLibrary.tsx similarity index 86% rename from packages/canon/docs/components/IconLibrary/index.tsx rename to packages/canon/docs/components/IconLibrary/IconLibrary.tsx index 6e94c2c777..1d517f7a98 100644 --- a/packages/canon/docs/components/IconLibrary/index.tsx +++ b/packages/canon/docs/components/IconLibrary/IconLibrary.tsx @@ -16,15 +16,15 @@ 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'; +import { icons } from '../../../src/components/Icon/icons'; +import { Text } from '../Text/Text'; export const IconLibrary = () => { - const icons = Object.keys(defaultIcons); + const iconsList = Object.keys(icons); return (
- {icons.map(icon => ( + {iconsList.map(icon => (
diff --git a/packages/canon/docs/components/IconLibrary/index.ts b/packages/canon/docs/components/IconLibrary/index.ts new file mode 100644 index 0000000000..071c80db85 --- /dev/null +++ b/packages/canon/docs/components/IconLibrary/index.ts @@ -0,0 +1,16 @@ +/* + * 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 { IconLibrary } from './IconLibrary'; diff --git a/packages/canon/docs/components/LayoutComponents/LayoutComponents.tsx b/packages/canon/docs/components/LayoutComponents/LayoutComponents.tsx new file mode 100644 index 0000000000..56f389a389 --- /dev/null +++ b/packages/canon/docs/components/LayoutComponents/LayoutComponents.tsx @@ -0,0 +1,64 @@ +/* + * 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 { BoxSvg } from './svgs/box'; +import { StackSvg } from './svgs/stack'; +import { GridSvg } from './svgs/grid'; +import { InlineSvg } from './svgs/inline'; +import { ContainerSvg } from './svgs/container'; + +export const LayoutComponents = () => { + return ( +
+
+ + + +
Box
+
The most basic layout component
+
+
+ + + +
Stack
+
Arrange your components vertically
+
+
+ + + +
Grid
+
Arrange your components in a grid
+
+
+ + + +
Inline
+
Arrange your components in a row
+
+
+ + + +
Container
+
A container for your components
+
+
+ ); +}; diff --git a/packages/canon/docs/components/LayoutComponents/index.ts b/packages/canon/docs/components/LayoutComponents/index.ts new file mode 100644 index 0000000000..55cc9f25ef --- /dev/null +++ b/packages/canon/docs/components/LayoutComponents/index.ts @@ -0,0 +1,16 @@ +/* + * 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 { LayoutComponents } from './LayoutComponents'; diff --git a/packages/canon/docs/components/LayoutComponents/index.tsx b/packages/canon/docs/components/LayoutComponents/index.tsx deleted file mode 100644 index 9e0b039684..0000000000 --- a/packages/canon/docs/components/LayoutComponents/index.tsx +++ /dev/null @@ -1,109 +0,0 @@ -/* - * 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, - whiteBox, - whiteBoxStack, - stack, - verticalDivider, - horizontalDivider, - columns, - inline, - tiles, - whiteBoxColumns, - whiteBoxInline, - whiteBoxTiles, -} from './layout-components.css'; - -export const LayoutComponents = () => { - return ( -
-
- -
- -
Box
-
The most basic layout component.
-
-
- -
-
-
- -
Stack
-
Arrange your components vertically.
-
-
- -
-
-
- -
Columns
-
Arrange your components horizontally.
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
Inline
-
Arrange your components in a row.
-
-
- -
-
-
-
-
-
- - ); -}; diff --git a/packages/canon/docs/components/LayoutComponents/layout-components.css.ts b/packages/canon/docs/components/LayoutComponents/layout-components.css.ts deleted file mode 100644 index a8440dd01f..0000000000 --- a/packages/canon/docs/components/LayoutComponents/layout-components.css.ts +++ /dev/null @@ -1,198 +0,0 @@ -/* - * 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: '#f2f2f2', - borderRadius: '4px', - width: '100%', - height: '180px', - border: '1px solid #e0e0e0', - transition: 'border-color 0.2s ease-in-out', - marginBottom: '0.75rem', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - selectors: { - [`${box}:hover &`]: { - borderColor: '#1f47ff', - }, - }, -}); - -export const title = style({ - fontSize: '16px', - fontFamily: 'var(--canon-font-sans)', - transition: 'color 0.2s ease-in-out', - marginBottom: '0.25rem', - selectors: { - [`${box}:hover &`]: { - color: '#1f47ff', - }, - }, -}); - -export const description = style({ - fontSize: '16px', - fontFamily: 'var(--canon-font-sans)', - color: '#9e9e9e', -}); - -export const whiteBox = style({ - background: '#fff', - width: '40px', - height: '40px', - borderRadius: '4px', - boxShadow: '0px 2px 4px rgba(0, 0, 0, 0.1)', -}); - -export const whiteBoxStack = style([ - whiteBox, - { - width: '40%', - height: '28px', - }, -]); - -export const whiteBoxColumns = style([ - whiteBox, - { - width: '30%', - height: '32px', - }, -]); - -export const whiteBoxInline = style([ - whiteBox, - { - width: '32px', - height: '32px', - }, -]); - -export const whiteBoxTiles = style([ - whiteBox, - { - width: '100%', - height: '32px', - }, -]); - -export const stack = style({ - display: 'flex', - flexDirection: 'column', -}); - -export const columns = style({ - display: 'flex', - flexDirection: 'row', -}); - -export const inline = style({ - display: 'flex', - flexWrap: 'wrap', - flexDirection: 'row', - justifyContent: 'flex-start', - alignItems: 'flex-start', - gap: '0.5rem', - paddingLeft: '1rem', -}); - -export const tiles = style({ - display: 'grid', - gridTemplateColumns: 'repeat(4, 1fr)', - gap: '0.5rem', - paddingLeft: '1rem', - paddingRight: '1rem', - width: '100%', -}); - -export const verticalDivider = style({ - display: 'flex', - flexShrink: 0, - flexDirection: 'column', - position: 'relative', - height: '20px', - width: '2px', - backgroundColor: '#1f47ff', - selectors: { - '&::before': { - content: '""', - position: 'absolute', - top: 0, - left: '-9px', - width: '20px', - height: '2px', - backgroundColor: '#1f47ff', - }, - '&::after': { - content: '""', - position: 'absolute', - bottom: 0, - left: '-9px', - width: '20px', - height: '2px', - backgroundColor: '#1f47ff', - }, - }, -}); - -export const horizontalDivider = style({ - flexShrink: 0, - display: 'flex', - flexDirection: 'row', - position: 'relative', - height: '2px', - width: '20px', - backgroundColor: '#1f47ff', - selectors: { - '&::before': { - content: '""', - position: 'absolute', - left: 0, - top: '-9px', - width: '2px', - height: '20px', - backgroundColor: '#1f47ff', - }, - '&::after': { - content: '""', - position: 'absolute', - right: 0, - top: '-9px', - width: '2px', - height: '20px', - backgroundColor: '#1f47ff', - }, - }, -}); diff --git a/packages/canon/docs/components/LayoutComponents/styles.css b/packages/canon/docs/components/LayoutComponents/styles.css new file mode 100644 index 0000000000..9319121224 --- /dev/null +++ b/packages/canon/docs/components/LayoutComponents/styles.css @@ -0,0 +1,58 @@ +/* + * 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. + */ + +.layout-components { + display: flex; + justify-content: flex-start; + gap: 1rem; + flex-wrap: wrap; + + & .box { + display: flex; + flex-direction: column; + width: calc(33.33% - 0.67rem); + margin-bottom: 1rem; + align-items: flex-start; + } + + & .content { + flex: none; + background: linear-gradient(180deg, #f3f3f3 0%, #fff 100%); + border-radius: 4px; + width: 100%; + height: 180px; + transition: all 0.2s ease-in-out; + margin-bottom: 0.75rem; + display: flex; + align-items: center; + justify-content: center; + + &:hover { + transform: translateY(-4px); + } + } + + & .title { + font-size: 16px; + transition: color 0.2s ease-in-out; + margin-bottom: 0.25rem; + } + + & .description { + font-size: 16px; + color: #9e9e9e; + } +} diff --git a/packages/canon/docs/components/LayoutComponents/svgs/box.tsx b/packages/canon/docs/components/LayoutComponents/svgs/box.tsx new file mode 100644 index 0000000000..1749b38c6f --- /dev/null +++ b/packages/canon/docs/components/LayoutComponents/svgs/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/svgs/container.tsx b/packages/canon/docs/components/LayoutComponents/svgs/container.tsx new file mode 100644 index 0000000000..62fe4ce266 --- /dev/null +++ b/packages/canon/docs/components/LayoutComponents/svgs/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/svgs/grid.tsx b/packages/canon/docs/components/LayoutComponents/svgs/grid.tsx new file mode 100644 index 0000000000..5527d1f3e2 --- /dev/null +++ b/packages/canon/docs/components/LayoutComponents/svgs/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/svgs/inline.tsx b/packages/canon/docs/components/LayoutComponents/svgs/inline.tsx new file mode 100644 index 0000000000..fadb9bfc1b --- /dev/null +++ b/packages/canon/docs/components/LayoutComponents/svgs/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/svgs/stack.tsx b/packages/canon/docs/components/LayoutComponents/svgs/stack.tsx new file mode 100644 index 0000000000..aeda998d2e --- /dev/null +++ b/packages/canon/docs/components/LayoutComponents/svgs/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..5773eaeb27 --- /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 getProps(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..181933f0f8 --- /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 { getProps } from './getProps'; diff --git a/packages/canon/docs/components/Roadmap/index.tsx b/packages/canon/docs/components/Roadmap/Roadmap.tsx similarity index 100% rename from packages/canon/docs/components/Roadmap/index.tsx rename to packages/canon/docs/components/Roadmap/Roadmap.tsx diff --git a/packages/canon/docs/components/Roadmap/index.ts b/packages/canon/docs/components/Roadmap/index.ts new file mode 100644 index 0000000000..ac51dfa1ed --- /dev/null +++ b/packages/canon/docs/components/Roadmap/index.ts @@ -0,0 +1,16 @@ +/* + * 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 { Roadmap } from './Roadmap'; diff --git a/packages/canon/docs/components/Roadmap/styles.css b/packages/canon/docs/components/Roadmap/styles.css index e47aecf7fa..63f32312e7 100644 --- a/packages/canon/docs/components/Roadmap/styles.css +++ b/packages/canon/docs/components/Roadmap/styles.css @@ -4,7 +4,6 @@ } .roadmap .roadmap-item { - font-family: 'Geist', sans-serif; display: flex; align-items: center; justify-content: space-between; @@ -60,7 +59,6 @@ } .roadmap .roadmap-item .title { - font-weight: 300; font-size: 16px; } diff --git a/packages/canon/docs/components/Table/index.tsx b/packages/canon/docs/components/Table/Table.tsx similarity index 77% rename from packages/canon/docs/components/Table/index.tsx rename to packages/canon/docs/components/Table/Table.tsx index ead30985aa..74a26a89af 100644 --- a/packages/canon/docs/components/Table/index.tsx +++ b/packages/canon/docs/components/Table/Table.tsx @@ -15,18 +15,11 @@ */ import React from 'react'; -import { - cellStyles, - headerCellStyles, - tableStyles, - wrapperStyles, - rowStyles, -} from './table.css'; export const Root = ({ children }: { children: React.ReactNode }) => { return ( -
- {children}
+
+ {children}
); }; @@ -44,13 +37,13 @@ export const HeaderRow = ({ children }: { children: React.ReactNode }) => { }; export const HeaderCell = ({ children }: { children: React.ReactNode }) => { - return {children}; + return {children}; }; export const Row = ({ children }: { children: React.ReactNode }) => { - return {children}; + return {children}; }; export const Cell = ({ children }: { children: React.ReactNode }) => { - return {children}; + return {children}; }; diff --git a/packages/canon/docs/components/Table/index.ts b/packages/canon/docs/components/Table/index.ts new file mode 100644 index 0000000000..7419aa83a8 --- /dev/null +++ b/packages/canon/docs/components/Table/index.ts @@ -0,0 +1,16 @@ +/* + * 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 { Root, Header, Body, Row, Cell, HeaderRow, HeaderCell } from './Table'; diff --git a/packages/canon/docs/components/Table/styles.css b/packages/canon/docs/components/Table/styles.css new file mode 100644 index 0000000000..ed56774a85 --- /dev/null +++ b/packages/canon/docs/components/Table/styles.css @@ -0,0 +1,72 @@ +/* + * 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. + */ + +.sb-table-wrapper { + border: 1px solid #e7e7e7; + border-radius: 4px; + overflow: hidden; + + & .sb-table { + width: 100%; + margin: 0 !important; + padding: 0 !important; + border-spacing: 0px; + border-collapse: collapse; + } + + & .sb-table-cell { + padding: 12px 16px !important; + border: none !important; + text-align: left; + background-color: white !important; + font-size: 16px; + + & p { + margin: 0; + } + } + + & .sb-table-header-cell { + background-color: #f5f5f5 !important; + border-bottom: 1px solid #e7e7e7 !important; + font-weight: 500; + font-size: 14px; + } + + & .sb-table-row { + border: none; + border-bottom: 1px solid #e7e7e7; + &:last-child { + border-bottom: none; + } + } + + & .sb-table-chip { + display: inline-block; + font-size: 14px !important; + border: 1px solid #e7e7e7; + border-radius: 6px; + padding: 0px 6px; + height: 24px; + } + + & .sb-table-type { + display: flex; + flex-wrap: wrap; + flex-direction: row; + gap: 8px; + } +} diff --git a/packages/canon/docs/components/Table/table.css.ts b/packages/canon/docs/components/Table/table.css.ts deleted file mode 100644 index b01373ee04..0000000000 --- a/packages/canon/docs/components/Table/table.css.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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/Text.tsx similarity index 90% rename from packages/canon/docs/components/Text/index.tsx rename to packages/canon/docs/components/Text/Text.tsx index be882c0a81..90804b7da7 100644 --- a/packages/canon/docs/components/Text/index.tsx +++ b/packages/canon/docs/components/Text/Text.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; -import { textStyles } from './text.css'; export const Text = ({ children, @@ -25,7 +24,7 @@ export const Text = ({ style?: React.CSSProperties; }) => { return ( -

+
{children}
); diff --git a/packages/canon/docs/components/Text/index.ts b/packages/canon/docs/components/Text/index.ts new file mode 100644 index 0000000000..873fca2c76 --- /dev/null +++ b/packages/canon/docs/components/Text/index.ts @@ -0,0 +1,16 @@ +/* + * 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 { Text } from './Text'; diff --git a/packages/canon/docs/components/Text/text.css.ts b/packages/canon/docs/components/Text/styles.css similarity index 59% rename from packages/canon/docs/components/Text/text.css.ts rename to packages/canon/docs/components/Text/styles.css index 01b4cb8fc8..b1bc40a1ac 100644 --- a/packages/canon/docs/components/Text/text.css.ts +++ b/packages/canon/docs/components/Text/styles.css @@ -14,21 +14,30 @@ * limitations under the License. */ -import { globalStyle, style } from '@vanilla-extract/css'; +.sb-text { + font-size: 16px; + line-height: 28px; + margin: 0; + margin-bottom: 16px; + color: #4f4f4f; -export const textStyles = style({ - fontFamily: '"Geist", sans-serif', - fontSize: '16px', - lineHeight: '28px', - margin: '0', - fontWeight: 300, - paddingBottom: '16px', -}); + & p { + font-size: 16px; + line-height: 28px; + margin: 0; + } -globalStyle(`${textStyles} p`, { - fontFamily: '"Geist", sans-serif', - fontSize: '16px', - lineHeight: '28px', - margin: '0', - fontWeight: 300, -}); + & code { + font-size: 13px; + color: #215cff; + background-color: #f1f3fc; + padding: 4px 4px; + border-radius: 4px; + } + + & a { + color: #215cff; + text-decoration: none; + border-bottom: 1px solid #215cff; + } +} diff --git a/packages/canon/docs/components/Title/index.tsx b/packages/canon/docs/components/Title/Title.tsx similarity index 92% rename from packages/canon/docs/components/Title/index.tsx rename to packages/canon/docs/components/Title/Title.tsx index 13e5b964bb..59fefad8f9 100644 --- a/packages/canon/docs/components/Title/index.tsx +++ b/packages/canon/docs/components/Title/Title.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; -import { titleStyles } from './title.css'; export const Title = ({ children, @@ -32,7 +31,7 @@ export const Title = ({ if (type === 'h3') Component = 'h3'; return React.createElement(Component, { - className: titleStyles({ type }), + className: `sb-title ${type}`, style, children, }); diff --git a/packages/canon/docs/components/Title/index.ts b/packages/canon/docs/components/Title/index.ts new file mode 100644 index 0000000000..998dc81882 --- /dev/null +++ b/packages/canon/docs/components/Title/index.ts @@ -0,0 +1,16 @@ +/* + * 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 { Title } from './Title'; diff --git a/packages/canon/docs/components/Title/styles.css b/packages/canon/docs/components/Title/styles.css new file mode 100644 index 0000000000..61e99e20b3 --- /dev/null +++ b/packages/canon/docs/components/Title/styles.css @@ -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. + */ + +.sb-title { + margin: 0; + font-weight: 500; + border: none; + + &.h1 { + font-size: 36px; + line-height: 44px; + margin-bottom: 24px; + margin-top: 0px; + } + + &.h2 { + font-size: 24px; + line-height: 32px; + margin-bottom: 12px; + margin-top: 52px; + } + + &.h3 { + font-size: 20px; + line-height: 28px; + margin-bottom: 12px; + margin-top: 40px; + } +} diff --git a/packages/canon/docs/components/Title/title.css.ts b/packages/canon/docs/components/Title/title.css.ts deleted file mode 100644 index 5ca0394af6..0000000000 --- a/packages/canon/docs/components/Title/title.css.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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: '32px', - marginTop: '0px', - }, - h2: { - fontSize: '24px', - lineHeight: '32px', - marginBottom: '12px', - marginTop: '52px', - }, - h3: { - fontSize: '20px', - lineHeight: '28px', - marginBottom: '12px', - marginTop: '52px', - }, - }, - }, -}); diff --git a/packages/canon/docs/components/index.ts b/packages/canon/docs/components/index.ts index 7ad07bec6a..0e5ff2e325 100644 --- a/packages/canon/docs/components/index.ts +++ b/packages/canon/docs/components/index.ts @@ -14,13 +14,14 @@ * limitations under the License. */ +export * from './Banner'; 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 './LayoutComponents'; +export * from './PropsTable'; export * from './Roadmap'; +export * from './Table'; +export * from './Text'; +export * from './Title'; diff --git a/packages/canon/docs/components/styles.css b/packages/canon/docs/components/styles.css index 698085ad19..706b1626b3 100644 --- a/packages/canon/docs/components/styles.css +++ b/packages/canon/docs/components/styles.css @@ -1,2 +1,15 @@ +.sbdocs-content { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, + Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; +} + +@import './Banner/styles.css'; +@import './Chip/styles.css'; +@import './Columns/styles.css'; +@import './ComponentStatus/styles.css'; @import './IconLibrary/styles.css'; +@import './LayoutComponents/styles.css'; @import './Roadmap/styles.css'; +@import './Table/styles.css'; +@import './Text/styles.css'; +@import './Title/styles.css'; diff --git a/packages/canon/docs/spaceProps.ts b/packages/canon/docs/spaceProps.ts new file mode 100644 index 0000000000..3eb6961bc1 --- /dev/null +++ b/packages/canon/docs/spaceProps.ts @@ -0,0 +1,41 @@ +/* + * 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 const spacePropsList = [ + 'margin', + 'marginBottom', + 'marginLeft', + 'marginRight', + 'marginTop', + 'marginX', + 'marginY', + 'padding', + 'paddingBottom', + 'paddingLeft', + 'paddingRight', + 'paddingTop', + 'paddingX', + 'paddingY', +].reduce( + (acc: { [key: string]: { type: string[]; responsive: boolean } }, prop) => { + acc[prop] = { + type: ['2xs', 'xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl', '4xl', '5xl'], + responsive: true, + }; + return acc; + }, + {}, +); diff --git a/packages/canon/docs/utils/argTypes.ts b/packages/canon/docs/utils/argTypes.ts deleted file mode 100644 index ff5a159677..0000000000 --- a/packages/canon/docs/utils/argTypes.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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' 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/package.json b/packages/canon/package.json index 4ec11b31fb..23c40300f1 100644 --- a/packages/canon/package.json +++ b/packages/canon/package.json @@ -37,38 +37,31 @@ "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" + "@base-ui-components/react": "^1.0.0-alpha.4", + "@remixicon/react": "^4.5.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@chromatic-com/storybook": "^3.2.2", - "@storybook/addon-essentials": "^8.4.5", - "@storybook/addon-interactions": "^8.4.5", + "@storybook/addon-essentials": "^8.4.7", + "@storybook/addon-interactions": "^8.4.7", "@storybook/addon-styling-webpack": "^1.0.1", - "@storybook/addon-themes": "^8.4.5", + "@storybook/addon-themes": "^8.4.7", "@storybook/addon-webpack5-compiler-swc": "^1.0.5", - "@storybook/blocks": "^8.4.5", - "@storybook/react": "^8.4.5", - "@storybook/react-webpack5": "^8.4.5", - "@storybook/test": "^8.4.5", + "@storybook/blocks": "^8.4.7", + "@storybook/react": "^8.4.7", + "@storybook/react-webpack5": "^8.4.7", + "@storybook/test": "^8.4.7", "@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.5", - "webpack-merge": "^6.0.1" + "storybook": "^8.4.7" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", diff --git a/packages/canon/report.api.md b/packages/canon/report.api.md index e98d57a13d..fc1f773b4b 100644 --- a/packages/canon/report.api.md +++ b/packages/canon/report.api.md @@ -5,20 +5,15 @@ ```ts /// -import { CSSProperties } from 'react'; -import { DOMElement } from 'react'; +import type { CSSProperties } from 'react'; +import { ForwardRefExoticComponent } from 'react'; import { default as React_2 } from 'react'; +import * as React_3 from 'react'; import { ReactNode } from 'react'; +import { RefAttributes } from 'react'; // @public (undocumented) -export type AlignItemsProps = - | 'stretch' - | 'flex-start' - | 'center' - | 'flex-end' - | Partial< - Record - >; +export type AlignItems = 'stretch' | 'start' | 'center' | 'end'; // @public (undocumented) export type AsProps = @@ -40,95 +35,48 @@ export type AsProps = | 'dt'; // @public (undocumented) -export type Background = - | 'background' - | 'elevation1' - | 'elevation2' - | 'transparent' - | Partial< - Record - >; +export type Border = 'none' | 'base' | 'error' | 'warning' | 'selected'; // @public (undocumented) -export type BorderRadiusProps = +export type BorderRadius = | 'none' - | 'small' - | 'medium' - | 'full' - | Partial>; + | '2xs' + | 'xs' + | 'sm' + | 'md' + | 'lg' + | 'xl' + | '2xl'; // @public (undocumented) -export const Box: (props: BoxProps) => DOMElement< - { - className: string; - style: CSSProperties | undefined; - children: ReactNode; - }, - Element +export const Box: ForwardRefExoticComponent< + BoxProps & RefAttributes >; // @public (undocumented) -export interface BoxProps extends SpaceProps, ColorProps { - // (undocumented) - alignItems?: AlignItemsProps; +export interface BoxProps extends UtilityProps { // (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; +export type Breakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'; // @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: ({ - size, - variant, - children, - disabled, - iconStart, - iconEnd, - ...props -}: ButtonProps) => React_2.JSX.Element; +export const Button: React_2.ForwardRefExoticComponent< + ButtonProps & React_2.RefAttributes +>; // @public export interface ButtonProps { // (undocumented) - children: React_2.ReactNode; + children: React.ReactNode; // (undocumented) disabled?: boolean; // (undocumented) @@ -136,51 +84,178 @@ export interface ButtonProps { // (undocumented) iconStart?: IconNames; // (undocumented) - size?: 'small' | 'medium'; + size?: 'small' | 'medium' | Partial>; // (undocumented) - variant?: 'primary' | 'secondary'; + style?: React.CSSProperties; + // (undocumented) + variant?: + | 'primary' + | 'secondary' + | 'tertiary' + | Partial>; } // @public (undocumented) -export type Color = - | 'primary' - | 'secondary' - | 'error' - | Partial>; - -// @public (undocumented) -export interface ColorProps { +export interface CanonContextProps { // (undocumented) - background?: Background; + breakpoint: Breakpoint; // (undocumented) - color?: Color; + getResponsiveValue: ( + value: string | Partial>, + ) => string; + // (undocumented) + icons: IconMap; } // @public (undocumented) -export type DisplayProps = - | 'flex' - | 'none' - | 'inline' - | 'block' - | Partial>; +export const CanonProvider: (props: CanonProviderProps) => React_2.JSX.Element; // @public (undocumented) -export type FlexDirectionProps = - | 'row' - | 'column' - | Partial>; +export interface CanonProviderProps { + // (undocumented) + children?: ReactNode; + // (undocumented) + overrides?: Partial>; +} // @public (undocumented) -export type FlexWrapProps = - | 'wrap' - | 'nowrap' - | Partial>; +export const Checkbox: React_2.ForwardRefExoticComponent< + CheckboxProps & React_2.RefAttributes +>; // @public (undocumented) -export type Gap = Space | Partial>; +export interface CheckboxProps { + // (undocumented) + checked?: boolean; + // (undocumented) + className?: string; + // (undocumented) + defaultChecked?: boolean; + // (undocumented) + disabled?: boolean; + // (undocumented) + label?: string; + // (undocumented) + name?: string; + // (undocumented) + onChange?: (checked: boolean) => void; + // (undocumented) + required?: boolean; + // (undocumented) + style?: React.CSSProperties; + // (undocumented) + value?: string; +} // @public (undocumented) -export const Icon: ({ name }: { name: IconNames }) => React_2.JSX.Element; +export type Columns = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 'auto'; + +// @public (undocumented) +export const Container: React_2.ForwardRefExoticComponent< + ContainerProps & React_2.RefAttributes +>; + +// @public (undocumented) +export interface ContainerProps { + // (undocumented) + children?: React.ReactNode; + // (undocumented) + className?: string; + // (undocumented) + marginBottom?: SpaceProps['marginBottom']; + // (undocumented) + marginTop?: SpaceProps['marginTop']; + // (undocumented) + marginY?: SpaceProps['marginY']; + // (undocumented) + paddingBottom?: SpaceProps['paddingBottom']; + // (undocumented) + paddingTop?: SpaceProps['paddingTop']; + // (undocumented) + paddingY?: SpaceProps['paddingY']; + // (undocumented) + style?: React.CSSProperties; +} + +// @public (undocumented) +export type Display = 'none' | 'flex' | 'block' | 'inline'; + +// @public (undocumented) +export type FlexDirection = 'row' | 'column'; + +// @public (undocumented) +export type FlexWrap = 'wrap' | 'nowrap' | 'wrap-reverse'; + +// @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) + colEnd?: UtilityProps['colEnd']; + // (undocumented) + colSpan?: UtilityProps['colSpan']; + // (undocumented) + colStart?: UtilityProps['colStart']; + // (undocumented) + rowSpan?: UtilityProps['rowSpan']; + // (undocumented) + style?: React.CSSProperties; +} + +// @public (undocumented) +export interface GridProps extends SpaceProps { + // (undocumented) + children?: React.ReactNode; + // (undocumented) + className?: string; + // (undocumented) + columns?: UtilityProps['columns']; + // (undocumented) + gap?: UtilityProps['gap']; + // (undocumented) + style?: React.CSSProperties; +} + +// @public (undocumented) +export const Heading: React_2.ForwardRefExoticComponent< + HeadingProps & React_2.RefAttributes +>; + +// @public (undocumented) +export interface HeadingProps { + // (undocumented) + as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'; + // (undocumented) + children: React.ReactNode; + // (undocumented) + variant?: + | 'display' + | 'title1' + | 'title2' + | 'title3' + | 'title4' + | 'title5' + | Partial< + Record< + Breakpoint, + 'display' | 'title1' | 'title2' | 'title3' | 'title4' | 'title5' + > + >; +} + +// @public (undocumented) +export const Icon: (props: IconProps) => React_2.JSX.Element; // @public (undocumented) export type IconMap = Partial>; @@ -191,132 +266,227 @@ export type IconNames = | 'arrowLeft' | 'arrowRight' | 'arrowUp' + | 'arrowDownCircle' + | 'arrowLeftCircle' + | 'arrowRightCircle' + | 'arrowUpCircle' + | 'check' + | 'chevronDown' + | 'chevronLeft' + | 'chevronRight' + | 'chevronUp' | 'cloud' + | 'externalLink' | 'heart' + | 'moon' | 'plus' + | 'sun' | 'trash'; // @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; - xxs: string; - xs: string; - sm: string; - md: string; - lg: string; - xl: string; - xxl: string; +export type IconProps = { + name: IconNames; + size?: number; }; +// @public (undocumented) +export const icons: IconMap; + +// @public (undocumented) +export const Inline: ForwardRefExoticComponent< + InlineProps & RefAttributes +>; + +// @public (undocumented) +export interface InlineProps extends SpaceProps { + // (undocumented) + align?: + | 'left' + | 'center' + | 'right' + | Partial>; + // (undocumented) + alignY?: + | 'top' + | 'center' + | 'bottom' + | Partial>; + // (undocumented) + as?: AsProps; + // (undocumented) + children: React.ReactNode; + // (undocumented) + className?: string; + // (undocumented) + gap?: UtilityProps['gap']; + // (undocumented) + style?: React.CSSProperties; +} + +// @public (undocumented) +export type JustifyContent = + | 'stretch' + | 'start' + | 'center' + | 'end' + | 'around' + | 'between'; + +// @public (undocumented) +export type Space = 'none' | '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'; + // @public (undocumented) export interface SpaceProps { // (undocumented) - gap?: Gap; + margin?: Space | Partial>; // (undocumented) - margin?: Margin; + marginBottom?: Space | Partial>; // (undocumented) - marginBottom?: MarginBottom; + marginLeft?: Space | Partial>; // (undocumented) - marginLeft?: MarginLeft; + marginRight?: Space | Partial>; // (undocumented) - marginRight?: MarginRight; + marginTop?: Space | Partial>; // (undocumented) - marginTop?: MarginTop; + marginX?: Space | Partial>; // (undocumented) - marginX?: MarginX; + marginY?: Space | Partial>; // (undocumented) - marginY?: MarginY; + padding?: Space | Partial>; // (undocumented) - padding?: Padding; + paddingBottom?: Space | Partial>; // (undocumented) - paddingBottom?: PaddingBottom; + paddingLeft?: Space | Partial>; // (undocumented) - paddingLeft?: PaddingLeft; + paddingRight?: Space | Partial>; // (undocumented) - paddingRight?: PaddingRight; + paddingTop?: Space | Partial>; // (undocumented) - paddingTop?: PaddingTop; + paddingX?: Space | Partial>; // (undocumented) - paddingX?: PaddingX; - // (undocumented) - paddingY?: PaddingY; + paddingY?: Space | Partial>; } // @public (undocumented) -export type Theme = keyof typeof themes; +export const Stack: ForwardRefExoticComponent< + StackProps & RefAttributes +>; // @public (undocumented) -export const themes: { - light: { - selector: string; - }; - dark: { - selector: string; - }; -}; +export interface StackProps extends SpaceProps { + // (undocumented) + align?: + | 'left' + | 'center' + | 'right' + | Partial>; + // (undocumented) + as?: AsProps; + // (undocumented) + children: React.ReactNode; + // (undocumented) + className?: string; + // (undocumented) + gap?: UtilityProps['gap']; + // (undocumented) + style?: React.CSSProperties; +} + +// @public (undocumented) +export const Table: React_3.ForwardRefExoticComponent< + React_3.HTMLAttributes & + React_3.RefAttributes +>; + +// @public (undocumented) +export const TableBody: React_3.ForwardRefExoticComponent< + React_3.HTMLAttributes & + React_3.RefAttributes +>; + +// @public (undocumented) +export const TableCell: React_3.ForwardRefExoticComponent< + React_3.TdHTMLAttributes & + React_3.RefAttributes +>; + +// @public (undocumented) +export const TableFooter: React_3.ForwardRefExoticComponent< + React_3.HTMLAttributes & + React_3.RefAttributes +>; + +// @public (undocumented) +export const TableHead: React_3.ForwardRefExoticComponent< + React_3.ThHTMLAttributes & + React_3.RefAttributes +>; + +// @public (undocumented) +export const TableHeader: React_3.ForwardRefExoticComponent< + React_3.HTMLAttributes & + React_3.RefAttributes +>; + +// @public (undocumented) +export const TableRow: React_3.ForwardRefExoticComponent< + React_3.HTMLAttributes & + React_3.RefAttributes +>; + +// @public (undocumented) +const Text_2: React_2.ForwardRefExoticComponent< + TextProps & React_2.RefAttributes +>; +export { Text_2 as Text }; + +// @public (undocumented) +export interface TextProps { + // (undocumented) + children: ReactNode; + // (undocumented) + style?: CSSProperties; + // (undocumented) + variant?: + | 'subtitle' + | 'body' + | 'caption' + | 'label' + | Partial>; + // (undocumented) + weight?: 'regular' | 'bold' | Partial>; +} + +// @public (undocumented) +export const useCanon: () => CanonContextProps; + +// @public (undocumented) +export interface UtilityProps extends SpaceProps { + // (undocumented) + alignItems?: AlignItems | Partial>; + // (undocumented) + border?: Border | Partial>; + // (undocumented) + borderRadius?: BorderRadius | Partial>; + // (undocumented) + colEnd?: Columns | 'auto' | Partial>; + // (undocumented) + colSpan?: Columns | 'full' | Partial>; + // (undocumented) + colStart?: Columns | 'auto' | Partial>; + // (undocumented) + columns?: Columns | Partial>; + // (undocumented) + display?: Display | Partial>; + // (undocumented) + flexDirection?: FlexDirection | Partial>; + // (undocumented) + flexWrap?: FlexWrap | Partial>; + // (undocumented) + gap?: Space | Partial>; + // (undocumented) + justifyContent?: JustifyContent | Partial>; + // (undocumented) + rowSpan?: Columns | 'full' | Partial>; +} ``` diff --git a/packages/canon/src/components/Box/Box.stories.tsx b/packages/canon/src/components/Box/Box.stories.tsx index 6f15d984e1..d11f9fbab7 100644 --- a/packages/canon/src/components/Box/Box.stories.tsx +++ b/packages/canon/src/components/Box/Box.stories.tsx @@ -17,22 +17,8 @@ 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; -}, {}); +import { Stack } from '../Stack'; +import { Inline } from '../Inline'; const meta = { title: 'Components/Box', @@ -41,9 +27,6 @@ const meta = { layout: 'centered', }, argTypes: { - ...argTypesSpacing, - ...argTypesColor, - ...argTypesBox, as: { control: { type: 'select' }, options: ['div', 'span', 'article', 'section'], @@ -52,132 +35,381 @@ const meta = { 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 Default: Story = { + args: { + style: { + width: '64px', + height: '64px', + background: '#eaf2fd', + borderRadius: '4px', + border: '1px solid #2563eb', + color: '#2563eb', + backgroundImage: + 'url("data:image/svg+xml,%3Csvg%20width%3D%226%22%20height%3D%226%22%20viewBox%3D%220%200%206%206%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cg%20fill%3D%22%232563eb%22%20fill-opacity%3D%220.3%22%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M5%200h1L0%206V5zM6%205v1H5z%22/%3E%3C/g%3E%3C/svg%3E")', + }, + }, }; -export const Responsive: Story = { - render: () => ( - - Responsive Box - +export const Display: Story = { + args: { + style: { + ...Default.args?.style, + width: 'auto', + height: 'auto', + padding: '8px', + }, + }, + render: args => ( + + + + Block + + + Flex + + + Inline + + + None + + + + Responsive + + ), }; -export const FlexContainer: Story = { - render: () => ( - - - Item 1 +export const FlexDirection: Story = { + args: { + style: { + ...Default.args?.style, + width: 'auto', + height: 'auto', + padding: '8px', + }, + display: 'flex', + gap: 'xs', + }, + render: args => ( + + + Row + Row - - Item 2 + + Column + Column - - Item 3 + + Responsive + Flex Direction - + ), }; -export const Nested: Story = { - render: () => ( - - - Header +export const JustifyContent: Story = { + args: { + style: { + ...Default.args?.style, + width: '200px', + height: 'auto', + padding: '8px', + }, + display: 'flex', + gap: 'xs', + }, + render: args => ( + + + Flex Start + + + Center + + + Flex End + + + Space + Around + + + Space + Between - - Sidebar + Responsive + Spacing + + + ), +}; + +export const AlignItems: Story = { + args: { + style: { + ...Default.args?.style, + width: '200px', + height: '100px', + padding: '8px', + }, + display: 'flex', + gap: 'xs', + }, + render: args => ( + + + Flex Start + + + Center + + + Flex End + + + Responsive + Spacing + + + ), +}; + +const styleInsideBox = { + background: 'rgb(196, 202, 251)', + color: 'white', + borderRadius: '4px', +}; + +export const Padding: Story = { + args: { + style: { + background: '#1f47ff', + color: 'white', + borderRadius: '4px', + padding: '12px 12px', + }, + }, + render: args => ( + + + + Padding - - Main Content + + Padding X - - - Footer - - + + Padding Y + + + + + Padding Top + + + Padding Right + + + Padding Bottom + + + Padding Left + + + ), }; -export const Alignment: Story = { - render: () => ( - - - Centered Content - - +export const Margin: Story = { + args: { + style: { + background: '#1f47ff', + color: 'white', + borderRadius: '4px', + padding: '12px 12px', + }, + }, + render: args => ( + + + + + Margin + + + + + Margin X + + + + + Margin Y + + + + + + + Margin Top + + + + + Margin Right + + + + + Margin Bottom + + + + + Margin Left + + + + ), }; -// Example showing different spacing combinations -export const Spacing: Story = { - render: () => ( - - - Small Padding +export const FlexWrap: Story = { + args: { + style: { + ...Default.args?.style, + width: '200px', + height: 'auto', + padding: '8px', + }, + display: 'flex', + gap: 'xs', + }, + render: args => ( + + + One + Two + Three + Four + Five + Six - - Medium Padding + + One + Two + Three + Four + Five + Six - - Large Padding + + One + Two + Three + Four + Five + Six - - Mixed Padding - - + ), }; -// Example showing different display values -export const DisplayVariants: Story = { - render: () => ( - - - Display Block +export const BorderRadius: Story = { + args: { + style: { + width: '64px', + height: '64px', + background: '#eaf2fd', + border: '1px solid #2563eb', + color: '#2563eb', + backgroundImage: + 'url("data:image/svg+xml,%3Csvg%20width%3D%226%22%20height%3D%226%22%20viewBox%3D%220%200%206%206%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cg%20fill%3D%22%232563eb%22%20fill-opacity%3D%220.3%22%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M5%200h1L0%206V5zM6%205v1H5z%22/%3E%3C/g%3E%3C/svg%3E")', + padding: '4px 8px', + }, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }, + render: args => ( + + + 2xs - - Display Flex + + xs - - Display Inline + + sm - + + md + + + xl + + + 2xl + + + ), +}; + +export const Border: Story = { + args: { + style: { + background: 'var(--canon-surface-1)', + color: 'var(--canon-text-primary)', + padding: '4px 8px', + width: '80px', + height: '32px', + }, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + borderRadius: 'xs', + }, + render: args => ( + + + Base + + + Error + + + Warning + + + Selected + + + None + + ), }; diff --git a/packages/canon/src/components/Box/Box.tsx b/packages/canon/src/components/Box/Box.tsx index d134abff35..020f2b6fbb 100644 --- a/packages/canon/src/components/Box/Box.tsx +++ b/packages/canon/src/components/Box/Box.tsx @@ -14,26 +14,26 @@ * limitations under the License. */ -import { createElement } from 'react'; -import { boxSprinkles } from './sprinkles.css'; -import { base } from './box.css'; +import { createElement, forwardRef } from 'react'; import { BoxProps } from './types'; +import { getClassNames } from '../../utils/getClassNames'; /** @public */ -export const Box = (props: BoxProps) => { +export const Box = forwardRef((props, ref) => { const { as = 'div', className, style, children, ...restProps } = props; - // Generate the list of class names - const sprinklesClassName = boxSprinkles(restProps); + // Generate utility class names + const utilityClassNames = getClassNames(restProps); // Combine the base class name, the sprinkles class name, and any additional class names - const classNames = [base, sprinklesClassName, className] + const classNames = ['canon-box', utilityClassNames, 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 index dac10952cf..ee30e17305 100644 --- a/packages/canon/src/components/Box/Docs.mdx +++ b/packages/canon/src/components/Box/Docs.mdx @@ -1,9 +1,8 @@ -import { Canvas, Meta, Unstyled } from '@storybook/blocks'; +import { Meta, Unstyled, Source, Canvas } from '@storybook/blocks'; import * as BoxStories from './Box.stories'; import { Title, Text } from '../../../docs/components'; -import { Padding } from './docs/padding'; -import { PropsTable } from './docs/props-table'; -import { SpacingTable } from './docs/spacing-table'; +import { PropsTable } from '../../../docs/components'; +import { spacePropsList } from '../../../docs/spaceProps'; @@ -12,21 +11,102 @@ import { SpacingTable } from './docs/spacing-table'; Box Box is the lowest-level component in Canon. We use it internally to build all - of our components. It is a wrapper around the HTML `
` element and - provides a consistent API for styling and layout. You'll find below a list of all the available properties. + of our components. It provides a consistent API for styling and layout. - +Usage +Padding & Margin +Hello World! +`} language="tsx" dark /> + +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/docs/padding.tsx b/packages/canon/src/components/Box/docs/padding.tsx deleted file mode 100644 index 86a7c801a2..0000000000 --- a/packages/canon/src/components/Box/docs/padding.tsx +++ /dev/null @@ -1,107 +0,0 @@ -/* - * 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/docs/props-table.tsx b/packages/canon/src/components/Box/docs/props-table.tsx deleted file mode 100644 index 9979701f2e..0000000000 --- a/packages/canon/src/components/Box/docs/props-table.tsx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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 '../../../../docs/components'; -import { Chip } from '../../../../docs/components'; -import { listResponsiveValues } from '../../../../docs/utils/argTypes'; -import { boxProperties } from '../sprinkles.css'; - -export const PropsTable = () => { - return ( - - - - Prop - Type - - - - {Object.keys(boxProperties.styles) - .filter( - n => - ![ - 'padding', - 'paddingX', - 'paddingY', - 'paddingLeft', - 'paddingRight', - 'paddingTop', - 'paddingBottom', - 'margin', - 'marginX', - 'marginY', - 'marginLeft', - 'marginRight', - 'marginTop', - 'marginBottom', - ].includes(n), - ) - .map(n => ( - - - {n} - - - {listResponsiveValues( - n as keyof typeof boxProperties.styles, - ).map(value => ( - {value} - ))} - - - ))} - - - ); -}; diff --git a/packages/canon/src/components/Box/docs/spacing-table.tsx b/packages/canon/src/components/Box/docs/spacing-table.tsx deleted file mode 100644 index 93c38457d4..0000000000 --- a/packages/canon/src/components/Box/docs/spacing-table.tsx +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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 '../../../../docs/components'; -import { Chip } from '../../../../docs/components'; -import { spacingProperties } from '../../../layout/sprinkles.css'; -import { space } from '../../../layout/properties'; - -export const SpacingTable = () => { - return ( - - - - Prop - Type - - - - {Object.keys(spacingProperties.styles) - .filter(n => - [ - 'padding', - 'paddingX', - 'paddingY', - 'paddingLeft', - 'paddingRight', - 'paddingTop', - 'paddingBottom', - 'margin', - 'marginX', - 'marginY', - 'marginLeft', - 'marginRight', - 'marginTop', - 'marginBottom', - ].includes(n), - ) - .map(n => ( - - - {n} - - - {Object.keys(space).map(value => ( - {value} - ))} - - - ))} - - - ); -}; diff --git a/packages/canon/src/components/Box/index.tsx b/packages/canon/src/components/Box/index.tsx index e4f1867edc..d47e653dfd 100644 --- a/packages/canon/src/components/Box/index.tsx +++ b/packages/canon/src/components/Box/index.tsx @@ -15,4 +15,3 @@ */ 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 deleted file mode 100644 index df5664029b..0000000000 --- a/packages/canon/src/components/Box/sprinkles.css.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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/styles.css b/packages/canon/src/components/Box/styles.css new file mode 100644 index 0000000000..a90ce578cd --- /dev/null +++ b/packages/canon/src/components/Box/styles.css @@ -0,0 +1,4 @@ +.canon-box { + font-family: 'var(--canon-font-regular)'; + color: 'var(--canon-text-primary)'; +} diff --git a/packages/canon/src/components/Box/types.ts b/packages/canon/src/components/Box/types.ts index 2ba5929fdd..a55c856caf 100644 --- a/packages/canon/src/components/Box/types.ts +++ b/packages/canon/src/components/Box/types.ts @@ -14,76 +14,12 @@ * limitations under the License. */ -import { Breakpoint, SpaceProps, ColorProps } from '../../layout/types'; +import type { UtilityProps } from '../../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 { +export interface BoxProps extends UtilityProps { 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 index 7dddbd033b..728098970c 100644 --- a/packages/canon/src/components/Button/Button.stories.tsx +++ b/packages/canon/src/components/Button/Button.stories.tsx @@ -17,15 +17,14 @@ import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { Button } from './Button'; -import { Box } from '../Box/Box'; +import { Inline } from '../Inline'; +import { Stack } from '../Stack'; +import { Text } from '../Text'; +import { ButtonProps } from './types'; const meta = { title: 'Components/Button', component: Button, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], argTypes: { size: { control: 'select', @@ -40,28 +39,41 @@ const meta = { export default meta; type Story = StoryObj; -export const Primary: Story = { +export const Variants: Story = { args: { - children: 'Primary button', + children: 'Button', }, -}; - -export const Secondary: Story = { - args: { - children: 'Secondary button', - variant: 'secondary', + parameters: { + argTypes: { + variant: { + control: false, + }, + }, }, + render: () => ( + + + + + + ), }; export const Sizes: Story = { args: { children: 'Button', }, - render: args => ( -
-
+ render: () => ( + + + + ), }; @@ -70,11 +82,11 @@ export const WithIcons: Story = { children: 'Button', }, render: args => ( -
+
+ + + + + ))} + + ))} + + ), }; diff --git a/packages/canon/src/components/Button/Button.tsx b/packages/canon/src/components/Button/Button.tsx index 020d0adce4..081d09a1d5 100644 --- a/packages/canon/src/components/Button/Button.tsx +++ b/packages/canon/src/components/Button/Button.tsx @@ -14,46 +14,58 @@ * limitations under the License. */ -import React from 'react'; -import { button } from './button.css'; -import { Icon } from '../Icon/Icon'; -import type { IconNames } from '../Icon/types'; - -/** - * Properties for {@link Button} - * - * @public - */ -export interface ButtonProps { - size?: 'small' | 'medium'; - variant?: 'primary' | 'secondary'; - children: React.ReactNode; - disabled?: boolean; - iconStart?: IconNames; - iconEnd?: IconNames; -} +import React, { forwardRef } from 'react'; +import { Icon } from '../Icon'; +import { ButtonProps } from './types'; +import { useCanon } from '../../contexts/canon'; /** @public */ -export const Button = ({ - size = 'medium', - variant = 'primary', - children, - disabled, - iconStart, - iconEnd, - ...props -}: ButtonProps) => { - return ( - - ); -}; +export const Button = forwardRef( + (props: ButtonProps, ref) => { + const { + size = 'medium', + variant = 'primary', + disabled, + iconStart, + iconEnd, + children, + style, + ...rest + } = props; + + const { getResponsiveValue } = useCanon(); + + // Get the responsive value for the variant + const responsiveSize = getResponsiveValue(size); + const responsiveVariant = getResponsiveValue(variant); + + return ( + + ); + }, +); export default Button; diff --git a/packages/canon/src/components/Button/Docs.mdx b/packages/canon/src/components/Button/Docs.mdx new file mode 100644 index 0000000000..ae90b5fd80 --- /dev/null +++ b/packages/canon/src/components/Button/Docs.mdx @@ -0,0 +1,135 @@ +import { Canvas, Meta, Unstyled, Source } from '@storybook/blocks'; +import * as ButtonStories from './Button.stories'; +import { Title, Text } from '../../../docs/components'; +import { PropsTable } from '../../../docs/components/PropsTable/PropsTable'; + + + + + +Button +A button component that can be used to trigger actions. + + + +Usage +Click me +`} language="tsx" dark /> + + + API reference + + + + +Examples + +Variants +Here's a view when buttons have different variants. + + + + + + + +`} + language="tsx" + dark +/> + +Sizes +Here's a view when buttons have different sizes. + + + + + + +`} + language="tsx" + dark +/> + +With Icons +Here's a view when buttons have icons. + + + + + + + +`} + language="tsx" + dark +/> + +Full width +Here's a view when buttons are full width. + + + + + + + +`} + language="tsx" + dark +/> + +Disabled +Here's a view when buttons are disabled. + + + +Button`} language="tsx" dark /> + +Responsive +Here's a view when buttons are responsive. + + + + + Button +`} + language="tsx" + dark +/> + + diff --git a/packages/canon/src/components/Button/button.css.ts b/packages/canon/src/components/Button/button.css.ts deleted file mode 100644 index 9d6c8867c3..0000000000 --- a/packages/canon/src/components/Button/button.css.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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 button = recipe({ - base: { - all: 'unset', - display: 'inline-flex', - alignItems: 'center', - userSelect: 'none', - fontFamily: 'var(--canon-font-sans)', - fontWeight: 600, - fontSize: '0.875rem', - lineHeight: '1.5', - padding: 0, - transition: 'all 150ms ease', - cursor: 'pointer', - }, - variants: { - variant: { - primary: { - backgroundColor: 'var(--button-primary-background-color)', - color: 'var(--button-primary-text-color)', - borderRadius: 'var(--button-primary-border-radius)', - border: `1px solid var(--button-primary-border-color)`, - '&:hover': { - backgroundColor: 'var(--button-primary-background-color-hover)', - borderColor: 'var(--button-primary-border-color-hover)', - }, - }, - secondary: { - backgroundColor: 'transparent', - color: 'var(--button-secondary-text-color)', - borderRadius: 'var(--button-secondary-border-radius)', - border: `1px solid var(--button-secondary-border-color)`, - '&:hover': { - backgroundColor: 'var(--button-secondary-background-color-hover)', - borderColor: 'var(--button-secondary-border-color-hover)', - }, - }, - }, - size: { - small: { - paddingLeft: '16px', - paddingRight: '16px', - height: 'var(--button-size-small)', - }, - medium: { - paddingLeft: '32px', - paddingRight: '32px', - height: 'var(--button-size-medium)', - }, - }, - disabled: { - true: { - opacity: 0.3, - cursor: 'not-allowed', - }, - }, - }, -}); diff --git a/packages/canon/src/components/Button/index.tsx b/packages/canon/src/components/Button/index.tsx index bc6714754d..c323ba0329 100644 --- a/packages/canon/src/components/Button/index.tsx +++ b/packages/canon/src/components/Button/index.tsx @@ -14,4 +14,4 @@ * limitations under the License. */ export { Button } from './Button'; -export type { ButtonProps } from './Button'; +export type { ButtonProps } from './types'; diff --git a/packages/canon/src/components/Button/styles.css b/packages/canon/src/components/Button/styles.css index 766390a862..7af027ddcd 100644 --- a/packages/canon/src/components/Button/styles.css +++ b/packages/canon/src/components/Button/styles.css @@ -14,44 +14,70 @@ * limitations under the License. */ -:root { - --button-primary-background-color: #1ed760; - --button-primary-background-color-hover: #3be477; - --button-primary-background-color-active: #1abc54; - --button-primary-border-color: #1ed760; - --button-primary-border-color-hover: #3be477; - --button-primary-border-color-active: #1abc54; - --button-primary-text-color: #000; - --button-primary-border-radius: 9999px; - --button-secondary-background-color: transparent; - --button-secondary-background-color-hover: transparent; - --button-secondary-background-color-active: rgba(0, 0, 0, 0.03); - --button-secondary-border-color: #000; - --button-secondary-border-color-hover: #000; - --button-secondary-border-color-active: #000; - --button-secondary-text-color: #000; - --button-secondary-border-radius: 9999px; - --button-size-small: 32px; - --button-size-medium: 48px; +.cn-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-weight-bold); + font-size: var(--canon-font-size-body); + padding: 0; + transition: all 150ms ease; + cursor: pointer; + border-radius: 8px; } -[data-theme='dark'] { - --button-primary-background-color: #1ed760; - --button-primary-background-color-hover: #3be477; - --button-primary-background-color-active: #1abc54; - --button-primary-border-color: #1ed760; - --button-primary-border-color-hover: #3be477; - --button-primary-border-color-active: #1abc54; - --button-primary-text-color: #000; - --button-primary-border-radius: 9999px; - --button-secondary-background-color: transparent; - --button-secondary-background-color-hover: transparent; - --button-secondary-background-color-active: rgba(255, 255, 255, 0.1); - --button-secondary-border-color: #fff; - --button-secondary-border-color-hover: #fff; - --button-secondary-border-color-active: #fff; - --button-secondary-text-color: #fff; - --button-secondary-border-radius: 9999px; - --button-size-small: 32px; - --button-size-medium: 48px; +.cn-button-primary { + background-color: var(--canon-accent); + color: var(--canon-text-primary-on-accent); + + &:hover { + background-color: transparent; + box-shadow: inset 0 0 0 1px var(--canon-border-focus); + color: var(--canon-text-primary); + } +} + +.cn-button-secondary { + background-color: transparent; + box-shadow: inset 0 0 0 1px var(--canon-border-base); + color: var(--canon-text-primary); + + &:hover { + box-shadow: inset 0 0 0 1px var(--canon-border-hover); + } +} + +.cn-button-tertiary { + background-color: transparent; + color: var(--canon-text-primary); + + &:hover { + color: var(--canon-text-secondary); + } +} + +.cn-button-small { + padding-left: 6px; + padding-right: 6px; + height: 32px; +} + +.cn-button-medium { + padding-left: 8px; + padding-right: 8px; + height: 40px; +} + +.cn-button-content { + display: flex; + align-items: center; + gap: var(--canon-spacing-xs); + font-weight: var(--canon-font-weight-bold); +} + +.cn-button-content-icon-both { + flex: 1; } diff --git a/packages/canon/src/components/Button/types.ts b/packages/canon/src/components/Button/types.ts new file mode 100644 index 0000000000..96a11df84f --- /dev/null +++ b/packages/canon/src/components/Button/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 { IconNames } from '../Icon'; +import type { Breakpoint } from '../../types'; +/** + * Properties for {@link Button} + * + * @public + */ +export interface ButtonProps { + size?: 'small' | 'medium' | Partial>; + variant?: + | 'primary' + | 'secondary' + | 'tertiary' + | Partial>; + children: React.ReactNode; + disabled?: boolean; + iconStart?: IconNames; + iconEnd?: IconNames; + style?: React.CSSProperties; +} diff --git a/packages/canon/src/components/Checkbox/Checkbox.stories.tsx b/packages/canon/src/components/Checkbox/Checkbox.stories.tsx new file mode 100644 index 0000000000..574783578c --- /dev/null +++ b/packages/canon/src/components/Checkbox/Checkbox.stories.tsx @@ -0,0 +1,64 @@ +/* + * 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 { Checkbox } from './Checkbox'; +import { Inline } from '../Inline'; +import { Stack } from '../Stack'; +import { Text } from '../Text'; + +const meta = { + title: 'Components/Checkbox', + component: Checkbox, + parameters: { + layout: 'centered', + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + label: 'Accept terms and conditions', + }, +}; + +export const AllVariants: Story = { + render: () => ( + + + + + + + ), +}; + +export const Playground: Story = { + render: () => ( + + All variants + + + + + + + + ), +}; diff --git a/packages/canon/src/components/Checkbox/Checkbox.tsx b/packages/canon/src/components/Checkbox/Checkbox.tsx new file mode 100644 index 0000000000..a23ccc01ce --- /dev/null +++ b/packages/canon/src/components/Checkbox/Checkbox.tsx @@ -0,0 +1,64 @@ +/* + * 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 { Checkbox as CheckboxPrimitive } from '@base-ui-components/react/checkbox'; +import { Icon } from '@backstage/canon'; +import type { CheckboxProps } from './types'; + +/** @public */ +export const Checkbox = React.forwardRef( + (props, ref) => { + const { + label, + checked, + onChange, + disabled, + required, + className, + name, + value, + style, + } = props; + + const checkboxElement = ( + + + + + + ); + + return label ? ( + + ) : ( + checkboxElement + ); + }, +); diff --git a/packages/canon/src/components/Checkbox/Docs.mdx b/packages/canon/src/components/Checkbox/Docs.mdx new file mode 100644 index 0000000000..9826708888 --- /dev/null +++ b/packages/canon/src/components/Checkbox/Docs.mdx @@ -0,0 +1,70 @@ +import { Canvas, Meta, Unstyled, Source } from '@storybook/blocks'; +import * as CheckboxStories from './Checkbox.stories'; +import { Title, Text } from '../../../docs/components'; +import { PropsTable } from '../../../docs/components/PropsTable'; + + + + + +Checkbox +A checkbox component that can be used to trigger actions. + + + +Usage + +`} language="tsx" dark /> + + + API reference + + + void", + responsive: false, + }, + disabled: { + type: 'boolean', + responsive: false, + }, + required: { + type: 'boolean', + responsive: false, + }, + name: { + type: 'string', + responsive: false, + }, + value: { + type: 'string', + responsive: false, + }, + className: { + type: 'string', + responsive: false, + }, + style: { + type: 'CSSProperties', + responsive: false, + }, + }} +/> + + diff --git a/packages/canon/src/components/Checkbox/index.ts b/packages/canon/src/components/Checkbox/index.ts new file mode 100644 index 0000000000..f6dfbf6beb --- /dev/null +++ b/packages/canon/src/components/Checkbox/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 { Checkbox } from './Checkbox'; +export type { CheckboxProps } from './types'; diff --git a/packages/canon/src/components/Checkbox/styles.css b/packages/canon/src/components/Checkbox/styles.css new file mode 100644 index 0000000000..c1f285f7c7 --- /dev/null +++ b/packages/canon/src/components/Checkbox/styles.css @@ -0,0 +1,41 @@ +.checkbox-label { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: var(--canon-spacing-xs); + font-size: var(--canon-font-size-xs); + font-family: var(--canon-font-regular); + color: var(--canon-text-primary); + user-select: none; + + &:hover { + & .checkbox { + box-shadow: inset 0 0 0 1px var(--canon-border-hover); + } + } +} + +.checkbox { + all: unset; + display: flex; + align-items: center; + justify-content: center; + width: 1rem; + height: 1rem; + box-shadow: inset 0 0 0 1px var(--canon-border-base); + cursor: pointer; + border-radius: 2px; + transition: all 0.2s ease-in-out; + + &[data-checked] { + background-color: var(--canon-accent); + } +} + +.checkbox-indicator { + display: flex; + align-items: center; + justify-content: center; + color: var(--canon-text-primary-on-accent); +} diff --git a/packages/canon/src/components/Checkbox/types.ts b/packages/canon/src/components/Checkbox/types.ts new file mode 100644 index 0000000000..0240954afa --- /dev/null +++ b/packages/canon/src/components/Checkbox/types.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. + */ + +/** @public */ +export interface CheckboxProps { + label?: string; + defaultChecked?: boolean; + checked?: boolean; + onChange?: (checked: boolean) => void; + disabled?: boolean; + required?: boolean; + className?: string; + name?: string; + value?: string; + style?: React.CSSProperties; +} 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..c9f468048e --- /dev/null +++ b/packages/canon/src/components/Container/Container.stories.tsx @@ -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 React from 'react'; +import type { Meta, StoryObj } from '@storybook/react'; +import { Box } from '../Box/Box'; +import { Container } from './Container'; + +const meta = { + title: 'Components/Container', + component: Container, + argTypes: { + children: { + control: false, + }, + className: { + control: 'text', + }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const DecorativeBox = () => ( + +); + +export const Default: Story = { + parameters: { + layout: 'fullscreen', + }, + render: args => ( + + + + ), +}; + +export const Preview: Story = { + render: () => ( +
+ +
+ ), +}; diff --git a/packages/canon/src/components/Container/Container.tsx b/packages/canon/src/components/Container/Container.tsx new file mode 100644 index 0000000000..bea7b4caf1 --- /dev/null +++ b/packages/canon/src/components/Container/Container.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, { forwardRef } from 'react'; +import { ContainerProps } from './types'; +import { getClassNames } from '../../utils/getClassNames'; + +/** @public */ +export const Container = forwardRef( + (props, ref) => { + const { children, className, style, ...restProps } = props; + + // Generate utility class names + const utilityClassNames = getClassNames(restProps); + + // Combine the base class name, the sprinkles class name, and any additional class names + const classNames = ['canon-container', utilityClassNames, className] + .filter(Boolean) + .join(' '); + + 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..05a0600813 --- /dev/null +++ b/packages/canon/src/components/Container/Docs.mdx @@ -0,0 +1,99 @@ +import { Meta, Unstyled, Source } from '@storybook/blocks'; +import * as ContainerStories from './Container.stories'; +import { Title, Text, PropsTable, getProps } from '../../../docs/components'; +import { spacePropsList } from '../../../docs/spaceProps'; + + + + + +Container + + + The container component let you use our default max-width and center the + content on the page. + + +Usage +Hello World! +`} language="tsx" dark /> + + + 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/styles.css b/packages/canon/src/components/Container/styles.css new file mode 100644 index 0000000000..f3ebd64f52 --- /dev/null +++ b/packages/canon/src/components/Container/styles.css @@ -0,0 +1,5 @@ +.canon-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..f9a71ecfa1 --- /dev/null +++ b/packages/canon/src/components/Container/types.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 { SpaceProps } from '../../types'; + +/** @public */ +export interface ContainerProps { + children?: React.ReactNode; + className?: string; + marginY?: SpaceProps['marginY']; + marginBottom?: SpaceProps['marginBottom']; + marginTop?: SpaceProps['marginTop']; + paddingY?: SpaceProps['paddingY']; + paddingBottom?: SpaceProps['paddingBottom']; + paddingTop?: SpaceProps['paddingTop']; + 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..c1a0237279 --- /dev/null +++ b/packages/canon/src/components/Grid/Docs.mdx @@ -0,0 +1,199 @@ +import { Canvas, Meta, Unstyled, Source } from '@storybook/blocks'; +import * as GridStories from './Grid.stories'; +import { Title, Text, PropsTable } from '../../../docs/components'; +import { spacePropsList } from '../../../docs/spaceProps'; + + + + + +Grid + + A layout component that helps to create simple column-based layouts as well as + more complex ones. + + +Usage + + Hello World + +`} 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..9aeec52d00 --- /dev/null +++ b/packages/canon/src/components/Grid/Grid.stories.tsx @@ -0,0 +1,132 @@ +/* + * 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 { Stack } from '../Stack'; + +const meta = { + title: 'Components/Grid', + component: Grid, + argTypes: { + 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..3799a70ae8 --- /dev/null +++ b/packages/canon/src/components/Grid/Grid.tsx @@ -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 { createElement, forwardRef } from 'react'; +import { GridItemProps, GridProps } from './types'; +import { getClassNames } from '../../utils/getClassNames'; + +const GridBase = forwardRef((props, ref) => { + const { + children, + gap = 'xs', + columns = 'auto', + className, + style, + ...restProps + } = props; + + const utilityClassNames = getClassNames({ gap, columns, ...restProps }); + + const classNames = ['canon-grid', utilityClassNames, className] + .filter(Boolean) + .join(' '); + + return createElement('div', { + ref, + className: classNames, + style, + children, + }); +}); + +const GridItem = forwardRef((props, ref) => { + const { children, className, style, ...restProps } = props; + + const utilityClassNames = getClassNames(restProps); + + const classNames = ['grid-item', utilityClassNames, 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..b2534c6b77 --- /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 } from './types'; diff --git a/packages/canon/src/components/Grid/styles.css b/packages/canon/src/components/Grid/styles.css new file mode 100644 index 0000000000..8314f896bc --- /dev/null +++ b/packages/canon/src/components/Grid/styles.css @@ -0,0 +1,3 @@ +.canon-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..4e154f03b7 --- /dev/null +++ b/packages/canon/src/components/Grid/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. + */ + +import type { UtilityProps, SpaceProps } from '../../types'; + +/** @public */ +export interface GridProps extends SpaceProps { + children?: React.ReactNode; + className?: string; + columns?: UtilityProps['columns']; + gap?: UtilityProps['gap']; + style?: React.CSSProperties; +} + +/** @public */ +export interface GridItemProps { + children: React.ReactNode; + className?: string; + colSpan?: UtilityProps['colSpan']; + colEnd?: UtilityProps['colEnd']; + colStart?: UtilityProps['colStart']; + rowSpan?: UtilityProps['rowSpan']; + style?: React.CSSProperties; +} diff --git a/packages/canon/src/components/Heading/Docs.mdx b/packages/canon/src/components/Heading/Docs.mdx new file mode 100644 index 0000000000..dd64bd59b2 --- /dev/null +++ b/packages/canon/src/components/Heading/Docs.mdx @@ -0,0 +1,83 @@ +import { Canvas, Meta, Unstyled, Source } from '@storybook/blocks'; +import * as HeadingStories from './Heading.stories'; +import { Title, Text } from '../../../docs/components'; +import { PropsTable } from '../../../docs/components/PropsTable/PropsTable'; + + + + + +Heading + +Headings are used to structure the content of your page. + + + +Usage +Hello World! +`} language="tsx" dark /> + + + API reference + + + + +Examples +Here are some examples of how you can use the Heading component. + +All variants + + The `Heading` component has a `variant` prop that can be used to change the + appearance of the heading. + + + + + + Title 1 Lorem ipsum dolor sit amet consectetur... + Title 2 Lorem ipsum dolor sit amet consectetur... + Title 3 Lorem ipsum dolor sit amet consectetur... + Title 4 Lorem ipsum dolor sit amet consectetur... + Title 5 Lorem ipsum dolor sit amet consectetur... + Display Lorem ipsum dolor sit amet consectetur... +`} + language="tsx" + dark +/> + +Responsive + + You can also use the `variant` prop to change the appearance of the text based + on the screen size. + + +Responsive Lorem ipsum dolor sit amet consectetur...`} + language="tsx" + dark +/> + + diff --git a/packages/canon/src/components/Heading/Heading.stories.tsx b/packages/canon/src/components/Heading/Heading.stories.tsx new file mode 100644 index 0000000000..dc74ea0e16 --- /dev/null +++ b/packages/canon/src/components/Heading/Heading.stories.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'; +import type { Meta, StoryObj } from '@storybook/react'; +import { Heading } from './Heading'; +import { Stack } from '../Stack'; +import { Text } from '../Text'; +const meta = { + title: 'Components/Heading', + component: Heading, + args: { + children: 'Heading', + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Title1: Story = { + args: { + children: 'Look mum, no hands!', + variant: 'title1', + }, +}; + +export const AllVariants: Story = { + render: () => ( + + Display + Title 1 + Title 2 + Title 3 + Title 4 + + ), +}; + +export const Responsive: Story = { + args: { + variant: { + xs: 'title4', + md: 'display', + }, + }, +}; + +export const CustomTag: Story = { + args: { + variant: 'title5', + as: 'h2', + }, +}; + +export const Playground: Story = { + render: () => ( + + All variants + Display + Title 1 + Title 2 + Title 3 + Title 4 + Title 5 + + ), +}; diff --git a/packages/canon/src/components/Heading/Heading.tsx b/packages/canon/src/components/Heading/Heading.tsx new file mode 100644 index 0000000000..612c871ebb --- /dev/null +++ b/packages/canon/src/components/Heading/Heading.tsx @@ -0,0 +1,52 @@ +/* + * 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 { HeadingProps } from './types'; +import { useCanon } from '../../contexts/canon'; + +/** @public */ +export const Heading = forwardRef( + (props, ref) => { + const { children, variant = 'title1', as = 'h1', ...restProps } = props; + const { getResponsiveValue } = useCanon(); + + // Get the responsive value for the variant + const responsiveVariant = getResponsiveValue(variant); + + // Determine the component to render based on the variant + let Component = as; + if (variant === 'title2') Component = 'h2'; + if (variant === 'title3') Component = 'h3'; + if (variant === 'title4') Component = 'h4'; + if (variant === 'title5') Component = 'h5'; + if (as) Component = as; + + return ( + + {children} + + ); + }, +); + +Heading.displayName = 'Heading'; diff --git a/packages/canon/src/components/Heading/index.ts b/packages/canon/src/components/Heading/index.ts new file mode 100644 index 0000000000..69b7c3c1a0 --- /dev/null +++ b/packages/canon/src/components/Heading/index.ts @@ -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 { Heading } from './Heading'; +export type { HeadingProps } from './types'; diff --git a/packages/canon/src/components/Heading/styles.css b/packages/canon/src/components/Heading/styles.css new file mode 100644 index 0000000000..446a5b7d2b --- /dev/null +++ b/packages/canon/src/components/Heading/styles.css @@ -0,0 +1,58 @@ +/* + * 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. + */ + +.text { + font-family: var(--canon-font-regular); + color: var(--canon-text-primary); + padding: 0; + margin: 0; + + &.text-display { + font-size: var(--canon-font-size-display); + line-height: 100%; + font-weight: var(--canon-font-weight-bold); + } + + &.text-title1 { + font-size: var(--canon-font-size-title1); + line-height: 100%; + font-weight: var(--canon-font-weight-bold); + } + + &.text-title2 { + font-size: var(--canon-font-size-title2); + line-height: 100%; + font-weight: var(--canon-font-weight-bold); + } + + &.text-title3 { + font-size: var(--canon-font-size-title3); + line-height: 100%; + font-weight: var(--canon-font-weight-bold); + } + + &.text-title4 { + font-size: var(--canon-font-size-title4); + line-height: 100%; + font-weight: var(--canon-font-weight-bold); + } + + &.text-title5 { + font-size: var(--canon-font-size-title5); + line-height: 100%; + font-weight: var(--canon-font-weight-bold); + } +} diff --git a/packages/canon/src/components/Heading/types.ts b/packages/canon/src/components/Heading/types.ts new file mode 100644 index 0000000000..7a9a44560c --- /dev/null +++ b/packages/canon/src/components/Heading/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 { Breakpoint } from '../../types'; + +/** @public */ +export interface HeadingProps { + children: React.ReactNode; + variant?: + | 'display' + | 'title1' + | 'title2' + | 'title3' + | 'title4' + | 'title5' + | Partial< + Record< + Breakpoint, + 'display' | 'title1' | 'title2' | 'title3' | 'title4' | 'title5' + > + >; + as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'; +} diff --git a/packages/canon/src/components/Icon/Docs.mdx b/packages/canon/src/components/Icon/Docs.mdx new file mode 100644 index 0000000000..41c296424c --- /dev/null +++ b/packages/canon/src/components/Icon/Docs.mdx @@ -0,0 +1,48 @@ +import { Canvas, Meta, Unstyled, Source } from '@storybook/blocks'; +import * as IconStories from './Icon.stories'; +import { Title, Text } from '../../../docs/components'; +import { PropsTable } from '../../../docs/components/PropsTable/PropsTable'; +import { icons } from './icons'; + + + + + +Icon + +Icons are used to represent an action or a state. + + + +Usage + +`} language="tsx" dark /> + + + API reference + + + + + diff --git a/packages/canon/src/components/Icon/Icon.stories.tsx b/packages/canon/src/components/Icon/Icon.stories.tsx index 61e837c5ed..cdf63fbb32 100644 --- a/packages/canon/src/components/Icon/Icon.stories.tsx +++ b/packages/canon/src/components/Icon/Icon.stories.tsx @@ -17,8 +17,8 @@ import React from 'react'; import { Meta, StoryObj } from '@storybook/react'; import { Icon } from './Icon'; -import { ThemeProvider } from '../../theme/context'; -import { defaultIcons } from './icons'; +import { CanonProvider } from '../../contexts/canon'; +import { icons } from './icons'; const meta = { title: 'Components/Icon', @@ -29,7 +29,7 @@ const meta = { argTypes: { name: { control: 'select', - options: Object.keys(defaultIcons), + options: Object.keys(icons), }, }, args: { @@ -40,7 +40,7 @@ const meta = { export default meta; type Story = StoryObj; -export const Primary: Story = { +export const Default: Story = { args: { name: 'heart', }, @@ -52,9 +52,9 @@ export const WithCustomIcon: Story = { }, decorators: [ Story => ( -
Custom Icon
}}> +
Custom Icon
}}> -
+ ), ], }; diff --git a/packages/canon/src/components/Icon/Icon.tsx b/packages/canon/src/components/Icon/Icon.tsx index d7891c23cf..1df46c8a78 100644 --- a/packages/canon/src/components/Icon/Icon.tsx +++ b/packages/canon/src/components/Icon/Icon.tsx @@ -15,19 +15,20 @@ */ import React from 'react'; -import { useTheme } from '../../theme/context'; -import type { IconNames } from './types'; +import { useCanon } from '../../contexts/canon'; +import type { IconProps } from './types'; /** @public */ -export const Icon = ({ name }: { name: IconNames }) => { - const { icons } = useTheme(); +export const Icon = (props: IconProps) => { + const { name, size = 16 } = props; + const { icons } = useCanon(); - const RemixIcon = icons[name]; + const RemixIcon = icons[name] as React.ComponentType<{ className?: string }>; if (!RemixIcon) { - console.error(`Icon "${name}" not found.`); - return ; // Return default icon perhaps? + console.error(`Icon "${name}" not found or is not a valid component.`); + return ; // Return a default icon or handle the error appropriately } - return ; + return ; }; diff --git a/packages/canon/src/components/Icon/icons.ts b/packages/canon/src/components/Icon/icons.ts index 8c6a1248cb..40cbefb72d 100644 --- a/packages/canon/src/components/Icon/icons.ts +++ b/packages/canon/src/components/Icon/icons.ts @@ -26,16 +26,40 @@ import { RiArrowUpFill, RiDeleteBin6Line, RiAddLine, + RiArrowDownSLine, + RiArrowUpSLine, + RiArrowLeftSLine, + RiArrowRightSLine, + RiArrowDownCircleLine, + RiArrowLeftCircleLine, + RiArrowRightCircleLine, + RiArrowUpCircleLine, + RiCheckLine, + RiMoonLine, + RiSunLine, + RiExternalLinkLine, } from '@remixicon/react'; -// List of default icons -export const defaultIcons: IconMap = { +/** @public */ +export const icons: IconMap = { arrowDown: RiArrowDownFill, arrowLeft: RiArrowLeftFill, arrowRight: RiArrowRightFill, arrowUp: RiArrowUpFill, + arrowDownCircle: RiArrowDownCircleLine, + arrowLeftCircle: RiArrowLeftCircleLine, + arrowRightCircle: RiArrowRightCircleLine, + arrowUpCircle: RiArrowUpCircleLine, + check: RiCheckLine, + chevronDown: RiArrowDownSLine, + chevronUp: RiArrowUpSLine, + chevronLeft: RiArrowLeftSLine, + chevronRight: RiArrowRightSLine, cloud: RiCloudFill, + externalLink: RiExternalLinkLine, heart: RiHeartFill, + moon: RiMoonLine, plus: RiAddLine, + sun: RiSunLine, trash: RiDeleteBin6Line, }; diff --git a/packages/canon/src/components/Icon/index.tsx b/packages/canon/src/components/Icon/index.tsx index 3e7564c77e..0fa2eac35b 100644 --- a/packages/canon/src/components/Icon/index.tsx +++ b/packages/canon/src/components/Icon/index.tsx @@ -15,4 +15,5 @@ */ export * from './Icon'; +export * from './icons'; export type * from './types'; diff --git a/packages/canon/src/components/Box/box.css.ts b/packages/canon/src/components/Icon/styles.css similarity index 79% rename from packages/canon/src/components/Box/box.css.ts rename to packages/canon/src/components/Icon/styles.css index 92af783eec..234105ed4e 100644 --- a/packages/canon/src/components/Box/box.css.ts +++ b/packages/canon/src/components/Icon/styles.css @@ -14,9 +14,17 @@ * limitations under the License. */ -import { style } from '@vanilla-extract/css'; +.icon-12 { + width: 12px; + height: 12px; +} -export const base = style({ - fontFamily: 'var(--canon-font-sans)', - color: 'var(--canon-text-primary)', -}); +.icon-16 { + width: 16px; + height: 16px; +} + +.icon-24 { + width: 24px; + height: 24px; +} diff --git a/packages/canon/src/components/Icon/types.ts b/packages/canon/src/components/Icon/types.ts index 6e16e627d4..57eddc74ba 100644 --- a/packages/canon/src/components/Icon/types.ts +++ b/packages/canon/src/components/Icon/types.ts @@ -20,10 +20,28 @@ export type IconNames = | 'arrowLeft' | 'arrowRight' | 'arrowUp' + | 'arrowDownCircle' + | 'arrowLeftCircle' + | 'arrowRightCircle' + | 'arrowUpCircle' + | 'check' + | 'chevronDown' + | 'chevronLeft' + | 'chevronRight' + | 'chevronUp' | 'cloud' + | 'externalLink' | 'heart' + | 'moon' | 'plus' + | 'sun' | 'trash'; /** @public */ export type IconMap = Partial>; + +/** @public */ +export type IconProps = { + name: IconNames; + size?: number; +}; diff --git a/packages/canon/src/components/Inline/Docs.mdx b/packages/canon/src/components/Inline/Docs.mdx new file mode 100644 index 0000000000..7671122966 --- /dev/null +++ b/packages/canon/src/components/Inline/Docs.mdx @@ -0,0 +1,124 @@ +import { Meta, Unstyled, Source } from '@storybook/blocks'; +import * as InlineStories from './Inline.stories'; +import { Title, Text, PropsTable, getProps } from '../../../docs/components'; +import { spacePropsList } from '../../../docs/spaceProps'; + + + + + +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. + + +Usage + + Hello World + Hello World + Hello World + +`} language="tsx" dark /> + + + 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 index 613fd68c68..6aa6079989 100644 --- a/packages/canon/src/components/Inline/Inline.stories.tsx +++ b/packages/canon/src/components/Inline/Inline.stories.tsx @@ -18,14 +18,11 @@ 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'], @@ -44,11 +41,28 @@ const meta = { control: 'text', }, }, + args: { + children: 'hello world', + }, } satisfies Meta; export default meta; type Story = StoryObj; +const fakeBlockList = [ + { width: 45, height: 60 }, + { width: 150, height: 75 }, + { width: 80, height: 50 }, + { width: 120, height: 70 }, + { width: 95, height: 65 }, + { width: 80, height: 32 }, + { width: 130, height: 60 }, + { width: 100, height: 80 }, + { width: 140, height: 45 }, + { width: 85, height: 70 }, + { width: 125, height: 50 }, +]; + const FakeBox = ({ width = 120, height = 80, @@ -57,72 +71,67 @@ const FakeBox = ({ height?: number; }) => ( ); export const Default: Story = { - args: { - children: ( - <> - {Array.from({ length: 32 }).map((_, index) => ( - - ))} - - ), - }, + render: () => ( + + {fakeBlockList.map((block, 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 index 2d1c649e29..b3aaeaf082 100644 --- a/packages/canon/src/components/Inline/Inline.tsx +++ b/packages/canon/src/components/Inline/Inline.tsx @@ -14,50 +14,76 @@ * limitations under the License. */ -import { createElement } from 'react'; -import { inlineSprinkles } from './sprinkles.css'; +import { createElement, forwardRef } from 'react'; import type { InlineProps } from './types'; +import { getClassNames } from '../../utils/getClassNames'; +import { JustifyContent, Breakpoint, AlignItems } 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; +// Function to map align values +const mapAlignValue = (value?: InlineProps['align']) => { + if (typeof value === 'string') { + let returnedValue: JustifyContent = 'stretch'; + if (value === 'left') returnedValue = 'start'; + if (value === 'center') returnedValue = 'center'; + if (value === 'right') returnedValue = 'end'; + return returnedValue; + } else if (typeof value === 'object') { + const returnedValue: Partial> = {}; + for (const [key, val] of Object.entries(value)) { + returnedValue[key as Breakpoint] = mapAlignValue(val) as JustifyContent; + } + return returnedValue; + } + return 'stretch'; }; -const alignToFlexAlignY = (align: InlineProps['align']) => { - if (align === 'left') return 'flex-start'; - if (align === 'center') return 'center'; - if (align === 'right') return 'flex-end'; - return undefined; +const mapAlignYValue = (value?: InlineProps['alignY']) => { + if (typeof value === 'string') { + let returnedValue: AlignItems = 'stretch'; + if (value === 'top') returnedValue = 'start'; + if (value === 'center') returnedValue = 'center'; + if (value === 'bottom') returnedValue = 'end'; + return returnedValue; + } else if (typeof value === 'object') { + const returnedValue: Partial> = {}; + for (const [key, val] of Object.entries(value)) { + returnedValue[key as Breakpoint] = mapAlignYValue(val) as AlignItems; + } + return returnedValue; + } + return 'stretch'; }; -export const Inline = ({ - as = 'div', - children, - align = 'left', - alignY = 'top', - gap = 'xs', - className, - style, - ...restProps -}: InlineProps) => { - // Generate the list of class names - const sprinklesClassName = inlineSprinkles({ - ...restProps, +/** @public */ +export const Inline = forwardRef((props, ref) => { + const { + as = 'div', + children, + align = 'left', + alignY = 'top', + gap = 'xs', + className, + style, + ...restProps + } = props; + + // Generate utility class names + const utilityClassNames = getClassNames({ gap, - alignItems: alignYToFlexAlign(alignY), - justifyContent: alignToFlexAlignY(align), + alignItems: mapAlignYValue(alignY), + justifyContent: mapAlignValue(align), + ...restProps, }); // Combine the base class name, the sprinkles class name, and any additional class names - const classNames = ['inline', sprinklesClassName, className] + const classNames = ['canon-inline', utilityClassNames, 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 index 77a0e51629..2cc100c02a 100644 --- a/packages/canon/src/components/Inline/index.ts +++ b/packages/canon/src/components/Inline/index.ts @@ -14,3 +14,4 @@ * 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 deleted file mode 100644 index 1d7e95da00..0000000000 --- a/packages/canon/src/components/Inline/sprinkles.css.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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 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 index fb9b1c3825..bafd29bf53 100644 --- a/packages/canon/src/components/Inline/styles.css +++ b/packages/canon/src/components/Inline/styles.css @@ -1,4 +1,4 @@ -.inline { +.canon-inline { display: flex; flex-wrap: wrap; } diff --git a/packages/canon/src/components/Inline/types.ts b/packages/canon/src/components/Inline/types.ts index 413f2fbbb0..c86f500018 100644 --- a/packages/canon/src/components/Inline/types.ts +++ b/packages/canon/src/components/Inline/types.ts @@ -14,12 +14,18 @@ * limitations under the License. */ -import { AsProps, Breakpoint, ColorProps } from '../../layout/types'; -import { SpaceProps } from '../../layout/types'; +import type { + SpaceProps, + UtilityProps, + AsProps, + Breakpoint, +} from '../../types'; -export interface InlineProps extends SpaceProps, ColorProps { +/** @public */ +export interface InlineProps extends SpaceProps { children: React.ReactNode; as?: AsProps; + gap?: UtilityProps['gap']; align?: | 'left' | 'center' diff --git a/packages/canon/src/components/Stack/Docs.mdx b/packages/canon/src/components/Stack/Docs.mdx new file mode 100644 index 0000000000..921618f49f --- /dev/null +++ b/packages/canon/src/components/Stack/Docs.mdx @@ -0,0 +1,126 @@ +import { Meta, Unstyled, Source } from '@storybook/blocks'; +import * as StackStories from './Stack.stories'; +import { Title, Text, PropsTable, getProps } from '../../../docs/components'; +import { spacePropsList } from '../../../docs/spaceProps'; + + + + + +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. + + +Usage + + Hello World + Hello World + Hello World + +`} language="tsx" dark /> + + + 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 index 601f6b847f..4c48cf80cc 100644 --- a/packages/canon/src/components/Stack/Stack.stories.tsx +++ b/packages/canon/src/components/Stack/Stack.stories.tsx @@ -17,15 +17,11 @@ 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'], @@ -43,81 +39,97 @@ const meta = { args: { align: 'left', gap: 'xs', + children: 'hello world', }, } satisfies Meta; export default meta; type Story = StoryObj; -const FakeBox = () => ( - - Fake Box - -); +const DecorativeBox = () => { + return ( +
+ ); +}; export const Default: Story = { - args: { - children: ( - <> - - - - - ), - }, + render: () => ( +
+ + + + + +
+ ), }; export const AlignLeft: Story = { - args: { - ...Default.args, - align: 'left', - }, + render: () => ( + + + + + + ), }; export const AlignCenter: Story = { - args: { - ...Default.args, - align: 'center', - }, + render: () => ( + + + + + + ), }; export const AlignRight: Story = { - args: { - ...Default.args, - align: 'right', - }, + render: () => ( + + + + + + ), }; export const ResponsiveAlign: Story = { - args: { - ...Default.args, - align: { - xs: 'left', - md: 'center', - lg: 'right', - }, - }, + render: () => ( + + + + + + ), }; export const ResponsiveGap: Story = { - args: { - ...Default.args, - gap: { - xs: 'xs', - md: 'md', - lg: 'xxl', - }, - }, + render: () => ( + + + + + + ), }; export const LargeGap: Story = { - args: { - ...Default.args, - gap: 'xl', - }, + render: () => ( + + + + + + ), }; diff --git a/packages/canon/src/components/Stack/Stack.tsx b/packages/canon/src/components/Stack/Stack.tsx index f2316805b5..522782daac 100644 --- a/packages/canon/src/components/Stack/Stack.tsx +++ b/packages/canon/src/components/Stack/Stack.tsx @@ -14,44 +14,57 @@ * limitations under the License. */ -import { createElement } from 'react'; +import { createElement, forwardRef } from 'react'; import { StackProps } from './types'; -import { stackSprinkles } from './sprinkles.css'; +import { getClassNames } from '../../utils/getClassNames'; +import type { AlignItems, Breakpoint } from '../../types'; -const alignToFlexAlign = (align: StackProps['align']) => { - if (align === 'left') return 'stretch'; - if (align === 'center') return 'center'; - if (align === 'right') return 'flex-end'; - return undefined; +// Function to map align values +const mapAlignValue = (value?: StackProps['align']) => { + if (typeof value === 'string') { + let returnedValue: AlignItems = 'stretch'; + if (value === 'left') returnedValue = 'stretch'; + if (value === 'center') returnedValue = 'center'; + if (value === 'right') returnedValue = 'end'; + return returnedValue; + } else if (typeof value === 'object') { + const returnedValue: Partial> = {}; + for (const [key, val] of Object.entries(value)) { + returnedValue[key as Breakpoint] = mapAlignValue(val) as AlignItems; + } + return returnedValue; + } + return 'stretch'; }; -export const Stack = ({ - as = 'div', - children, - align = 'left', - gap = 'xs', - className, - style, - ...restProps -}: StackProps) => { - // Transform the align prop - const flexAlign = alignToFlexAlign(align); +/** @public */ +export const Stack = forwardRef((props, ref) => { + const { + as = 'div', + children, + align = 'left', + gap = 'xs', + className, + style, + ...restProps + } = props; - // Generate the list of class names - const sprinklesClassName = stackSprinkles({ - ...restProps, + // Generate utility class names + const utilityClassNames = getClassNames({ gap, - alignItems: flexAlign, + alignItems: mapAlignValue(align), + ...restProps, }); // Combine the base class name, the sprinkles class name, and any additional class names - const classNames = ['stack', sprinklesClassName, className] + const classNames = ['canon-stack', utilityClassNames, 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 index 2aeaba3adf..7abbc3f439 100644 --- a/packages/canon/src/components/Stack/index.ts +++ b/packages/canon/src/components/Stack/index.ts @@ -14,3 +14,4 @@ * 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 deleted file mode 100644 index 85c8f83a71..0000000000 --- a/packages/canon/src/components/Stack/sprinkles.css.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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 index 784fd3b1ab..fa5c3f7e5d 100644 --- a/packages/canon/src/components/Stack/styles.css +++ b/packages/canon/src/components/Stack/styles.css @@ -1,4 +1,4 @@ -.stack { +.canon-stack { display: flex; flex-direction: column; } diff --git a/packages/canon/src/components/Stack/types.ts b/packages/canon/src/components/Stack/types.ts index 81abea9999..bccdc59a57 100644 --- a/packages/canon/src/components/Stack/types.ts +++ b/packages/canon/src/components/Stack/types.ts @@ -13,12 +13,19 @@ * 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'; -export interface StackProps extends SpaceProps, ColorProps { +import type { + SpaceProps, + UtilityProps, + AsProps, + Breakpoint, +} from '../../types'; + +/** @public */ +export interface StackProps extends SpaceProps { children: React.ReactNode; as?: AsProps; + gap?: UtilityProps['gap']; align?: | 'left' | 'center' diff --git a/packages/canon/src/components/Table/Docs.mdx b/packages/canon/src/components/Table/Docs.mdx new file mode 100644 index 0000000000..6a6e9c8a59 --- /dev/null +++ b/packages/canon/src/components/Table/Docs.mdx @@ -0,0 +1,5 @@ +import { Meta, Controls } from '@storybook/blocks'; + + + +# Table diff --git a/packages/canon/src/components/Table/Table.stories.tsx b/packages/canon/src/components/Table/Table.stories.tsx new file mode 100644 index 0000000000..c4c08be527 --- /dev/null +++ b/packages/canon/src/components/Table/Table.stories.tsx @@ -0,0 +1,119 @@ +/* + * 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. + */ + +const invoices = [ + { + invoice: 'INV001', + paymentStatus: 'Paid', + totalAmount: '$250.00', + paymentMethod: 'Credit Card', + }, + { + invoice: 'INV002', + paymentStatus: 'Pending', + totalAmount: '$150.00', + paymentMethod: 'PayPal', + }, + { + invoice: 'INV003', + paymentStatus: 'Unpaid', + totalAmount: '$350.00', + paymentMethod: 'Bank Transfer', + }, + { + invoice: 'INV004', + paymentStatus: 'Paid', + totalAmount: '$450.00', + paymentMethod: 'Credit Card', + }, + { + invoice: 'INV005', + paymentStatus: 'Paid', + totalAmount: '$550.00', + paymentMethod: 'PayPal', + }, + { + invoice: 'INV006', + paymentStatus: 'Pending', + totalAmount: '$200.00', + paymentMethod: 'Bank Transfer', + }, + { + invoice: 'INV007', + paymentStatus: 'Unpaid', + totalAmount: '$300.00', + paymentMethod: 'Credit Card', + }, +]; + +import React from 'react'; +import type { Meta, StoryObj } from '@storybook/react'; +import { + Table, + TableBody, + TableCell, + TableFooter, + TableHead, + TableHeader, + TableRow, +} from '../Table'; + +const meta = { + title: 'Components/Table', + component: Table, + subcomponents: { + TableBody: TableBody as React.ComponentType, + TableCell: TableCell as React.ComponentType, + TableFooter: TableFooter as React.ComponentType, + TableHead: TableHead as React.ComponentType, + TableHeader: TableHeader as React.ComponentType, + TableRow: TableRow as React.ComponentType, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => ( + + + + Invoice + Status + Method + Amount + + + + {invoices.map(invoice => ( + + {invoice.invoice} + {invoice.paymentStatus} + {invoice.paymentMethod} + {invoice.totalAmount} + + ))} + + + + Total + $2,500.00 + + +
+ ), +}; diff --git a/packages/canon/src/components/Table/Table.tsx b/packages/canon/src/components/Table/Table.tsx new file mode 100644 index 0000000000..efd5181036 --- /dev/null +++ b/packages/canon/src/components/Table/Table.tsx @@ -0,0 +1,115 @@ +/* + * 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 * as React from 'react'; + +/** @public */ +const Table = React.forwardRef< + HTMLTableElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+ + +)); +Table.displayName = 'Table'; + +/** @public */ +const TableHeader = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableHeader.displayName = 'TableHeader'; + +/** @public */ +const TableBody = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableBody.displayName = 'TableBody'; + +/** @public */ +const TableFooter = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableFooter.displayName = 'TableFooter'; + +/** @public */ +const TableRow = React.forwardRef< + HTMLTableRowElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + + {props.children} + +)); +TableRow.displayName = 'TableRow'; + +/** @public */ +const TableHead = React.forwardRef< + HTMLTableCellElement, + React.ThHTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +TableHead.displayName = 'TableHead'; + +/** @public */ +const TableCell = React.forwardRef< + HTMLTableCellElement, + React.TdHTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableCell.displayName = 'TableCell'; + +/** @public */ +const TableCaption = React.forwardRef< + HTMLTableCaptionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +TableCaption.displayName = 'TableCaption'; + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +}; diff --git a/packages/canon/src/components/Table/index.ts b/packages/canon/src/components/Table/index.ts new file mode 100644 index 0000000000..cf88de2b1a --- /dev/null +++ b/packages/canon/src/components/Table/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 { + Table, + TableHead, + TableRow, + TableHeader, + TableCell, + TableBody, + TableFooter, +} from './Table'; diff --git a/packages/canon/src/components/Table/styles.css b/packages/canon/src/components/Table/styles.css new file mode 100644 index 0000000000..574fae67bf --- /dev/null +++ b/packages/canon/src/components/Table/styles.css @@ -0,0 +1,65 @@ +.table { + position: relative; + overflow: auto; + width: 100%; + background-color: var(--canon-surface-1); + border-radius: var(--canon-border-radius-xs); + padding-bottom: var(--canon-spacing-5xs); + padding-top: var(--canon-spacing-5xs); + font-size: var(--canon-font-size-body); + + table { + width: 100%; + caption-side: bottom; + font-size: var(--canon-font-size-sm); + border-collapse: collapse; + } +} + +.table-header { + tr { + /* border-bottom: 1px solid var(--canon-border); */ + } +} + +.table-head { + text-align: left; + padding: var(--canon-spacing-xs); +} + +.table-body { + tr:last-child { + border-bottom: none; + } +} + +.table-row { + transition: color 0.2s ease-in-out; + + &:hover td { + background-color: var(--canon-surface-3); + } + + & .table-cell:first-child { + border-top-left-radius: var(--canon-border-radius-xs); + border-bottom-left-radius: var(--canon-border-radius-xs); + box-shadow: inset 4px 2px 0 0 var(--canon-surface-1), + inset 4px -2px 0 0 var(--canon-surface-1); + padding-left: var(--canon-spacing-xs); + } + + & .table-cell:last-child { + border-top-right-radius: var(--canon-border-radius-xs); + border-bottom-right-radius: var(--canon-border-radius-xs); + box-shadow: inset -4px 2px 0 0 var(--canon-surface-1), + inset -4px -2px 0 0 var(--canon-surface-1); + padding-right: var(--canon-spacing-xs); + } +} + +.table-cell { + padding: var(--canon-spacing-xs); + background-color: var(--canon-surface-2); + box-shadow: inset 0px 2px 0 0 var(--canon-surface-1), + inset 0px -2px 0 0 var(--canon-surface-1); +} diff --git a/packages/canon/src/components/Text/Docs.mdx b/packages/canon/src/components/Text/Docs.mdx new file mode 100644 index 0000000000..685a00a33f --- /dev/null +++ b/packages/canon/src/components/Text/Docs.mdx @@ -0,0 +1,101 @@ +import { Canvas, Meta, Unstyled, Source } from '@storybook/blocks'; +import * as TextStories from './Text.stories'; +import { Title, Text } from '../../../docs/components'; +import { PropsTable } from '../../../docs/components/PropsTable/PropsTable'; + + + + + +Text + +The `Text` component is used to display content on your page. + + + +Usage +Hello World!`} language="tsx" dark /> + + + API reference + + + + +Examples +Here are some examples of how you can use the Text component. + +All variants + + The `Text` component has a `variant` prop that can be used to change the + appearance of the text. + + + + + + Subtitle Lorem ipsum dolor sit amet consectetur... + Body Lorem ipsum dolor sit amet consectetur... + Caption Lorem ipsum dolor sit amet consectetur... + Label Lorem ipsum dolor sit amet consectetur... +`} + language="tsx" + dark +/> + +All weights + + The `Text` component has a `weight` prop that can be used to change the + appearance of the text. + + + + + + Regular Lorem ipsum dolor sit amet consectetur... + Bold Lorem ipsum dolor sit amet consectetur... +`} + language="tsx" + dark +/> + +Responsive + + You can also use the `variant` prop to change the appearance of the text based + on the screen size. + + +Responsive Lorem ipsum dolor sit amet consectetur...`} + language="tsx" + dark +/> + + diff --git a/packages/canon/src/components/Text/Text.stories.tsx b/packages/canon/src/components/Text/Text.stories.tsx new file mode 100644 index 0000000000..b0776beee9 --- /dev/null +++ b/packages/canon/src/components/Text/Text.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 { Text } from './Text'; +import { Stack } from '../Stack'; + +const meta = { + title: 'Components/Text', + component: Text, + args: { + children: 'Text', + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + children: + "A man looks at a painting in a museum and says, “Brothers and sisters I have none, but that man's father is my father's son.” Who is in the painting?", + style: { maxWidth: '600px' }, + }, +}; + +export const AllVariants: Story = { + render: () => ( + + + A man looks at a painting in a museum and says, “Brothers and sisters I + have none, but that man's father is my father's son.” Who is + in the painting? + + + A man looks at a painting in a museum and says, “Brothers and sisters I + have none, but that man's father is my father's son.” Who is + in the painting? + + + A man looks at a painting in a museum and says, “Brothers and sisters I + have none, but that man's father is my father's son.” Who is + in the painting? + + + A man looks at a painting in a museum and says, “Brothers and sisters I + have none, but that man's father is my father's son.” Who is + in the painting? + + + ), +}; + +export const AllWeights: Story = { + render: () => ( + + + A man looks at a painting in a museum and says, “Brothers and sisters I + have none, but that man's father is my father's son.” Who is + in the painting? + + + A man looks at a painting in a museum and says, “Brothers and sisters I + have none, but that man's father is my father's son.” Who is + in the painting? + + + ), +}; + +export const Responsive: Story = { + args: { + variant: { + xs: 'label', + md: 'body', + }, + }, +}; + +export const Playground: Story = { + render: () => ( + + Subtitle + + A man looks at a painting in a museum and says, “Brothers and sisters I + have none, but that man's father is my father's son.” Who is + in the painting? + + Body + + A man looks at a painting in a museum and says, “Brothers and sisters I + have none, but that man's father is my father's son.” Who is + in the painting? + + Caption + + A man looks at a painting in a museum and says, “Brothers and sisters I + have none, but that man's father is my father's son.” Who is + in the painting? + + Label + + A man looks at a painting in a museum and says, “Brothers and sisters I + have none, but that man's father is my father's son.” Who is + in the painting? + + + ), +}; diff --git a/packages/canon/src/components/Text/Text.tsx b/packages/canon/src/components/Text/Text.tsx new file mode 100644 index 0000000000..1359a0e4c5 --- /dev/null +++ b/packages/canon/src/components/Text/Text.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, { forwardRef } from 'react'; +import { TextProps } from './types'; +import { useCanon } from '../../contexts/canon'; + +/** @public */ +export const Text = forwardRef( + (props, ref) => { + const { + children, + variant = 'body', + weight = 'regular', + style, + ...restProps + } = props; + + const { getResponsiveValue } = useCanon(); + + // Get the responsive values for the variant and weight + const responsiveVariant = getResponsiveValue(variant); + const responsiveWeight = getResponsiveValue(weight); + + return ( +

+ {children} +

+ ); + }, +); + +Text.displayName = 'Text'; diff --git a/packages/canon/src/components/Text/index.ts b/packages/canon/src/components/Text/index.ts new file mode 100644 index 0000000000..ae1f532b2c --- /dev/null +++ b/packages/canon/src/components/Text/index.ts @@ -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 { Text } from './Text'; +export type { TextProps } from './types'; diff --git a/packages/canon/src/components/Text/styles.css b/packages/canon/src/components/Text/styles.css new file mode 100644 index 0000000000..9bf22ccab5 --- /dev/null +++ b/packages/canon/src/components/Text/styles.css @@ -0,0 +1,50 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.text { + font-family: var(--canon-font-regular); + color: var(--canon-text-primary); + padding: 0; + margin: 0; + + &.text-body { + font-size: var(--canon-font-size-body); + line-height: 140%; + } + + &.text-subtitle { + font-size: var(--canon-font-size-subtitle); + line-height: 140%; + } + + &.text-caption { + font-size: var(--canon-font-size-caption); + line-height: 140%; + } + + &.text-label { + font-size: var(--canon-font-size-label); + line-height: 140%; + } + + &.text-regular { + font-weight: var(--canon-font-weight-regular); + } + + &.text-bold { + font-weight: var(--canon-font-weight-bold); + } +} diff --git a/packages/canon/src/components/Text/types.ts b/packages/canon/src/components/Text/types.ts new file mode 100644 index 0000000000..7e11bed6e3 --- /dev/null +++ b/packages/canon/src/components/Text/types.ts @@ -0,0 +1,31 @@ +/* + * 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 type { CSSProperties, ReactNode } from 'react'; +import type { Breakpoint } from '../../types'; + +/** @public */ +export interface TextProps { + children: ReactNode; + variant?: + | 'subtitle' + | 'body' + | 'caption' + | 'label' + | Partial>; + weight?: 'regular' | 'bold' | Partial>; + style?: CSSProperties; +} diff --git a/packages/canon/src/contexts/canon.tsx b/packages/canon/src/contexts/canon.tsx new file mode 100644 index 0000000000..5a0e6b4315 --- /dev/null +++ b/packages/canon/src/contexts/canon.tsx @@ -0,0 +1,101 @@ +/* + * 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 { icons } from '../components/Icon/icons'; +import { useMediaQuery } from '../hooks/useMediaQuery'; +import type { Breakpoint } from '../types'; + +/** @public */ +export interface CanonContextProps { + icons: IconMap; + breakpoint: Breakpoint; + getResponsiveValue: ( + value: string | Partial>, + ) => string; +} + +const CanonContext = createContext({ + icons, + breakpoint: 'md', + getResponsiveValue: () => '', +}); + +/** @public */ +export interface CanonProviderProps { + children?: ReactNode; + overrides?: Partial>; +} + +/** @public */ +export const CanonProvider = (props: CanonProviderProps) => { + const { children, overrides } = props; + + // Merge provided overrides with default icons + const combinedIcons = { ...icons, ...overrides }; + + const isBreakpointSm = useMediaQuery(`(min-width: 640px)`); + const isBreakpointMd = useMediaQuery(`(min-width: 768px)`); + const isBreakpointLg = useMediaQuery(`(min-width: 1024px)`); + const isBreakpointXl = useMediaQuery(`(min-width: 1280px)`); + const isBreakpoint2xl = useMediaQuery(`(min-width: 1536px)`); + + // Determine the current breakpoint + const breakpoint = (() => { + if (isBreakpoint2xl) return '2xl'; + if (isBreakpointXl) return 'xl'; + if (isBreakpointLg) return 'lg'; + if (isBreakpointMd) return 'md'; + if (isBreakpointSm) return 'sm'; + return 'xs'; + })(); + + const getResponsiveValue = ( + value: string | Partial>, + ) => { + if (typeof value === 'object') { + const breakpointsOrder: Breakpoint[] = [ + 'xs', + 'sm', + 'md', + 'lg', + 'xl', + '2xl', + ]; + const index = breakpointsOrder.indexOf(breakpoint); + + for (let i = index; i >= 0; i--) { + if (value[breakpointsOrder[i]]) { + return value[breakpointsOrder[i]] as string; + } + } + return value['xs'] as string; + } + return value; + }; + + return ( + + {children} + + ); +}; + +/** @public */ +export const useCanon = () => useContext(CanonContext); diff --git a/packages/canon/docs/components/Columns/columns.css.ts b/packages/canon/src/css/base.css similarity index 77% rename from packages/canon/docs/components/Columns/columns.css.ts rename to packages/canon/src/css/base.css index 0b5ec18aef..b8bd0c4f81 100644 --- a/packages/canon/docs/components/Columns/columns.css.ts +++ b/packages/canon/src/css/base.css @@ -14,11 +14,13 @@ * limitations under the License. */ -import { style } from '@vanilla-extract/css'; +@import './normalize.css'; -export const styles = style({ - display: 'grid', - gridTemplateColumns: 'repeat(3, 1fr)', - rowGap: '20px', - columnGap: '80px', -}); +@layer base { + *, + html, + body { + font-family: var(--canon-font-regular); + font-weight: var(--canon-font-weight-regular); + } +} diff --git a/packages/canon/src/theme/styles.css b/packages/canon/src/css/components.css similarity index 71% rename from packages/canon/src/theme/styles.css rename to packages/canon/src/css/components.css index 4a31340575..ed602b7ab7 100644 --- a/packages/canon/src/theme/styles.css +++ b/packages/canon/src/css/components.css @@ -14,14 +14,14 @@ * 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'; +@import '../components/Icon/styles.css'; +@import '../components/Checkbox/styles.css'; +@import '../components/Table/styles.css'; +@import '../components/Text/styles.css'; +@import '../components/Heading/styles.css'; diff --git a/packages/canon/src/css/core.css b/packages/canon/src/css/core.css new file mode 100644 index 0000000000..4f15d571c7 --- /dev/null +++ b/packages/canon/src/css/core.css @@ -0,0 +1,166 @@ +/* + * 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. + */ + +/* Normalize */ +@import './base.css'; +@import './utilities.css'; + +/* Light theme tokens */ + +[data-theme='light'] { + /* Font families */ + --canon-font-regular: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; + --canon-font-monospace: ui-monospace, 'Menlo', 'Monaco', 'Consolas', + 'Liberation Mono', 'Courier New', monospace; + + /* Font weights */ + --canon-font-weight-regular: 400; + --canon-font-weight-bold: 600; + + /* Font sizes */ + --canon-font-size-label: 0.625rem; /* 10px */ + --canon-font-size-caption: 0.75rem; /* 12px */ + --canon-font-size-body: 0.875rem; /* 14px */ + --canon-font-size-subtitle: 1rem; /* 16px */ + --canon-font-size-title5: 1.25rem; /* 20px */ + --canon-font-size-title4: 1.5rem; /* 24px */ + --canon-font-size-title3: 2rem; /* 32px */ + --canon-font-size-title2: 3rem; /* 48px */ + --canon-font-size-title1: 4rem; /* 64px */ + --canon-font-size-display: 5.75rem; /* 92px */ + + /* Spacing */ + --canon-spacing-5xs: 0.125rem; /* 2px */ + --canon-spacing-4xs: 0.25rem; /* 4px */ + --canon-spacing-3xs: 0.375rem; /* 6px */ + --canon-spacing-2xs: 0.5rem; /* 8px */ + --canon-spacing-xs: 0.75rem; /* 12px */ + --canon-spacing-sm: 1rem; /* 16px */ + --canon-spacing-md: 1.5rem; /* 24px */ + --canon-spacing-lg: 2rem; /* 32px */ + --canon-spacing-xl: 2.5rem; /* 40px */ + --canon-spacing-2xl: 3rem; /* 48px */ + --canon-spacing-3xl: 3.5rem; /* 56px */ + + /* Border radius */ + --canon-border-radius-2xs: 0.125rem; /* 2px */ + --canon-border-radius-xs: 0.25rem; /* 4px */ + --canon-border-radius-sm: 0.5rem; /* 8px */ + --canon-border-radius-md: 0.75rem; /* 12px */ + --canon-border-radius-lg: 1rem; /* 16px */ + --canon-border-radius-xl: 1.25rem; /* 20px */ + --canon-border-radius-2xl: 1.5rem; /* 24px */ + + /* Container */ + --canon-container-max-width: 1200px; + --canon-container-padding: 1rem; + + /* Colors */ + --canon-accent: #000; + --canon-background: #f8f8f8; + --canon-surface-1: #fff; + --canon-surface-2: #f4f4f4; + --canon-surface-3: #f1f1f1; + + /* Borders */ + --canon-border-base: rgba(0, 0, 0, 0.1); + --canon-border-hover: rgba(0, 0, 0, 0.2); + --canon-border-warning: #e36d05; + --canon-border-error: #e22b2b; + --canon-border-selected: #1db954; + + /* States - Add more states */ + --canon-error: #f50000; + + /* Text colors */ + --canon-text-primary: #000; + --canon-text-primary-on-accent: #fff; + --canon-text-secondary: #646464; +} + +/* Dark theme tokens */ +[data-theme='dark'] { + /* Font families */ + --canon-font-regular: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; + --canon-font-monospace: ui-monospace, 'Menlo', 'Monaco', 'Consolas', + 'Liberation Mono', 'Courier New', monospace; + + /* Font weights */ + --canon-font-weight-regular: 400; + --canon-font-weight-bold: 600; + + /* Font sizes */ + --canon-font-size-label: 0.625rem; /* 10px */ + --canon-font-size-caption: 0.75rem; /* 12px */ + --canon-font-size-body: 0.875rem; /* 14px */ + --canon-font-size-subtitle: 1rem; /* 16px */ + --canon-font-size-title5: 1.25rem; /* 20px */ + --canon-font-size-title4: 1.5rem; /* 24px */ + --canon-font-size-title3: 2rem; /* 32px */ + --canon-font-size-title2: 3rem; /* 48px */ + --canon-font-size-title1: 4rem; /* 64px */ + --canon-font-size-display: 5.75rem; /* 92px */ + + /* Spacing */ + --canon-spacing-5xs: 0.125rem; /* 2px */ + --canon-spacing-4xs: 0.25rem; /* 4px */ + --canon-spacing-3xs: 0.375rem; /* 6px */ + --canon-spacing-2xs: 0.5rem; /* 8px */ + --canon-spacing-xs: 0.75rem; /* 12px */ + --canon-spacing-sm: 1rem; /* 16px */ + --canon-spacing-md: 1.5rem; /* 24px */ + --canon-spacing-lg: 2rem; /* 32px */ + --canon-spacing-xl: 2.5rem; /* 40px */ + --canon-spacing-2xl: 3rem; /* 48px */ + --canon-spacing-3xl: 3.5rem; /* 56px */ + + /* Border radius */ + --canon-border-radius-2xs: 0.125rem; /* 2px */ + --canon-border-radius-xs: 0.25rem; /* 4px */ + --canon-border-radius-sm: 0.5rem; /* 8px */ + --canon-border-radius-md: 0.75rem; /* 12px */ + --canon-border-radius-lg: 1rem; /* 16px */ + --canon-border-radius-xl: 1.25rem; /* 20px */ + --canon-border-radius-2xl: 1.5rem; /* 24px */ + + /* Container */ + --canon-container-max-width: 1200px; + --canon-container-padding: 1rem; + + /* Colors */ + --canon-accent: #fff; + --canon-background: #000; + --canon-surface-1: #121212; + --canon-surface-2: #1a1a1a; + + /* Borders */ + --canon-border-base: rgba(255, 255, 255, 0.2); + --canon-border-warning: #f50000; + --canon-border-error: #f87503; + --canon-border-selected: #25d262; + + /* 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/src/css/normalize.css b/packages/canon/src/css/normalize.css new file mode 100644 index 0000000000..ca637e9d3f --- /dev/null +++ b/packages/canon/src/css/normalize.css @@ -0,0 +1,203 @@ +/*! modern-normalize v3.0.1 | MIT License | https://github.com/sindresorhus/modern-normalize */ + +/* +Document +======== +*/ + +/** +Use a better box model (opinionated). +*/ + +@layer base { + *, + ::before, + ::after { + box-sizing: border-box; + } + + html { + /* Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) */ + font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji'; + line-height: 1.15; /* 1. Correct the line height in all browsers. */ + -webkit-text-size-adjust: 100%; /* 2. Prevent adjustments of font size after orientation changes in iOS. */ + tab-size: 4; /* 3. Use a more readable tab size (opinionated). */ + } + + /* +Sections +======== +*/ + + body { + margin: 0; /* Remove the margin in all browsers. */ + } + + /* +Text-level semantics +==================== +*/ + + /** +Add the correct font weight in Chrome and Safari. +*/ + + b, + strong { + font-weight: bolder; + } + + /** +1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) +2. Correct the odd 'em' font sizing in all browsers. +*/ + + code, + kbd, + samp, + pre { + font-family: ui-monospace, SFMono-Regular, Consolas, 'Liberation Mono', + Menlo, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** +Add the correct font size in all browsers. +*/ + + small { + font-size: 80%; + } + + /** +Prevent 'sub' and 'sup' elements from affecting the line height in all browsers. +*/ + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + + /* +Tabular data +============ +*/ + + /** +Correct table border color inheritance in Chrome and Safari. (https://issues.chromium.org/issues/40615503, https://bugs.webkit.org/show_bug.cgi?id=195016) +*/ + + table { + border-color: currentcolor; + } + + /* +Forms +===== +*/ + + /** +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +*/ + + button, + input, + optgroup, + select, + textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ + } + + /** +Correct the inability to style clickable types in iOS and Safari. +*/ + + button, + [type='button'], + [type='reset'], + [type='submit'] { + -webkit-appearance: button; + } + + /** +Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers. +*/ + + legend { + padding: 0; + } + + /** +Add the correct vertical alignment in Chrome and Firefox. +*/ + + progress { + vertical-align: baseline; + } + + /** +Correct the cursor style of increment and decrement buttons in Safari. +*/ + + ::-webkit-inner-spin-button, + ::-webkit-outer-spin-button { + height: auto; + } + + /** +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + + [type='search'] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + } + + /** +Remove the inner padding in Chrome and Safari on macOS. +*/ + + ::-webkit-search-decoration { + -webkit-appearance: none; + } + + /** +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to 'inherit' in Safari. +*/ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /* +Interactive +=========== +*/ + + /* +Add the correct display in Chrome and Safari. +*/ + + summary { + display: list-item; + } +} diff --git a/packages/canon/src/css/utilities.css b/packages/canon/src/css/utilities.css new file mode 100644 index 0000000000..ad4a8d03b4 --- /dev/null +++ b/packages/canon/src/css/utilities.css @@ -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. + */ + +/* Default utilities */ +@import './utilities/xs.css'; + +/* Min 640px */ +@import './utilities/sm.css'; + +/* Min 768px */ +@import './utilities/md.css'; + +/* Min 1024px */ +@import './utilities/lg.css'; + +/* Min 1280px */ +@import './utilities/xl.css'; + +/* Min 1536px */ +@import './utilities/2xl.css'; diff --git a/packages/canon/src/css/utilities/2xl.css b/packages/canon/src/css/utilities/2xl.css new file mode 100644 index 0000000000..4ea3d82db0 --- /dev/null +++ b/packages/canon/src/css/utilities/2xl.css @@ -0,0 +1,944 @@ +/* + * 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. + */ + +@layer utilities { + @media (min-width: 1536px) { + .cu-2xl-block { + display: block; + } + + .cu-2xl-border-base { + border-color: var(--canon-border-base); + border-width: 1px; + border-style: solid; + } + + .cu-2xl-border-error { + border-color: var(--canon-border-error); + border-width: 1px; + border-style: solid; + } + + .cu-2xl-border-none { + border-color: transparent; + border-width: 0; + } + + .cu-2xl-border-selected { + border-color: var(--canon-border-selected); + border-width: 1px; + border-style: solid; + } + + .cu-2xl-border-warning { + border-color: var(--canon-border-warning); + border-width: 1px; + border-style: solid; + } + + .cu-2xl-col-end-1 { + grid-column-end: 1; + } + + .cu-2xl-col-end-10 { + grid-column-end: 10; + } + + .cu-2xl-col-end-11 { + grid-column-end: 11; + } + + .cu-2xl-col-end-12 { + grid-column-end: 12; + } + + .cu-2xl-col-end-13 { + grid-column-end: 13; + } + + .cu-2xl-col-end-2 { + grid-column-end: 2; + } + + .cu-2xl-col-end-3 { + grid-column-end: 3; + } + + .cu-2xl-col-end-4 { + grid-column-end: 4; + } + + .cu-2xl-col-end-5 { + grid-column-end: 5; + } + + .cu-2xl-col-end-6 { + grid-column-end: 6; + } + + .cu-2xl-col-end-7 { + grid-column-end: 7; + } + + .cu-2xl-col-end-8 { + grid-column-end: 8; + } + + .cu-2xl-col-end-9 { + grid-column-end: 9; + } + + .cu-2xl-col-end-auto { + grid-column-end: auto; + } + + .cu-2xl-col-span-1 { + grid-column: span 1 / span 1; + } + + .cu-2xl-col-span-10 { + grid-column: span 10 / span 10; + } + + .cu-2xl-col-span-11 { + grid-column: span 11 / span 11; + } + + .cu-2xl-col-span-12 { + grid-column: span 12 / span 12; + } + + .cu-2xl-col-span-2 { + grid-column: span 2 / span 2; + } + + .cu-2xl-col-span-3 { + grid-column: span 3 / span 3; + } + + .cu-2xl-col-span-4 { + grid-column: span 4 / span 4; + } + + .cu-2xl-col-span-5 { + grid-column: span 5 / span 5; + } + + .cu-2xl-col-span-6 { + grid-column: span 6 / span 6; + } + + .cu-2xl-col-span-7 { + grid-column: span 7 / span 7; + } + + .cu-2xl-col-span-8 { + grid-column: span 8 / span 8; + } + + .cu-2xl-col-span-9 { + grid-column: span 9 / span 9; + } + + .cu-2xl-col-span-auto { + grid-column: span auto / span auto; + } + + .cu-2xl-col-start-1 { + grid-column-start: 1; + } + + .cu-2xl-col-start-10 { + grid-column-start: 10; + } + + .cu-2xl-col-start-11 { + grid-column-start: 11; + } + + .cu-2xl-col-start-12 { + grid-column-start: 12; + } + + .cu-2xl-col-start-13 { + grid-column-start: 13; + } + + .cu-2xl-col-start-2 { + grid-column-start: 2; + } + + .cu-2xl-col-start-3 { + grid-column-start: 3; + } + + .cu-2xl-col-start-4 { + grid-column-start: 4; + } + + .cu-2xl-col-start-5 { + grid-column-start: 5; + } + + .cu-2xl-col-start-6 { + grid-column-start: 6; + } + + .cu-2xl-col-start-7 { + grid-column-start: 7; + } + + .cu-2xl-col-start-8 { + grid-column-start: 8; + } + + .cu-2xl-col-start-9 { + grid-column-start: 9; + } + + .cu-2xl-col-start-auto { + grid-column-start: auto; + } + + .cu-2xl-flex { + display: flex; + } + + .cu-2xl-flex-col { + flex-direction: column; + } + + .cu-2xl-flex-nowrap { + flex-wrap: nowrap; + } + + .cu-2xl-flex-row { + flex-direction: row; + } + + .cu-2xl-flex-wrap { + flex-wrap: wrap; + } + + .cu-2xl-flex-wrap-reverse { + flex-wrap: wrap-reverse; + } + + .cu-2xl-gap-2xl { + gap: var(--canon-spacing-2xl); + } + + .cu-2xl-gap-lg { + gap: var(--canon-spacing-lg); + } + + .cu-2xl-gap-md { + gap: var(--canon-spacing-md); + } + + .cu-2xl-gap-none { + gap: 0; + } + + .cu-2xl-gap-sm { + gap: var(--canon-spacing-sm); + } + + .cu-2xl-gap-xl { + gap: var(--canon-spacing-xl); + } + + .cu-2xl-gap-xs { + gap: var(--canon-spacing-xs); + } + + .cu-2xl-grid { + display: grid; + } + + .cu-2xl-grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-10 { + grid-template-columns: repeat(10, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-11 { + grid-template-columns: repeat(11, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-12 { + grid-template-columns: repeat(12, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-6 { + grid-template-columns: repeat(6, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-7 { + grid-template-columns: repeat(7, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-8 { + grid-template-columns: repeat(8, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-9 { + grid-template-columns: repeat(9, minmax(0, 1fr)); + } + + .cu-2xl-grid-cols-auto { + grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); + } + + .cu-2xl-hidden { + display: none; + } + + .cu-2xl-inline { + display: inline; + } + + .cu-2xl-inline-block { + display: inline-block; + } + + .cu-2xl-items-center { + align-items: center; + } + + .cu-2xl-items-end { + align-items: flex-end; + } + + .cu-2xl-items-start { + align-items: flex-start; + } + + .cu-2xl-items-stretch { + align-items: stretch; + } + + .cu-2xl-justify-around { + justify-content: space-around; + } + + .cu-2xl-justify-between { + justify-content: space-between; + } + + .cu-2xl-justify-center { + justify-content: center; + } + + .cu-2xl-justify-end { + justify-content: flex-end; + } + + .cu-2xl-justify-start { + justify-content: flex-start; + } + + .cu-2xl-justify-stretch { + justify-content: stretch; + } + + .cu-2xl-m-2xl { + margin: var(--canon-spacing-2xl); + } + + .cu-2xl-m-2xs { + margin: var(--canon-spacing-2xs); + } + + .cu-2xl-m-lg { + margin: var(--canon-spacing-lg); + } + + .cu-2xl-m-md { + margin: var(--canon-spacing-md); + } + + .cu-2xl-m-none { + margin: 0; + } + + .cu-2xl-m-sm { + margin: var(--canon-spacing-sm); + } + + .cu-2xl-m-xl { + margin: var(--canon-spacing-xl); + } + + .cu-2xl-m-xs { + margin: var(--canon-spacing-xs); + } + + .cu-2xl-mb-2xl { + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-2xl-mb-2xs { + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-2xl-mb-lg { + margin-bottom: var(--canon-spacing-lg); + } + + .cu-2xl-mb-md { + margin-bottom: var(--canon-spacing-md); + } + + .cu-2xl-mb-none { + margin-bottom: 0; + } + + .cu-2xl-mb-sm { + margin-bottom: var(--canon-spacing-sm); + } + + .cu-2xl-mb-xl { + margin-bottom: var(--canon-spacing-xl); + } + + .cu-2xl-mb-xs { + margin-bottom: var(--canon-spacing-xs); + } + + .cu-2xl-ml-2xl { + margin-left: var(--canon-spacing-2xl); + } + + .cu-2xl-ml-2xs { + margin-left: var(--canon-spacing-2xs); + } + + .cu-2xl-ml-lg { + margin-left: var(--canon-spacing-lg); + } + + .cu-2xl-ml-md { + margin-left: var(--canon-spacing-md); + } + + .cu-2xl-ml-none { + margin-left: 0; + } + + .cu-2xl-ml-sm { + margin-left: var(--canon-spacing-sm); + } + + .cu-2xl-ml-xl { + margin-left: var(--canon-spacing-xl); + } + + .cu-2xl-ml-xs { + margin-left: var(--canon-spacing-xs); + } + + .cu-2xl-mr-2xl { + margin-right: var(--canon-spacing-2xl); + } + + .cu-2xl-mr-2xs { + margin-right: var(--canon-spacing-2xs); + } + + .cu-2xl-mr-lg { + margin-right: var(--canon-spacing-lg); + } + + .cu-2xl-mr-md { + margin-right: var(--canon-spacing-md); + } + + .cu-2xl-mr-none { + margin-right: 0; + } + + .cu-2xl-mr-sm { + margin-right: var(--canon-spacing-sm); + } + + .cu-2xl-mr-xl { + margin-right: var(--canon-spacing-xl); + } + + .cu-2xl-mr-xs { + margin-right: var(--canon-spacing-xs); + } + + .cu-2xl-mt-2xl { + margin-top: var(--canon-spacing-2xl); + } + + .cu-2xl-mt-2xs { + margin-top: var(--canon-spacing-2xs); + } + + .cu-2xl-mt-lg { + margin-top: var(--canon-spacing-lg); + } + + .cu-2xl-mt-md { + margin-top: var(--canon-spacing-md); + } + + .cu-2xl-mt-none { + margin-top: 0; + } + + .cu-2xl-mt-sm { + margin-top: var(--canon-spacing-sm); + } + + .cu-2xl-mt-xl { + margin-top: var(--canon-spacing-xl); + } + + .cu-2xl-mt-xs { + margin-top: var(--canon-spacing-xs); + } + + .cu-2xl-mx-2xl { + margin-left: var(--canon-spacing-2xl); + margin-right: var(--canon-spacing-2xl); + } + + .cu-2xl-mx-2xs { + margin-left: var(--canon-spacing-2xs); + margin-right: var(--canon-spacing-2xs); + } + + .cu-2xl-mx-lg { + margin-left: var(--canon-spacing-lg); + margin-right: var(--canon-spacing-lg); + } + + .cu-2xl-mx-md { + margin-left: var(--canon-spacing-md); + margin-right: var(--canon-spacing-md); + } + + .cu-2xl-mx-none { + margin-left: 0; + margin-right: 0; + } + + .cu-2xl-mx-sm { + margin-left: var(--canon-spacing-sm); + margin-right: var(--canon-spacing-sm); + } + + .cu-2xl-mx-xl { + margin-left: var(--canon-spacing-xl); + margin-right: var(--canon-spacing-xl); + } + + .cu-2xl-mx-xs { + margin-left: var(--canon-spacing-xs); + margin-right: var(--canon-spacing-xs); + } + + .cu-2xl-my-2xl { + margin-top: var(--canon-spacing-2xl); + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-2xl-my-2xs { + margin-top: var(--canon-spacing-2xs); + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-2xl-my-lg { + margin-top: var(--canon-spacing-lg); + margin-bottom: var(--canon-spacing-lg); + } + + .cu-2xl-my-md { + margin-top: var(--canon-spacing-md); + margin-bottom: var(--canon-spacing-md); + } + + .cu-2xl-my-none { + margin-top: 0; + margin-bottom: 0; + } + + .cu-2xl-my-sm { + margin-top: var(--canon-spacing-sm); + margin-bottom: var(--canon-spacing-sm); + } + + .cu-2xl-my-xl { + margin-top: var(--canon-spacing-xl); + margin-bottom: var(--canon-spacing-xl); + } + + .cu-2xl-my-xs { + margin-top: var(--canon-spacing-xs); + margin-bottom: var(--canon-spacing-xs); + } + + .cu-2xl-p-2xl { + padding: var(--canon-spacing-2xl); + } + + .cu-2xl-p-2xs { + padding: var(--canon-spacing-2xs); + } + + .cu-2xl-p-lg { + padding: var(--canon-spacing-lg); + } + + .cu-2xl-p-md { + padding: var(--canon-spacing-md); + } + + .cu-2xl-p-none { + padding: 0; + } + + .cu-2xl-p-sm { + padding: var(--canon-spacing-sm); + } + + .cu-2xl-p-xl { + padding: var(--canon-spacing-xl); + } + + .cu-2xl-p-xs { + padding: var(--canon-spacing-xs); + } + + .cu-2xl-pb-2xl { + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-2xl-pb-2xs { + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-2xl-pb-lg { + padding-bottom: var(--canon-spacing-lg); + } + + .cu-2xl-pb-md { + padding-bottom: var(--canon-spacing-md); + } + + .cu-2xl-pb-none { + padding-bottom: 0; + } + + .cu-2xl-pb-sm { + padding-bottom: var(--canon-spacing-sm); + } + + .cu-2xl-pb-xl { + padding-bottom: var(--canon-spacing-xl); + } + + .cu-2xl-pb-xs { + padding-bottom: var(--canon-spacing-xs); + } + + .cu-2xl-pl-2xl { + padding-left: var(--canon-spacing-2xl); + } + + .cu-2xl-pl-2xs { + padding-left: var(--canon-spacing-2xs); + } + + .cu-2xl-pl-lg { + padding-left: var(--canon-spacing-lg); + } + + .cu-2xl-pl-md { + padding-left: var(--canon-spacing-md); + } + + .cu-2xl-pl-none { + padding-left: 0; + } + + .cu-2xl-pl-sm { + padding-left: var(--canon-spacing-sm); + } + + .cu-2xl-pl-xl { + padding-left: var(--canon-spacing-xl); + } + + .cu-2xl-pl-xs { + padding-left: var(--canon-spacing-xs); + } + + .cu-2xl-pr-2xl { + padding-right: var(--canon-spacing-2xl); + } + + .cu-2xl-pr-2xs { + padding-right: var(--canon-spacing-2xs); + } + + .cu-2xl-pr-lg { + padding-right: var(--canon-spacing-lg); + } + + .cu-2xl-pr-md { + padding-right: var(--canon-spacing-md); + } + + .cu-2xl-pr-none { + padding-right: 0; + } + + .cu-2xl-pr-sm { + padding-right: var(--canon-spacing-sm); + } + + .cu-2xl-pr-xl { + padding-right: var(--canon-spacing-xl); + } + + .cu-2xl-pr-xs { + padding-right: var(--canon-spacing-xs); + } + + .cu-2xl-pt-2xl { + padding-top: var(--canon-spacing-2xl); + } + + .cu-2xl-pt-2xs { + padding-top: var(--canon-spacing-2xs); + } + + .cu-2xl-pt-lg { + padding-top: var(--canon-spacing-lg); + } + + .cu-2xl-pt-md { + padding-top: var(--canon-spacing-md); + } + + .cu-2xl-pt-none { + padding-top: 0; + } + + .cu-2xl-pt-sm { + padding-top: var(--canon-spacing-sm); + } + + .cu-2xl-pt-xl { + padding-top: var(--canon-spacing-xl); + } + + .cu-2xl-pt-xs { + padding-top: var(--canon-spacing-xs); + } + + .cu-2xl-px-2xl { + padding-left: var(--canon-spacing-2xl); + padding-right: var(--canon-spacing-2xl); + } + + .cu-2xl-px-2xs { + padding-left: var(--canon-spacing-2xs); + padding-right: var(--canon-spacing-2xs); + } + + .cu-2xl-px-lg { + padding-left: var(--canon-spacing-lg); + padding-right: var(--canon-spacing-lg); + } + + .cu-2xl-px-md { + padding-left: var(--canon-spacing-md); + padding-right: var(--canon-spacing-md); + } + + .cu-2xl-px-none { + padding-left: 0; + padding-right: 0; + } + + .cu-2xl-px-sm { + padding-left: var(--canon-spacing-sm); + padding-right: var(--canon-spacing-sm); + } + + .cu-2xl-px-xl { + padding-left: var(--canon-spacing-xl); + padding-right: var(--canon-spacing-xl); + } + + .cu-2xl-px-xs { + padding-left: var(--canon-spacing-xs); + padding-right: var(--canon-spacing-xs); + } + + .cu-2xl-py-2xl { + padding-top: var(--canon-spacing-2xl); + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-2xl-py-2xs { + padding-top: var(--canon-spacing-2xs); + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-2xl-py-lg { + padding-top: var(--canon-spacing-lg); + padding-bottom: var(--canon-spacing-lg); + } + + .cu-2xl-py-md { + padding-top: var(--canon-spacing-md); + padding-bottom: var(--canon-spacing-md); + } + + .cu-2xl-py-none { + padding-top: 0; + padding-bottom: 0; + } + + .cu-2xl-py-sm { + padding-top: var(--canon-spacing-sm); + padding-bottom: var(--canon-spacing-sm); + } + + .cu-2xl-py-xl { + padding-top: var(--canon-spacing-xl); + padding-bottom: var(--canon-spacing-xl); + } + + .cu-2xl-py-xs { + padding-top: var(--canon-spacing-xs); + padding-bottom: var(--canon-spacing-xs); + } + + .cu-2xl-rounded-2xl { + border-radius: var(--canon-border-radius-2xl); + } + + .cu-2xl-rounded-2xs { + border-radius: var(--canon-border-radius-2xs); + } + + .cu-2xl-rounded-lg { + border-radius: var(--canon-border-radius-lg); + } + + .cu-2xl-rounded-md { + border-radius: var(--canon-border-radius-md); + } + + .cu-2xl-rounded-none { + border-radius: 0; + } + + .cu-2xl-rounded-sm { + border-radius: var(--canon-border-radius-sm); + } + + .cu-2xl-rounded-xl { + border-radius: var(--canon-border-radius-xl); + } + + .cu-2xl-rounded-xs { + border-radius: var(--canon-border-radius-xs); + } + + .cu-2xl-row-span-1 { + grid-row: span 1 / span 1; + } + + .cu-2xl-row-span-10 { + grid-row: span 10 / span 10; + } + + .cu-2xl-row-span-11 { + grid-row: span 11 / span 11; + } + + .cu-2xl-row-span-12 { + grid-row: span 12 / span 12; + } + + .cu-2xl-row-span-2 { + grid-row: span 2 / span 2; + } + + .cu-2xl-row-span-3 { + grid-row: span 3 / span 3; + } + + .cu-2xl-row-span-4 { + grid-row: span 4 / span 4; + } + + .cu-2xl-row-span-5 { + grid-row: span 5 / span 5; + } + + .cu-2xl-row-span-6 { + grid-row: span 6 / span 6; + } + + .cu-2xl-row-span-7 { + grid-row: span 7 / span 7; + } + + .cu-2xl-row-span-8 { + grid-row: span 8 / span 8; + } + + .cu-2xl-row-span-9 { + grid-row: span 9 / span 9; + } + + .cu-2xl-row-span-auto { + grid-row: span auto / span auto; + } + + .cu-2xl-wrap-reverse { + flex-wrap: wrap-reverse; + } + } +} diff --git a/packages/canon/src/css/utilities/lg.css b/packages/canon/src/css/utilities/lg.css new file mode 100644 index 0000000000..caa2adb310 --- /dev/null +++ b/packages/canon/src/css/utilities/lg.css @@ -0,0 +1,944 @@ +/* + * 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. + */ + +@layer utilities { + @media (min-width: 1024px) { + .cu-lg-block { + display: block; + } + + .cu-lg-border-base { + border-color: var(--canon-border-base); + border-width: 1px; + border-style: solid; + } + + .cu-lg-border-error { + border-color: var(--canon-border-error); + border-width: 1px; + border-style: solid; + } + + .cu-lg-border-none { + border-color: transparent; + border-width: 0; + } + + .cu-lg-border-selected { + border-color: var(--canon-border-selected); + border-width: 1px; + border-style: solid; + } + + .cu-lg-border-warning { + border-color: var(--canon-border-warning); + border-width: 1px; + border-style: solid; + } + + .cu-lg-col-end-1 { + grid-column-end: 1; + } + + .cu-lg-col-end-10 { + grid-column-end: 10; + } + + .cu-lg-col-end-11 { + grid-column-end: 11; + } + + .cu-lg-col-end-12 { + grid-column-end: 12; + } + + .cu-lg-col-end-13 { + grid-column-end: 13; + } + + .cu-lg-col-end-2 { + grid-column-end: 2; + } + + .cu-lg-col-end-3 { + grid-column-end: 3; + } + + .cu-lg-col-end-4 { + grid-column-end: 4; + } + + .cu-lg-col-end-5 { + grid-column-end: 5; + } + + .cu-lg-col-end-6 { + grid-column-end: 6; + } + + .cu-lg-col-end-7 { + grid-column-end: 7; + } + + .cu-lg-col-end-8 { + grid-column-end: 8; + } + + .cu-lg-col-end-9 { + grid-column-end: 9; + } + + .cu-lg-col-end-auto { + grid-column-end: auto; + } + + .cu-lg-col-span-1 { + grid-column: span 1 / span 1; + } + + .cu-lg-col-span-10 { + grid-column: span 10 / span 10; + } + + .cu-lg-col-span-11 { + grid-column: span 11 / span 11; + } + + .cu-lg-col-span-12 { + grid-column: span 12 / span 12; + } + + .cu-lg-col-span-2 { + grid-column: span 2 / span 2; + } + + .cu-lg-col-span-3 { + grid-column: span 3 / span 3; + } + + .cu-lg-col-span-4 { + grid-column: span 4 / span 4; + } + + .cu-lg-col-span-5 { + grid-column: span 5 / span 5; + } + + .cu-lg-col-span-6 { + grid-column: span 6 / span 6; + } + + .cu-lg-col-span-7 { + grid-column: span 7 / span 7; + } + + .cu-lg-col-span-8 { + grid-column: span 8 / span 8; + } + + .cu-lg-col-span-9 { + grid-column: span 9 / span 9; + } + + .cu-lg-col-span-auto { + grid-column: span auto / span auto; + } + + .cu-lg-col-start-1 { + grid-column-start: 1; + } + + .cu-lg-col-start-10 { + grid-column-start: 10; + } + + .cu-lg-col-start-11 { + grid-column-start: 11; + } + + .cu-lg-col-start-12 { + grid-column-start: 12; + } + + .cu-lg-col-start-13 { + grid-column-start: 13; + } + + .cu-lg-col-start-2 { + grid-column-start: 2; + } + + .cu-lg-col-start-3 { + grid-column-start: 3; + } + + .cu-lg-col-start-4 { + grid-column-start: 4; + } + + .cu-lg-col-start-5 { + grid-column-start: 5; + } + + .cu-lg-col-start-6 { + grid-column-start: 6; + } + + .cu-lg-col-start-7 { + grid-column-start: 7; + } + + .cu-lg-col-start-8 { + grid-column-start: 8; + } + + .cu-lg-col-start-9 { + grid-column-start: 9; + } + + .cu-lg-col-start-auto { + grid-column-start: auto; + } + + .cu-lg-flex { + display: flex; + } + + .cu-lg-flex-col { + flex-direction: column; + } + + .cu-lg-flex-nowrap { + flex-wrap: nowrap; + } + + .cu-lg-flex-row { + flex-direction: row; + } + + .cu-lg-flex-wrap { + flex-wrap: wrap; + } + + .cu-lg-flex-wrap-reverse { + flex-wrap: wrap-reverse; + } + + .cu-lg-gap-2xl { + gap: var(--canon-spacing-2xl); + } + + .cu-lg-gap-lg { + gap: var(--canon-spacing-lg); + } + + .cu-lg-gap-md { + gap: var(--canon-spacing-md); + } + + .cu-lg-gap-none { + gap: 0; + } + + .cu-lg-gap-sm { + gap: var(--canon-spacing-sm); + } + + .cu-lg-gap-xl { + gap: var(--canon-spacing-xl); + } + + .cu-lg-gap-xs { + gap: var(--canon-spacing-xs); + } + + .cu-lg-grid { + display: grid; + } + + .cu-lg-grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-10 { + grid-template-columns: repeat(10, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-11 { + grid-template-columns: repeat(11, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-12 { + grid-template-columns: repeat(12, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-6 { + grid-template-columns: repeat(6, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-7 { + grid-template-columns: repeat(7, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-8 { + grid-template-columns: repeat(8, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-9 { + grid-template-columns: repeat(9, minmax(0, 1fr)); + } + + .cu-lg-grid-cols-auto { + grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); + } + + .cu-lg-hidden { + display: none; + } + + .cu-lg-inline { + display: inline; + } + + .cu-lg-inline-block { + display: inline-block; + } + + .cu-lg-items-center { + align-items: center; + } + + .cu-lg-items-end { + align-items: flex-end; + } + + .cu-lg-items-start { + align-items: flex-start; + } + + .cu-lg-items-stretch { + align-items: stretch; + } + + .cu-lg-justify-around { + justify-content: space-around; + } + + .cu-lg-justify-between { + justify-content: space-between; + } + + .cu-lg-justify-center { + justify-content: center; + } + + .cu-lg-justify-end { + justify-content: flex-end; + } + + .cu-lg-justify-start { + justify-content: flex-start; + } + + .cu-lg-justify-stretch { + justify-content: stretch; + } + + .cu-lg-m-2xl { + margin: var(--canon-spacing-2xl); + } + + .cu-lg-m-2xs { + margin: var(--canon-spacing-2xs); + } + + .cu-lg-m-lg { + margin: var(--canon-spacing-lg); + } + + .cu-lg-m-md { + margin: var(--canon-spacing-md); + } + + .cu-lg-m-none { + margin: 0; + } + + .cu-lg-m-sm { + margin: var(--canon-spacing-sm); + } + + .cu-lg-m-xl { + margin: var(--canon-spacing-xl); + } + + .cu-lg-m-xs { + margin: var(--canon-spacing-xs); + } + + .cu-lg-mb-2xl { + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-lg-mb-2xs { + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-lg-mb-lg { + margin-bottom: var(--canon-spacing-lg); + } + + .cu-lg-mb-md { + margin-bottom: var(--canon-spacing-md); + } + + .cu-lg-mb-none { + margin-bottom: 0; + } + + .cu-lg-mb-sm { + margin-bottom: var(--canon-spacing-sm); + } + + .cu-lg-mb-xl { + margin-bottom: var(--canon-spacing-xl); + } + + .cu-lg-mb-xs { + margin-bottom: var(--canon-spacing-xs); + } + + .cu-lg-ml-2xl { + margin-left: var(--canon-spacing-2xl); + } + + .cu-lg-ml-2xs { + margin-left: var(--canon-spacing-2xs); + } + + .cu-lg-ml-lg { + margin-left: var(--canon-spacing-lg); + } + + .cu-lg-ml-md { + margin-left: var(--canon-spacing-md); + } + + .cu-lg-ml-none { + margin-left: 0; + } + + .cu-lg-ml-sm { + margin-left: var(--canon-spacing-sm); + } + + .cu-lg-ml-xl { + margin-left: var(--canon-spacing-xl); + } + + .cu-lg-ml-xs { + margin-left: var(--canon-spacing-xs); + } + + .cu-lg-mr-2xl { + margin-right: var(--canon-spacing-2xl); + } + + .cu-lg-mr-2xs { + margin-right: var(--canon-spacing-2xs); + } + + .cu-lg-mr-lg { + margin-right: var(--canon-spacing-lg); + } + + .cu-lg-mr-md { + margin-right: var(--canon-spacing-md); + } + + .cu-lg-mr-none { + margin-right: 0; + } + + .cu-lg-mr-sm { + margin-right: var(--canon-spacing-sm); + } + + .cu-lg-mr-xl { + margin-right: var(--canon-spacing-xl); + } + + .cu-lg-mr-xs { + margin-right: var(--canon-spacing-xs); + } + + .cu-lg-mt-2xl { + margin-top: var(--canon-spacing-2xl); + } + + .cu-lg-mt-2xs { + margin-top: var(--canon-spacing-2xs); + } + + .cu-lg-mt-lg { + margin-top: var(--canon-spacing-lg); + } + + .cu-lg-mt-md { + margin-top: var(--canon-spacing-md); + } + + .cu-lg-mt-none { + margin-top: 0; + } + + .cu-lg-mt-sm { + margin-top: var(--canon-spacing-sm); + } + + .cu-lg-mt-xl { + margin-top: var(--canon-spacing-xl); + } + + .cu-lg-mt-xs { + margin-top: var(--canon-spacing-xs); + } + + .cu-lg-mx-2xl { + margin-left: var(--canon-spacing-2xl); + margin-right: var(--canon-spacing-2xl); + } + + .cu-lg-mx-2xs { + margin-left: var(--canon-spacing-2xs); + margin-right: var(--canon-spacing-2xs); + } + + .cu-lg-mx-lg { + margin-left: var(--canon-spacing-lg); + margin-right: var(--canon-spacing-lg); + } + + .cu-lg-mx-md { + margin-left: var(--canon-spacing-md); + margin-right: var(--canon-spacing-md); + } + + .cu-lg-mx-none { + margin-left: 0; + margin-right: 0; + } + + .cu-lg-mx-sm { + margin-left: var(--canon-spacing-sm); + margin-right: var(--canon-spacing-sm); + } + + .cu-lg-mx-xl { + margin-left: var(--canon-spacing-xl); + margin-right: var(--canon-spacing-xl); + } + + .cu-lg-mx-xs { + margin-left: var(--canon-spacing-xs); + margin-right: var(--canon-spacing-xs); + } + + .cu-lg-my-2xl { + margin-top: var(--canon-spacing-2xl); + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-lg-my-2xs { + margin-top: var(--canon-spacing-2xs); + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-lg-my-lg { + margin-top: var(--canon-spacing-lg); + margin-bottom: var(--canon-spacing-lg); + } + + .cu-lg-my-md { + margin-top: var(--canon-spacing-md); + margin-bottom: var(--canon-spacing-md); + } + + .cu-lg-my-none { + margin-top: 0; + margin-bottom: 0; + } + + .cu-lg-my-sm { + margin-top: var(--canon-spacing-sm); + margin-bottom: var(--canon-spacing-sm); + } + + .cu-lg-my-xl { + margin-top: var(--canon-spacing-xl); + margin-bottom: var(--canon-spacing-xl); + } + + .cu-lg-my-xs { + margin-top: var(--canon-spacing-xs); + margin-bottom: var(--canon-spacing-xs); + } + + .cu-lg-p-2xl { + padding: var(--canon-spacing-2xl); + } + + .cu-lg-p-2xs { + padding: var(--canon-spacing-2xs); + } + + .cu-lg-p-lg { + padding: var(--canon-spacing-lg); + } + + .cu-lg-p-md { + padding: var(--canon-spacing-md); + } + + .cu-lg-p-none { + padding: 0; + } + + .cu-lg-p-sm { + padding: var(--canon-spacing-sm); + } + + .cu-lg-p-xl { + padding: var(--canon-spacing-xl); + } + + .cu-lg-p-xs { + padding: var(--canon-spacing-xs); + } + + .cu-lg-pb-2xl { + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-lg-pb-2xs { + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-lg-pb-lg { + padding-bottom: var(--canon-spacing-lg); + } + + .cu-lg-pb-md { + padding-bottom: var(--canon-spacing-md); + } + + .cu-lg-pb-none { + padding-bottom: 0; + } + + .cu-lg-pb-sm { + padding-bottom: var(--canon-spacing-sm); + } + + .cu-lg-pb-xl { + padding-bottom: var(--canon-spacing-xl); + } + + .cu-lg-pb-xs { + padding-bottom: var(--canon-spacing-xs); + } + + .cu-lg-pl-2xl { + padding-left: var(--canon-spacing-2xl); + } + + .cu-lg-pl-2xs { + padding-left: var(--canon-spacing-2xs); + } + + .cu-lg-pl-lg { + padding-left: var(--canon-spacing-lg); + } + + .cu-lg-pl-md { + padding-left: var(--canon-spacing-md); + } + + .cu-lg-pl-none { + padding-left: 0; + } + + .cu-lg-pl-sm { + padding-left: var(--canon-spacing-sm); + } + + .cu-lg-pl-xl { + padding-left: var(--canon-spacing-xl); + } + + .cu-lg-pl-xs { + padding-left: var(--canon-spacing-xs); + } + + .cu-lg-pr-2xl { + padding-right: var(--canon-spacing-2xl); + } + + .cu-lg-pr-2xs { + padding-right: var(--canon-spacing-2xs); + } + + .cu-lg-pr-lg { + padding-right: var(--canon-spacing-lg); + } + + .cu-lg-pr-md { + padding-right: var(--canon-spacing-md); + } + + .cu-lg-pr-none { + padding-right: 0; + } + + .cu-lg-pr-sm { + padding-right: var(--canon-spacing-sm); + } + + .cu-lg-pr-xl { + padding-right: var(--canon-spacing-xl); + } + + .cu-lg-pr-xs { + padding-right: var(--canon-spacing-xs); + } + + .cu-lg-pt-2xl { + padding-top: var(--canon-spacing-2xl); + } + + .cu-lg-pt-2xs { + padding-top: var(--canon-spacing-2xs); + } + + .cu-lg-pt-lg { + padding-top: var(--canon-spacing-lg); + } + + .cu-lg-pt-md { + padding-top: var(--canon-spacing-md); + } + + .cu-lg-pt-none { + padding-top: 0; + } + + .cu-lg-pt-sm { + padding-top: var(--canon-spacing-sm); + } + + .cu-lg-pt-xl { + padding-top: var(--canon-spacing-xl); + } + + .cu-lg-pt-xs { + padding-top: var(--canon-spacing-xs); + } + + .cu-lg-px-2xl { + padding-left: var(--canon-spacing-2xl); + padding-right: var(--canon-spacing-2xl); + } + + .cu-lg-px-2xs { + padding-left: var(--canon-spacing-2xs); + padding-right: var(--canon-spacing-2xs); + } + + .cu-lg-px-lg { + padding-left: var(--canon-spacing-lg); + padding-right: var(--canon-spacing-lg); + } + + .cu-lg-px-md { + padding-left: var(--canon-spacing-md); + padding-right: var(--canon-spacing-md); + } + + .cu-lg-px-none { + padding-left: 0; + padding-right: 0; + } + + .cu-lg-px-sm { + padding-left: var(--canon-spacing-sm); + padding-right: var(--canon-spacing-sm); + } + + .cu-lg-px-xl { + padding-left: var(--canon-spacing-xl); + padding-right: var(--canon-spacing-xl); + } + + .cu-lg-px-xs { + padding-left: var(--canon-spacing-xs); + padding-right: var(--canon-spacing-xs); + } + + .cu-lg-py-2xl { + padding-top: var(--canon-spacing-2xl); + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-lg-py-2xs { + padding-top: var(--canon-spacing-2xs); + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-lg-py-lg { + padding-top: var(--canon-spacing-lg); + padding-bottom: var(--canon-spacing-lg); + } + + .cu-lg-py-md { + padding-top: var(--canon-spacing-md); + padding-bottom: var(--canon-spacing-md); + } + + .cu-lg-py-none { + padding-top: 0; + padding-bottom: 0; + } + + .cu-lg-py-sm { + padding-top: var(--canon-spacing-sm); + padding-bottom: var(--canon-spacing-sm); + } + + .cu-lg-py-xl { + padding-top: var(--canon-spacing-xl); + padding-bottom: var(--canon-spacing-xl); + } + + .cu-lg-py-xs { + padding-top: var(--canon-spacing-xs); + padding-bottom: var(--canon-spacing-xs); + } + + .cu-lg-rounded-2xl { + border-radius: var(--canon-border-radius-2xl); + } + + .cu-lg-rounded-2xs { + border-radius: var(--canon-border-radius-2xs); + } + + .cu-lg-rounded-lg { + border-radius: var(--canon-border-radius-lg); + } + + .cu-lg-rounded-md { + border-radius: var(--canon-border-radius-md); + } + + .cu-lg-rounded-none { + border-radius: 0; + } + + .cu-lg-rounded-sm { + border-radius: var(--canon-border-radius-sm); + } + + .cu-lg-rounded-xl { + border-radius: var(--canon-border-radius-xl); + } + + .cu-lg-rounded-xs { + border-radius: var(--canon-border-radius-xs); + } + + .cu-lg-row-span-1 { + grid-row: span 1 / span 1; + } + + .cu-lg-row-span-10 { + grid-row: span 10 / span 10; + } + + .cu-lg-row-span-11 { + grid-row: span 11 / span 11; + } + + .cu-lg-row-span-12 { + grid-row: span 12 / span 12; + } + + .cu-lg-row-span-2 { + grid-row: span 2 / span 2; + } + + .cu-lg-row-span-3 { + grid-row: span 3 / span 3; + } + + .cu-lg-row-span-4 { + grid-row: span 4 / span 4; + } + + .cu-lg-row-span-5 { + grid-row: span 5 / span 5; + } + + .cu-lg-row-span-6 { + grid-row: span 6 / span 6; + } + + .cu-lg-row-span-7 { + grid-row: span 7 / span 7; + } + + .cu-lg-row-span-8 { + grid-row: span 8 / span 8; + } + + .cu-lg-row-span-9 { + grid-row: span 9 / span 9; + } + + .cu-lg-row-span-auto { + grid-row: span auto / span auto; + } + + .cu-lg-wrap-reverse { + flex-wrap: wrap-reverse; + } + } +} diff --git a/packages/canon/src/css/utilities/md.css b/packages/canon/src/css/utilities/md.css new file mode 100644 index 0000000000..fe6d56ad7c --- /dev/null +++ b/packages/canon/src/css/utilities/md.css @@ -0,0 +1,944 @@ +/* + * 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. + */ + +@layer utilities { + @media (min-width: 768px) { + .cu-md-block { + display: block; + } + + .cu-md-border-base { + border-color: var(--canon-border-base); + border-width: 1px; + border-style: solid; + } + + .cu-md-border-error { + border-color: var(--canon-border-error); + border-width: 1px; + border-style: solid; + } + + .cu-md-border-none { + border-color: transparent; + border-width: 0; + } + + .cu-md-border-selected { + border-color: var(--canon-border-selected); + border-width: 1px; + border-style: solid; + } + + .cu-md-border-warning { + border-color: var(--canon-border-warning); + border-width: 1px; + border-style: solid; + } + + .cu-md-col-end-1 { + grid-column-end: 1; + } + + .cu-md-col-end-10 { + grid-column-end: 10; + } + + .cu-md-col-end-11 { + grid-column-end: 11; + } + + .cu-md-col-end-12 { + grid-column-end: 12; + } + + .cu-md-col-end-13 { + grid-column-end: 13; + } + + .cu-md-col-end-2 { + grid-column-end: 2; + } + + .cu-md-col-end-3 { + grid-column-end: 3; + } + + .cu-md-col-end-4 { + grid-column-end: 4; + } + + .cu-md-col-end-5 { + grid-column-end: 5; + } + + .cu-md-col-end-6 { + grid-column-end: 6; + } + + .cu-md-col-end-7 { + grid-column-end: 7; + } + + .cu-md-col-end-8 { + grid-column-end: 8; + } + + .cu-md-col-end-9 { + grid-column-end: 9; + } + + .cu-md-col-end-auto { + grid-column-end: auto; + } + + .cu-md-col-span-1 { + grid-column: span 1 / span 1; + } + + .cu-md-col-span-10 { + grid-column: span 10 / span 10; + } + + .cu-md-col-span-11 { + grid-column: span 11 / span 11; + } + + .cu-md-col-span-12 { + grid-column: span 12 / span 12; + } + + .cu-md-col-span-2 { + grid-column: span 2 / span 2; + } + + .cu-md-col-span-3 { + grid-column: span 3 / span 3; + } + + .cu-md-col-span-4 { + grid-column: span 4 / span 4; + } + + .cu-md-col-span-5 { + grid-column: span 5 / span 5; + } + + .cu-md-col-span-6 { + grid-column: span 6 / span 6; + } + + .cu-md-col-span-7 { + grid-column: span 7 / span 7; + } + + .cu-md-col-span-8 { + grid-column: span 8 / span 8; + } + + .cu-md-col-span-9 { + grid-column: span 9 / span 9; + } + + .cu-md-col-span-auto { + grid-column: span auto / span auto; + } + + .cu-md-col-start-1 { + grid-column-start: 1; + } + + .cu-md-col-start-10 { + grid-column-start: 10; + } + + .cu-md-col-start-11 { + grid-column-start: 11; + } + + .cu-md-col-start-12 { + grid-column-start: 12; + } + + .cu-md-col-start-13 { + grid-column-start: 13; + } + + .cu-md-col-start-2 { + grid-column-start: 2; + } + + .cu-md-col-start-3 { + grid-column-start: 3; + } + + .cu-md-col-start-4 { + grid-column-start: 4; + } + + .cu-md-col-start-5 { + grid-column-start: 5; + } + + .cu-md-col-start-6 { + grid-column-start: 6; + } + + .cu-md-col-start-7 { + grid-column-start: 7; + } + + .cu-md-col-start-8 { + grid-column-start: 8; + } + + .cu-md-col-start-9 { + grid-column-start: 9; + } + + .cu-md-col-start-auto { + grid-column-start: auto; + } + + .cu-md-flex { + display: flex; + } + + .cu-md-flex-col { + flex-direction: column; + } + + .cu-md-flex-nowrap { + flex-wrap: nowrap; + } + + .cu-md-flex-row { + flex-direction: row; + } + + .cu-md-flex-wrap { + flex-wrap: wrap; + } + + .cu-md-flex-wrap-reverse { + flex-wrap: wrap-reverse; + } + + .cu-md-gap-2xl { + gap: var(--canon-spacing-2xl); + } + + .cu-md-gap-lg { + gap: var(--canon-spacing-lg); + } + + .cu-md-gap-md { + gap: var(--canon-spacing-md); + } + + .cu-md-gap-none { + gap: 0; + } + + .cu-md-gap-sm { + gap: var(--canon-spacing-sm); + } + + .cu-md-gap-xl { + gap: var(--canon-spacing-xl); + } + + .cu-md-gap-xs { + gap: var(--canon-spacing-xs); + } + + .cu-md-grid { + display: grid; + } + + .cu-md-grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); + } + + .cu-md-grid-cols-10 { + grid-template-columns: repeat(10, minmax(0, 1fr)); + } + + .cu-md-grid-cols-11 { + grid-template-columns: repeat(11, minmax(0, 1fr)); + } + + .cu-md-grid-cols-12 { + grid-template-columns: repeat(12, minmax(0, 1fr)); + } + + .cu-md-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .cu-md-grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .cu-md-grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .cu-md-grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } + + .cu-md-grid-cols-6 { + grid-template-columns: repeat(6, minmax(0, 1fr)); + } + + .cu-md-grid-cols-7 { + grid-template-columns: repeat(7, minmax(0, 1fr)); + } + + .cu-md-grid-cols-8 { + grid-template-columns: repeat(8, minmax(0, 1fr)); + } + + .cu-md-grid-cols-9 { + grid-template-columns: repeat(9, minmax(0, 1fr)); + } + + .cu-md-grid-cols-auto { + grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); + } + + .cu-md-hidden { + display: none; + } + + .cu-md-inline { + display: inline; + } + + .cu-md-inline-block { + display: inline-block; + } + + .cu-md-items-center { + align-items: center; + } + + .cu-md-items-end { + align-items: flex-end; + } + + .cu-md-items-start { + align-items: flex-start; + } + + .cu-md-items-stretch { + align-items: stretch; + } + + .cu-md-justify-around { + justify-content: space-around; + } + + .cu-md-justify-between { + justify-content: space-between; + } + + .cu-md-justify-center { + justify-content: center; + } + + .cu-md-justify-end { + justify-content: flex-end; + } + + .cu-md-justify-start { + justify-content: flex-start; + } + + .cu-md-justify-stretch { + justify-content: stretch; + } + + .cu-md-m-2xl { + margin: var(--canon-spacing-2xl); + } + + .cu-md-m-2xs { + margin: var(--canon-spacing-2xs); + } + + .cu-md-m-lg { + margin: var(--canon-spacing-lg); + } + + .cu-md-m-md { + margin: var(--canon-spacing-md); + } + + .cu-md-m-none { + margin: 0; + } + + .cu-md-m-sm { + margin: var(--canon-spacing-sm); + } + + .cu-md-m-xl { + margin: var(--canon-spacing-xl); + } + + .cu-md-m-xs { + margin: var(--canon-spacing-xs); + } + + .cu-md-mb-2xl { + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-md-mb-2xs { + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-md-mb-lg { + margin-bottom: var(--canon-spacing-lg); + } + + .cu-md-mb-md { + margin-bottom: var(--canon-spacing-md); + } + + .cu-md-mb-none { + margin-bottom: 0; + } + + .cu-md-mb-sm { + margin-bottom: var(--canon-spacing-sm); + } + + .cu-md-mb-xl { + margin-bottom: var(--canon-spacing-xl); + } + + .cu-md-mb-xs { + margin-bottom: var(--canon-spacing-xs); + } + + .cu-md-ml-2xl { + margin-left: var(--canon-spacing-2xl); + } + + .cu-md-ml-2xs { + margin-left: var(--canon-spacing-2xs); + } + + .cu-md-ml-lg { + margin-left: var(--canon-spacing-lg); + } + + .cu-md-ml-md { + margin-left: var(--canon-spacing-md); + } + + .cu-md-ml-none { + margin-left: 0; + } + + .cu-md-ml-sm { + margin-left: var(--canon-spacing-sm); + } + + .cu-md-ml-xl { + margin-left: var(--canon-spacing-xl); + } + + .cu-md-ml-xs { + margin-left: var(--canon-spacing-xs); + } + + .cu-md-mr-2xl { + margin-right: var(--canon-spacing-2xl); + } + + .cu-md-mr-2xs { + margin-right: var(--canon-spacing-2xs); + } + + .cu-md-mr-lg { + margin-right: var(--canon-spacing-lg); + } + + .cu-md-mr-md { + margin-right: var(--canon-spacing-md); + } + + .cu-md-mr-none { + margin-right: 0; + } + + .cu-md-mr-sm { + margin-right: var(--canon-spacing-sm); + } + + .cu-md-mr-xl { + margin-right: var(--canon-spacing-xl); + } + + .cu-md-mr-xs { + margin-right: var(--canon-spacing-xs); + } + + .cu-md-mt-2xl { + margin-top: var(--canon-spacing-2xl); + } + + .cu-md-mt-2xs { + margin-top: var(--canon-spacing-2xs); + } + + .cu-md-mt-lg { + margin-top: var(--canon-spacing-lg); + } + + .cu-md-mt-md { + margin-top: var(--canon-spacing-md); + } + + .cu-md-mt-none { + margin-top: 0; + } + + .cu-md-mt-sm { + margin-top: var(--canon-spacing-sm); + } + + .cu-md-mt-xl { + margin-top: var(--canon-spacing-xl); + } + + .cu-md-mt-xs { + margin-top: var(--canon-spacing-xs); + } + + .cu-md-mx-2xl { + margin-left: var(--canon-spacing-2xl); + margin-right: var(--canon-spacing-2xl); + } + + .cu-md-mx-2xs { + margin-left: var(--canon-spacing-2xs); + margin-right: var(--canon-spacing-2xs); + } + + .cu-md-mx-lg { + margin-left: var(--canon-spacing-lg); + margin-right: var(--canon-spacing-lg); + } + + .cu-md-mx-md { + margin-left: var(--canon-spacing-md); + margin-right: var(--canon-spacing-md); + } + + .cu-md-mx-none { + margin-left: 0; + margin-right: 0; + } + + .cu-md-mx-sm { + margin-left: var(--canon-spacing-sm); + margin-right: var(--canon-spacing-sm); + } + + .cu-md-mx-xl { + margin-left: var(--canon-spacing-xl); + margin-right: var(--canon-spacing-xl); + } + + .cu-md-mx-xs { + margin-left: var(--canon-spacing-xs); + margin-right: var(--canon-spacing-xs); + } + + .cu-md-my-2xl { + margin-top: var(--canon-spacing-2xl); + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-md-my-2xs { + margin-top: var(--canon-spacing-2xs); + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-md-my-lg { + margin-top: var(--canon-spacing-lg); + margin-bottom: var(--canon-spacing-lg); + } + + .cu-md-my-md { + margin-top: var(--canon-spacing-md); + margin-bottom: var(--canon-spacing-md); + } + + .cu-md-my-none { + margin-top: 0; + margin-bottom: 0; + } + + .cu-md-my-sm { + margin-top: var(--canon-spacing-sm); + margin-bottom: var(--canon-spacing-sm); + } + + .cu-md-my-xl { + margin-top: var(--canon-spacing-xl); + margin-bottom: var(--canon-spacing-xl); + } + + .cu-md-my-xs { + margin-top: var(--canon-spacing-xs); + margin-bottom: var(--canon-spacing-xs); + } + + .cu-md-p-2xl { + padding: var(--canon-spacing-2xl); + } + + .cu-md-p-2xs { + padding: var(--canon-spacing-2xs); + } + + .cu-md-p-lg { + padding: var(--canon-spacing-lg); + } + + .cu-md-p-md { + padding: var(--canon-spacing-md); + } + + .cu-md-p-none { + padding: 0; + } + + .cu-md-p-sm { + padding: var(--canon-spacing-sm); + } + + .cu-md-p-xl { + padding: var(--canon-spacing-xl); + } + + .cu-md-p-xs { + padding: var(--canon-spacing-xs); + } + + .cu-md-pb-2xl { + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-md-pb-2xs { + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-md-pb-lg { + padding-bottom: var(--canon-spacing-lg); + } + + .cu-md-pb-md { + padding-bottom: var(--canon-spacing-md); + } + + .cu-md-pb-none { + padding-bottom: 0; + } + + .cu-md-pb-sm { + padding-bottom: var(--canon-spacing-sm); + } + + .cu-md-pb-xl { + padding-bottom: var(--canon-spacing-xl); + } + + .cu-md-pb-xs { + padding-bottom: var(--canon-spacing-xs); + } + + .cu-md-pl-2xl { + padding-left: var(--canon-spacing-2xl); + } + + .cu-md-pl-2xs { + padding-left: var(--canon-spacing-2xs); + } + + .cu-md-pl-lg { + padding-left: var(--canon-spacing-lg); + } + + .cu-md-pl-md { + padding-left: var(--canon-spacing-md); + } + + .cu-md-pl-none { + padding-left: 0; + } + + .cu-md-pl-sm { + padding-left: var(--canon-spacing-sm); + } + + .cu-md-pl-xl { + padding-left: var(--canon-spacing-xl); + } + + .cu-md-pl-xs { + padding-left: var(--canon-spacing-xs); + } + + .cu-md-pr-2xl { + padding-right: var(--canon-spacing-2xl); + } + + .cu-md-pr-2xs { + padding-right: var(--canon-spacing-2xs); + } + + .cu-md-pr-lg { + padding-right: var(--canon-spacing-lg); + } + + .cu-md-pr-md { + padding-right: var(--canon-spacing-md); + } + + .cu-md-pr-none { + padding-right: 0; + } + + .cu-md-pr-sm { + padding-right: var(--canon-spacing-sm); + } + + .cu-md-pr-xl { + padding-right: var(--canon-spacing-xl); + } + + .cu-md-pr-xs { + padding-right: var(--canon-spacing-xs); + } + + .cu-md-pt-2xl { + padding-top: var(--canon-spacing-2xl); + } + + .cu-md-pt-2xs { + padding-top: var(--canon-spacing-2xs); + } + + .cu-md-pt-lg { + padding-top: var(--canon-spacing-lg); + } + + .cu-md-pt-md { + padding-top: var(--canon-spacing-md); + } + + .cu-md-pt-none { + padding-top: 0; + } + + .cu-md-pt-sm { + padding-top: var(--canon-spacing-sm); + } + + .cu-md-pt-xl { + padding-top: var(--canon-spacing-xl); + } + + .cu-md-pt-xs { + padding-top: var(--canon-spacing-xs); + } + + .cu-md-px-2xl { + padding-left: var(--canon-spacing-2xl); + padding-right: var(--canon-spacing-2xl); + } + + .cu-md-px-2xs { + padding-left: var(--canon-spacing-2xs); + padding-right: var(--canon-spacing-2xs); + } + + .cu-md-px-lg { + padding-left: var(--canon-spacing-lg); + padding-right: var(--canon-spacing-lg); + } + + .cu-md-px-md { + padding-left: var(--canon-spacing-md); + padding-right: var(--canon-spacing-md); + } + + .cu-md-px-none { + padding-left: 0; + padding-right: 0; + } + + .cu-md-px-sm { + padding-left: var(--canon-spacing-sm); + padding-right: var(--canon-spacing-sm); + } + + .cu-md-px-xl { + padding-left: var(--canon-spacing-xl); + padding-right: var(--canon-spacing-xl); + } + + .cu-md-px-xs { + padding-left: var(--canon-spacing-xs); + padding-right: var(--canon-spacing-xs); + } + + .cu-md-py-2xl { + padding-top: var(--canon-spacing-2xl); + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-md-py-2xs { + padding-top: var(--canon-spacing-2xs); + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-md-py-lg { + padding-top: var(--canon-spacing-lg); + padding-bottom: var(--canon-spacing-lg); + } + + .cu-md-py-md { + padding-top: var(--canon-spacing-md); + padding-bottom: var(--canon-spacing-md); + } + + .cu-md-py-none { + padding-top: 0; + padding-bottom: 0; + } + + .cu-md-py-sm { + padding-top: var(--canon-spacing-sm); + padding-bottom: var(--canon-spacing-sm); + } + + .cu-md-py-xl { + padding-top: var(--canon-spacing-xl); + padding-bottom: var(--canon-spacing-xl); + } + + .cu-md-py-xs { + padding-top: var(--canon-spacing-xs); + padding-bottom: var(--canon-spacing-xs); + } + + .cu-md-rounded-2xl { + border-radius: var(--canon-border-radius-2xl); + } + + .cu-md-rounded-2xs { + border-radius: var(--canon-border-radius-2xs); + } + + .cu-md-rounded-lg { + border-radius: var(--canon-border-radius-lg); + } + + .cu-md-rounded-md { + border-radius: var(--canon-border-radius-md); + } + + .cu-md-rounded-none { + border-radius: 0; + } + + .cu-md-rounded-sm { + border-radius: var(--canon-border-radius-sm); + } + + .cu-md-rounded-xl { + border-radius: var(--canon-border-radius-xl); + } + + .cu-md-rounded-xs { + border-radius: var(--canon-border-radius-xs); + } + + .cu-md-row-span-1 { + grid-row: span 1 / span 1; + } + + .cu-md-row-span-10 { + grid-row: span 10 / span 10; + } + + .cu-md-row-span-11 { + grid-row: span 11 / span 11; + } + + .cu-md-row-span-12 { + grid-row: span 12 / span 12; + } + + .cu-md-row-span-2 { + grid-row: span 2 / span 2; + } + + .cu-md-row-span-3 { + grid-row: span 3 / span 3; + } + + .cu-md-row-span-4 { + grid-row: span 4 / span 4; + } + + .cu-md-row-span-5 { + grid-row: span 5 / span 5; + } + + .cu-md-row-span-6 { + grid-row: span 6 / span 6; + } + + .cu-md-row-span-7 { + grid-row: span 7 / span 7; + } + + .cu-md-row-span-8 { + grid-row: span 8 / span 8; + } + + .cu-md-row-span-9 { + grid-row: span 9 / span 9; + } + + .cu-md-row-span-auto { + grid-row: span auto / span auto; + } + + .cu-md-wrap-reverse { + flex-wrap: wrap-reverse; + } + } +} diff --git a/packages/canon/src/css/utilities/sm.css b/packages/canon/src/css/utilities/sm.css new file mode 100644 index 0000000000..87657c2222 --- /dev/null +++ b/packages/canon/src/css/utilities/sm.css @@ -0,0 +1,944 @@ +/* + * 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. + */ + +@layer utilities { + @media (min-width: 640px) { + .cu-sm-block { + display: block; + } + + .cu-sm-border-base { + border-color: var(--canon-border-base); + border-width: 1px; + border-style: solid; + } + + .cu-sm-border-error { + border-color: var(--canon-border-error); + border-width: 1px; + border-style: solid; + } + + .cu-sm-border-none { + border-color: transparent; + border-width: 0; + } + + .cu-sm-border-selected { + border-color: var(--canon-border-selected); + border-width: 1px; + border-style: solid; + } + + .cu-sm-border-warning { + border-color: var(--canon-border-warning); + border-width: 1px; + border-style: solid; + } + + .cu-sm-col-end-1 { + grid-column-end: 1; + } + + .cu-sm-col-end-10 { + grid-column-end: 10; + } + + .cu-sm-col-end-11 { + grid-column-end: 11; + } + + .cu-sm-col-end-12 { + grid-column-end: 12; + } + + .cu-sm-col-end-13 { + grid-column-end: 13; + } + + .cu-sm-col-end-2 { + grid-column-end: 2; + } + + .cu-sm-col-end-3 { + grid-column-end: 3; + } + + .cu-sm-col-end-4 { + grid-column-end: 4; + } + + .cu-sm-col-end-5 { + grid-column-end: 5; + } + + .cu-sm-col-end-6 { + grid-column-end: 6; + } + + .cu-sm-col-end-7 { + grid-column-end: 7; + } + + .cu-sm-col-end-8 { + grid-column-end: 8; + } + + .cu-sm-col-end-9 { + grid-column-end: 9; + } + + .cu-sm-col-end-auto { + grid-column-end: auto; + } + + .cu-sm-col-span-1 { + grid-column: span 1 / span 1; + } + + .cu-sm-col-span-10 { + grid-column: span 10 / span 10; + } + + .cu-sm-col-span-11 { + grid-column: span 11 / span 11; + } + + .cu-sm-col-span-12 { + grid-column: span 12 / span 12; + } + + .cu-sm-col-span-2 { + grid-column: span 2 / span 2; + } + + .cu-sm-col-span-3 { + grid-column: span 3 / span 3; + } + + .cu-sm-col-span-4 { + grid-column: span 4 / span 4; + } + + .cu-sm-col-span-5 { + grid-column: span 5 / span 5; + } + + .cu-sm-col-span-6 { + grid-column: span 6 / span 6; + } + + .cu-sm-col-span-7 { + grid-column: span 7 / span 7; + } + + .cu-sm-col-span-8 { + grid-column: span 8 / span 8; + } + + .cu-sm-col-span-9 { + grid-column: span 9 / span 9; + } + + .cu-sm-col-span-auto { + grid-column: span auto / span auto; + } + + .cu-sm-col-start-1 { + grid-column-start: 1; + } + + .cu-sm-col-start-10 { + grid-column-start: 10; + } + + .cu-sm-col-start-11 { + grid-column-start: 11; + } + + .cu-sm-col-start-12 { + grid-column-start: 12; + } + + .cu-sm-col-start-13 { + grid-column-start: 13; + } + + .cu-sm-col-start-2 { + grid-column-start: 2; + } + + .cu-sm-col-start-3 { + grid-column-start: 3; + } + + .cu-sm-col-start-4 { + grid-column-start: 4; + } + + .cu-sm-col-start-5 { + grid-column-start: 5; + } + + .cu-sm-col-start-6 { + grid-column-start: 6; + } + + .cu-sm-col-start-7 { + grid-column-start: 7; + } + + .cu-sm-col-start-8 { + grid-column-start: 8; + } + + .cu-sm-col-start-9 { + grid-column-start: 9; + } + + .cu-sm-col-start-auto { + grid-column-start: auto; + } + + .cu-sm-flex { + display: flex; + } + + .cu-sm-flex-col { + flex-direction: column; + } + + .cu-sm-flex-nowrap { + flex-wrap: nowrap; + } + + .cu-sm-flex-row { + flex-direction: row; + } + + .cu-sm-flex-wrap { + flex-wrap: wrap; + } + + .cu-sm-flex-wrap-reverse { + flex-wrap: wrap-reverse; + } + + .cu-sm-gap-2xl { + gap: var(--canon-spacing-2xl); + } + + .cu-sm-gap-lg { + gap: var(--canon-spacing-lg); + } + + .cu-sm-gap-md { + gap: var(--canon-spacing-md); + } + + .cu-sm-gap-none { + gap: 0; + } + + .cu-sm-gap-sm { + gap: var(--canon-spacing-sm); + } + + .cu-sm-gap-xl { + gap: var(--canon-spacing-xl); + } + + .cu-sm-gap-xs { + gap: var(--canon-spacing-xs); + } + + .cu-sm-grid { + display: grid; + } + + .cu-sm-grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-10 { + grid-template-columns: repeat(10, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-11 { + grid-template-columns: repeat(11, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-12 { + grid-template-columns: repeat(12, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-6 { + grid-template-columns: repeat(6, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-7 { + grid-template-columns: repeat(7, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-8 { + grid-template-columns: repeat(8, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-9 { + grid-template-columns: repeat(9, minmax(0, 1fr)); + } + + .cu-sm-grid-cols-auto { + grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); + } + + .cu-sm-hidden { + display: none; + } + + .cu-sm-inline { + display: inline; + } + + .cu-sm-inline-block { + display: inline-block; + } + + .cu-sm-items-center { + align-items: center; + } + + .cu-sm-items-end { + align-items: flex-end; + } + + .cu-sm-items-start { + align-items: flex-start; + } + + .cu-sm-items-stretch { + align-items: stretch; + } + + .cu-sm-justify-around { + justify-content: space-around; + } + + .cu-sm-justify-between { + justify-content: space-between; + } + + .cu-sm-justify-center { + justify-content: center; + } + + .cu-sm-justify-end { + justify-content: flex-end; + } + + .cu-sm-justify-start { + justify-content: flex-start; + } + + .cu-sm-justify-stretch { + justify-content: stretch; + } + + .cu-sm-m-2xl { + margin: var(--canon-spacing-2xl); + } + + .cu-sm-m-2xs { + margin: var(--canon-spacing-2xs); + } + + .cu-sm-m-lg { + margin: var(--canon-spacing-lg); + } + + .cu-sm-m-md { + margin: var(--canon-spacing-md); + } + + .cu-sm-m-none { + margin: 0; + } + + .cu-sm-m-sm { + margin: var(--canon-spacing-sm); + } + + .cu-sm-m-xl { + margin: var(--canon-spacing-xl); + } + + .cu-sm-m-xs { + margin: var(--canon-spacing-xs); + } + + .cu-sm-mb-2xl { + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-sm-mb-2xs { + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-sm-mb-lg { + margin-bottom: var(--canon-spacing-lg); + } + + .cu-sm-mb-md { + margin-bottom: var(--canon-spacing-md); + } + + .cu-sm-mb-none { + margin-bottom: 0; + } + + .cu-sm-mb-sm { + margin-bottom: var(--canon-spacing-sm); + } + + .cu-sm-mb-xl { + margin-bottom: var(--canon-spacing-xl); + } + + .cu-sm-mb-xs { + margin-bottom: var(--canon-spacing-xs); + } + + .cu-sm-ml-2xl { + margin-left: var(--canon-spacing-2xl); + } + + .cu-sm-ml-2xs { + margin-left: var(--canon-spacing-2xs); + } + + .cu-sm-ml-lg { + margin-left: var(--canon-spacing-lg); + } + + .cu-sm-ml-md { + margin-left: var(--canon-spacing-md); + } + + .cu-sm-ml-none { + margin-left: 0; + } + + .cu-sm-ml-sm { + margin-left: var(--canon-spacing-sm); + } + + .cu-sm-ml-xl { + margin-left: var(--canon-spacing-xl); + } + + .cu-sm-ml-xs { + margin-left: var(--canon-spacing-xs); + } + + .cu-sm-mr-2xl { + margin-right: var(--canon-spacing-2xl); + } + + .cu-sm-mr-2xs { + margin-right: var(--canon-spacing-2xs); + } + + .cu-sm-mr-lg { + margin-right: var(--canon-spacing-lg); + } + + .cu-sm-mr-md { + margin-right: var(--canon-spacing-md); + } + + .cu-sm-mr-none { + margin-right: 0; + } + + .cu-sm-mr-sm { + margin-right: var(--canon-spacing-sm); + } + + .cu-sm-mr-xl { + margin-right: var(--canon-spacing-xl); + } + + .cu-sm-mr-xs { + margin-right: var(--canon-spacing-xs); + } + + .cu-sm-mt-2xl { + margin-top: var(--canon-spacing-2xl); + } + + .cu-sm-mt-2xs { + margin-top: var(--canon-spacing-2xs); + } + + .cu-sm-mt-lg { + margin-top: var(--canon-spacing-lg); + } + + .cu-sm-mt-md { + margin-top: var(--canon-spacing-md); + } + + .cu-sm-mt-none { + margin-top: 0; + } + + .cu-sm-mt-sm { + margin-top: var(--canon-spacing-sm); + } + + .cu-sm-mt-xl { + margin-top: var(--canon-spacing-xl); + } + + .cu-sm-mt-xs { + margin-top: var(--canon-spacing-xs); + } + + .cu-sm-mx-2xl { + margin-left: var(--canon-spacing-2xl); + margin-right: var(--canon-spacing-2xl); + } + + .cu-sm-mx-2xs { + margin-left: var(--canon-spacing-2xs); + margin-right: var(--canon-spacing-2xs); + } + + .cu-sm-mx-lg { + margin-left: var(--canon-spacing-lg); + margin-right: var(--canon-spacing-lg); + } + + .cu-sm-mx-md { + margin-left: var(--canon-spacing-md); + margin-right: var(--canon-spacing-md); + } + + .cu-sm-mx-none { + margin-left: 0; + margin-right: 0; + } + + .cu-sm-mx-sm { + margin-left: var(--canon-spacing-sm); + margin-right: var(--canon-spacing-sm); + } + + .cu-sm-mx-xl { + margin-left: var(--canon-spacing-xl); + margin-right: var(--canon-spacing-xl); + } + + .cu-sm-mx-xs { + margin-left: var(--canon-spacing-xs); + margin-right: var(--canon-spacing-xs); + } + + .cu-sm-my-2xl { + margin-top: var(--canon-spacing-2xl); + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-sm-my-2xs { + margin-top: var(--canon-spacing-2xs); + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-sm-my-lg { + margin-top: var(--canon-spacing-lg); + margin-bottom: var(--canon-spacing-lg); + } + + .cu-sm-my-md { + margin-top: var(--canon-spacing-md); + margin-bottom: var(--canon-spacing-md); + } + + .cu-sm-my-none { + margin-top: 0; + margin-bottom: 0; + } + + .cu-sm-my-sm { + margin-top: var(--canon-spacing-sm); + margin-bottom: var(--canon-spacing-sm); + } + + .cu-sm-my-xl { + margin-top: var(--canon-spacing-xl); + margin-bottom: var(--canon-spacing-xl); + } + + .cu-sm-my-xs { + margin-top: var(--canon-spacing-xs); + margin-bottom: var(--canon-spacing-xs); + } + + .cu-sm-p-2xl { + padding: var(--canon-spacing-2xl); + } + + .cu-sm-p-2xs { + padding: var(--canon-spacing-2xs); + } + + .cu-sm-p-lg { + padding: var(--canon-spacing-lg); + } + + .cu-sm-p-md { + padding: var(--canon-spacing-md); + } + + .cu-sm-p-none { + padding: 0; + } + + .cu-sm-p-sm { + padding: var(--canon-spacing-sm); + } + + .cu-sm-p-xl { + padding: var(--canon-spacing-xl); + } + + .cu-sm-p-xs { + padding: var(--canon-spacing-xs); + } + + .cu-sm-pb-2xl { + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-sm-pb-2xs { + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-sm-pb-lg { + padding-bottom: var(--canon-spacing-lg); + } + + .cu-sm-pb-md { + padding-bottom: var(--canon-spacing-md); + } + + .cu-sm-pb-none { + padding-bottom: 0; + } + + .cu-sm-pb-sm { + padding-bottom: var(--canon-spacing-sm); + } + + .cu-sm-pb-xl { + padding-bottom: var(--canon-spacing-xl); + } + + .cu-sm-pb-xs { + padding-bottom: var(--canon-spacing-xs); + } + + .cu-sm-pl-2xl { + padding-left: var(--canon-spacing-2xl); + } + + .cu-sm-pl-2xs { + padding-left: var(--canon-spacing-2xs); + } + + .cu-sm-pl-lg { + padding-left: var(--canon-spacing-lg); + } + + .cu-sm-pl-md { + padding-left: var(--canon-spacing-md); + } + + .cu-sm-pl-none { + padding-left: 0; + } + + .cu-sm-pl-sm { + padding-left: var(--canon-spacing-sm); + } + + .cu-sm-pl-xl { + padding-left: var(--canon-spacing-xl); + } + + .cu-sm-pl-xs { + padding-left: var(--canon-spacing-xs); + } + + .cu-sm-pr-2xl { + padding-right: var(--canon-spacing-2xl); + } + + .cu-sm-pr-2xs { + padding-right: var(--canon-spacing-2xs); + } + + .cu-sm-pr-lg { + padding-right: var(--canon-spacing-lg); + } + + .cu-sm-pr-md { + padding-right: var(--canon-spacing-md); + } + + .cu-sm-pr-none { + padding-right: 0; + } + + .cu-sm-pr-sm { + padding-right: var(--canon-spacing-sm); + } + + .cu-sm-pr-xl { + padding-right: var(--canon-spacing-xl); + } + + .cu-sm-pr-xs { + padding-right: var(--canon-spacing-xs); + } + + .cu-sm-pt-2xl { + padding-top: var(--canon-spacing-2xl); + } + + .cu-sm-pt-2xs { + padding-top: var(--canon-spacing-2xs); + } + + .cu-sm-pt-lg { + padding-top: var(--canon-spacing-lg); + } + + .cu-sm-pt-md { + padding-top: var(--canon-spacing-md); + } + + .cu-sm-pt-none { + padding-top: 0; + } + + .cu-sm-pt-sm { + padding-top: var(--canon-spacing-sm); + } + + .cu-sm-pt-xl { + padding-top: var(--canon-spacing-xl); + } + + .cu-sm-pt-xs { + padding-top: var(--canon-spacing-xs); + } + + .cu-sm-px-2xl { + padding-left: var(--canon-spacing-2xl); + padding-right: var(--canon-spacing-2xl); + } + + .cu-sm-px-2xs { + padding-left: var(--canon-spacing-2xs); + padding-right: var(--canon-spacing-2xs); + } + + .cu-sm-px-lg { + padding-left: var(--canon-spacing-lg); + padding-right: var(--canon-spacing-lg); + } + + .cu-sm-px-md { + padding-left: var(--canon-spacing-md); + padding-right: var(--canon-spacing-md); + } + + .cu-sm-px-none { + padding-left: 0; + padding-right: 0; + } + + .cu-sm-px-sm { + padding-left: var(--canon-spacing-sm); + padding-right: var(--canon-spacing-sm); + } + + .cu-sm-px-xl { + padding-left: var(--canon-spacing-xl); + padding-right: var(--canon-spacing-xl); + } + + .cu-sm-px-xs { + padding-left: var(--canon-spacing-xs); + padding-right: var(--canon-spacing-xs); + } + + .cu-sm-py-2xl { + padding-top: var(--canon-spacing-2xl); + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-sm-py-2xs { + padding-top: var(--canon-spacing-2xs); + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-sm-py-lg { + padding-top: var(--canon-spacing-lg); + padding-bottom: var(--canon-spacing-lg); + } + + .cu-sm-py-md { + padding-top: var(--canon-spacing-md); + padding-bottom: var(--canon-spacing-md); + } + + .cu-sm-py-none { + padding-top: 0; + padding-bottom: 0; + } + + .cu-sm-py-sm { + padding-top: var(--canon-spacing-sm); + padding-bottom: var(--canon-spacing-sm); + } + + .cu-sm-py-xl { + padding-top: var(--canon-spacing-xl); + padding-bottom: var(--canon-spacing-xl); + } + + .cu-sm-py-xs { + padding-top: var(--canon-spacing-xs); + padding-bottom: var(--canon-spacing-xs); + } + + .cu-sm-rounded-2xl { + border-radius: var(--canon-border-radius-2xl); + } + + .cu-sm-rounded-2xs { + border-radius: var(--canon-border-radius-2xs); + } + + .cu-sm-rounded-lg { + border-radius: var(--canon-border-radius-lg); + } + + .cu-sm-rounded-md { + border-radius: var(--canon-border-radius-md); + } + + .cu-sm-rounded-none { + border-radius: 0; + } + + .cu-sm-rounded-sm { + border-radius: var(--canon-border-radius-sm); + } + + .cu-sm-rounded-xl { + border-radius: var(--canon-border-radius-xl); + } + + .cu-sm-rounded-xs { + border-radius: var(--canon-border-radius-xs); + } + + .cu-sm-row-span-1 { + grid-row: span 1 / span 1; + } + + .cu-sm-row-span-10 { + grid-row: span 10 / span 10; + } + + .cu-sm-row-span-11 { + grid-row: span 11 / span 11; + } + + .cu-sm-row-span-12 { + grid-row: span 12 / span 12; + } + + .cu-sm-row-span-2 { + grid-row: span 2 / span 2; + } + + .cu-sm-row-span-3 { + grid-row: span 3 / span 3; + } + + .cu-sm-row-span-4 { + grid-row: span 4 / span 4; + } + + .cu-sm-row-span-5 { + grid-row: span 5 / span 5; + } + + .cu-sm-row-span-6 { + grid-row: span 6 / span 6; + } + + .cu-sm-row-span-7 { + grid-row: span 7 / span 7; + } + + .cu-sm-row-span-8 { + grid-row: span 8 / span 8; + } + + .cu-sm-row-span-9 { + grid-row: span 9 / span 9; + } + + .cu-sm-row-span-auto { + grid-row: span auto / span auto; + } + + .cu-sm-wrap-reverse { + flex-wrap: wrap-reverse; + } + } +} diff --git a/packages/canon/src/css/utilities/xl.css b/packages/canon/src/css/utilities/xl.css new file mode 100644 index 0000000000..7d9e3b8add --- /dev/null +++ b/packages/canon/src/css/utilities/xl.css @@ -0,0 +1,944 @@ +/* + * 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. + */ + +@layer utilities { + @media (min-width: 1280px) { + .cu-xl-block { + display: block; + } + + .cu-xl-border-base { + border-color: var(--canon-border-base); + border-width: 1px; + border-style: solid; + } + + .cu-xl-border-error { + border-color: var(--canon-border-error); + border-width: 1px; + border-style: solid; + } + + .cu-xl-border-none { + border-color: transparent; + border-width: 0; + } + + .cu-xl-border-selected { + border-color: var(--canon-border-selected); + border-width: 1px; + border-style: solid; + } + + .cu-xl-border-warning { + border-color: var(--canon-border-warning); + border-width: 1px; + border-style: solid; + } + + .cu-xl-col-end-1 { + grid-column-end: 1; + } + + .cu-xl-col-end-10 { + grid-column-end: 10; + } + + .cu-xl-col-end-11 { + grid-column-end: 11; + } + + .cu-xl-col-end-12 { + grid-column-end: 12; + } + + .cu-xl-col-end-13 { + grid-column-end: 13; + } + + .cu-xl-col-end-2 { + grid-column-end: 2; + } + + .cu-xl-col-end-3 { + grid-column-end: 3; + } + + .cu-xl-col-end-4 { + grid-column-end: 4; + } + + .cu-xl-col-end-5 { + grid-column-end: 5; + } + + .cu-xl-col-end-6 { + grid-column-end: 6; + } + + .cu-xl-col-end-7 { + grid-column-end: 7; + } + + .cu-xl-col-end-8 { + grid-column-end: 8; + } + + .cu-xl-col-end-9 { + grid-column-end: 9; + } + + .cu-xl-col-end-auto { + grid-column-end: auto; + } + + .cu-xl-col-span-1 { + grid-column: span 1 / span 1; + } + + .cu-xl-col-span-10 { + grid-column: span 10 / span 10; + } + + .cu-xl-col-span-11 { + grid-column: span 11 / span 11; + } + + .cu-xl-col-span-12 { + grid-column: span 12 / span 12; + } + + .cu-xl-col-span-2 { + grid-column: span 2 / span 2; + } + + .cu-xl-col-span-3 { + grid-column: span 3 / span 3; + } + + .cu-xl-col-span-4 { + grid-column: span 4 / span 4; + } + + .cu-xl-col-span-5 { + grid-column: span 5 / span 5; + } + + .cu-xl-col-span-6 { + grid-column: span 6 / span 6; + } + + .cu-xl-col-span-7 { + grid-column: span 7 / span 7; + } + + .cu-xl-col-span-8 { + grid-column: span 8 / span 8; + } + + .cu-xl-col-span-9 { + grid-column: span 9 / span 9; + } + + .cu-xl-col-span-auto { + grid-column: span auto / span auto; + } + + .cu-xl-col-start-1 { + grid-column-start: 1; + } + + .cu-xl-col-start-10 { + grid-column-start: 10; + } + + .cu-xl-col-start-11 { + grid-column-start: 11; + } + + .cu-xl-col-start-12 { + grid-column-start: 12; + } + + .cu-xl-col-start-13 { + grid-column-start: 13; + } + + .cu-xl-col-start-2 { + grid-column-start: 2; + } + + .cu-xl-col-start-3 { + grid-column-start: 3; + } + + .cu-xl-col-start-4 { + grid-column-start: 4; + } + + .cu-xl-col-start-5 { + grid-column-start: 5; + } + + .cu-xl-col-start-6 { + grid-column-start: 6; + } + + .cu-xl-col-start-7 { + grid-column-start: 7; + } + + .cu-xl-col-start-8 { + grid-column-start: 8; + } + + .cu-xl-col-start-9 { + grid-column-start: 9; + } + + .cu-xl-col-start-auto { + grid-column-start: auto; + } + + .cu-xl-flex { + display: flex; + } + + .cu-xl-flex-col { + flex-direction: column; + } + + .cu-xl-flex-nowrap { + flex-wrap: nowrap; + } + + .cu-xl-flex-row { + flex-direction: row; + } + + .cu-xl-flex-wrap { + flex-wrap: wrap; + } + + .cu-xl-flex-wrap-reverse { + flex-wrap: wrap-reverse; + } + + .cu-xl-gap-2xl { + gap: var(--canon-spacing-2xl); + } + + .cu-xl-gap-lg { + gap: var(--canon-spacing-lg); + } + + .cu-xl-gap-md { + gap: var(--canon-spacing-md); + } + + .cu-xl-gap-none { + gap: 0; + } + + .cu-xl-gap-sm { + gap: var(--canon-spacing-sm); + } + + .cu-xl-gap-xl { + gap: var(--canon-spacing-xl); + } + + .cu-xl-gap-xs { + gap: var(--canon-spacing-xs); + } + + .cu-xl-grid { + display: grid; + } + + .cu-xl-grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-10 { + grid-template-columns: repeat(10, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-11 { + grid-template-columns: repeat(11, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-12 { + grid-template-columns: repeat(12, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-6 { + grid-template-columns: repeat(6, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-7 { + grid-template-columns: repeat(7, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-8 { + grid-template-columns: repeat(8, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-9 { + grid-template-columns: repeat(9, minmax(0, 1fr)); + } + + .cu-xl-grid-cols-auto { + grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); + } + + .cu-xl-hidden { + display: none; + } + + .cu-xl-inline { + display: inline; + } + + .cu-xl-inline-block { + display: inline-block; + } + + .cu-xl-items-center { + align-items: center; + } + + .cu-xl-items-end { + align-items: flex-end; + } + + .cu-xl-items-start { + align-items: flex-start; + } + + .cu-xl-items-stretch { + align-items: stretch; + } + + .cu-xl-justify-around { + justify-content: space-around; + } + + .cu-xl-justify-between { + justify-content: space-between; + } + + .cu-xl-justify-center { + justify-content: center; + } + + .cu-xl-justify-end { + justify-content: flex-end; + } + + .cu-xl-justify-start { + justify-content: flex-start; + } + + .cu-xl-justify-stretch { + justify-content: stretch; + } + + .cu-xl-m-2xl { + margin: var(--canon-spacing-2xl); + } + + .cu-xl-m-2xs { + margin: var(--canon-spacing-2xs); + } + + .cu-xl-m-lg { + margin: var(--canon-spacing-lg); + } + + .cu-xl-m-md { + margin: var(--canon-spacing-md); + } + + .cu-xl-m-none { + margin: 0; + } + + .cu-xl-m-sm { + margin: var(--canon-spacing-sm); + } + + .cu-xl-m-xl { + margin: var(--canon-spacing-xl); + } + + .cu-xl-m-xs { + margin: var(--canon-spacing-xs); + } + + .cu-xl-mb-2xl { + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-xl-mb-2xs { + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-xl-mb-lg { + margin-bottom: var(--canon-spacing-lg); + } + + .cu-xl-mb-md { + margin-bottom: var(--canon-spacing-md); + } + + .cu-xl-mb-none { + margin-bottom: 0; + } + + .cu-xl-mb-sm { + margin-bottom: var(--canon-spacing-sm); + } + + .cu-xl-mb-xl { + margin-bottom: var(--canon-spacing-xl); + } + + .cu-xl-mb-xs { + margin-bottom: var(--canon-spacing-xs); + } + + .cu-xl-ml-2xl { + margin-left: var(--canon-spacing-2xl); + } + + .cu-xl-ml-2xs { + margin-left: var(--canon-spacing-2xs); + } + + .cu-xl-ml-lg { + margin-left: var(--canon-spacing-lg); + } + + .cu-xl-ml-md { + margin-left: var(--canon-spacing-md); + } + + .cu-xl-ml-none { + margin-left: 0; + } + + .cu-xl-ml-sm { + margin-left: var(--canon-spacing-sm); + } + + .cu-xl-ml-xl { + margin-left: var(--canon-spacing-xl); + } + + .cu-xl-ml-xs { + margin-left: var(--canon-spacing-xs); + } + + .cu-xl-mr-2xl { + margin-right: var(--canon-spacing-2xl); + } + + .cu-xl-mr-2xs { + margin-right: var(--canon-spacing-2xs); + } + + .cu-xl-mr-lg { + margin-right: var(--canon-spacing-lg); + } + + .cu-xl-mr-md { + margin-right: var(--canon-spacing-md); + } + + .cu-xl-mr-none { + margin-right: 0; + } + + .cu-xl-mr-sm { + margin-right: var(--canon-spacing-sm); + } + + .cu-xl-mr-xl { + margin-right: var(--canon-spacing-xl); + } + + .cu-xl-mr-xs { + margin-right: var(--canon-spacing-xs); + } + + .cu-xl-mt-2xl { + margin-top: var(--canon-spacing-2xl); + } + + .cu-xl-mt-2xs { + margin-top: var(--canon-spacing-2xs); + } + + .cu-xl-mt-lg { + margin-top: var(--canon-spacing-lg); + } + + .cu-xl-mt-md { + margin-top: var(--canon-spacing-md); + } + + .cu-xl-mt-none { + margin-top: 0; + } + + .cu-xl-mt-sm { + margin-top: var(--canon-spacing-sm); + } + + .cu-xl-mt-xl { + margin-top: var(--canon-spacing-xl); + } + + .cu-xl-mt-xs { + margin-top: var(--canon-spacing-xs); + } + + .cu-xl-mx-2xl { + margin-left: var(--canon-spacing-2xl); + margin-right: var(--canon-spacing-2xl); + } + + .cu-xl-mx-2xs { + margin-left: var(--canon-spacing-2xs); + margin-right: var(--canon-spacing-2xs); + } + + .cu-xl-mx-lg { + margin-left: var(--canon-spacing-lg); + margin-right: var(--canon-spacing-lg); + } + + .cu-xl-mx-md { + margin-left: var(--canon-spacing-md); + margin-right: var(--canon-spacing-md); + } + + .cu-xl-mx-none { + margin-left: 0; + margin-right: 0; + } + + .cu-xl-mx-sm { + margin-left: var(--canon-spacing-sm); + margin-right: var(--canon-spacing-sm); + } + + .cu-xl-mx-xl { + margin-left: var(--canon-spacing-xl); + margin-right: var(--canon-spacing-xl); + } + + .cu-xl-mx-xs { + margin-left: var(--canon-spacing-xs); + margin-right: var(--canon-spacing-xs); + } + + .cu-xl-my-2xl { + margin-top: var(--canon-spacing-2xl); + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-xl-my-2xs { + margin-top: var(--canon-spacing-2xs); + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-xl-my-lg { + margin-top: var(--canon-spacing-lg); + margin-bottom: var(--canon-spacing-lg); + } + + .cu-xl-my-md { + margin-top: var(--canon-spacing-md); + margin-bottom: var(--canon-spacing-md); + } + + .cu-xl-my-none { + margin-top: 0; + margin-bottom: 0; + } + + .cu-xl-my-sm { + margin-top: var(--canon-spacing-sm); + margin-bottom: var(--canon-spacing-sm); + } + + .cu-xl-my-xl { + margin-top: var(--canon-spacing-xl); + margin-bottom: var(--canon-spacing-xl); + } + + .cu-xl-my-xs { + margin-top: var(--canon-spacing-xs); + margin-bottom: var(--canon-spacing-xs); + } + + .cu-xl-p-2xl { + padding: var(--canon-spacing-2xl); + } + + .cu-xl-p-2xs { + padding: var(--canon-spacing-2xs); + } + + .cu-xl-p-lg { + padding: var(--canon-spacing-lg); + } + + .cu-xl-p-md { + padding: var(--canon-spacing-md); + } + + .cu-xl-p-none { + padding: 0; + } + + .cu-xl-p-sm { + padding: var(--canon-spacing-sm); + } + + .cu-xl-p-xl { + padding: var(--canon-spacing-xl); + } + + .cu-xl-p-xs { + padding: var(--canon-spacing-xs); + } + + .cu-xl-pb-2xl { + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-xl-pb-2xs { + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-xl-pb-lg { + padding-bottom: var(--canon-spacing-lg); + } + + .cu-xl-pb-md { + padding-bottom: var(--canon-spacing-md); + } + + .cu-xl-pb-none { + padding-bottom: 0; + } + + .cu-xl-pb-sm { + padding-bottom: var(--canon-spacing-sm); + } + + .cu-xl-pb-xl { + padding-bottom: var(--canon-spacing-xl); + } + + .cu-xl-pb-xs { + padding-bottom: var(--canon-spacing-xs); + } + + .cu-xl-pl-2xl { + padding-left: var(--canon-spacing-2xl); + } + + .cu-xl-pl-2xs { + padding-left: var(--canon-spacing-2xs); + } + + .cu-xl-pl-lg { + padding-left: var(--canon-spacing-lg); + } + + .cu-xl-pl-md { + padding-left: var(--canon-spacing-md); + } + + .cu-xl-pl-none { + padding-left: 0; + } + + .cu-xl-pl-sm { + padding-left: var(--canon-spacing-sm); + } + + .cu-xl-pl-xl { + padding-left: var(--canon-spacing-xl); + } + + .cu-xl-pl-xs { + padding-left: var(--canon-spacing-xs); + } + + .cu-xl-pr-2xl { + padding-right: var(--canon-spacing-2xl); + } + + .cu-xl-pr-2xs { + padding-right: var(--canon-spacing-2xs); + } + + .cu-xl-pr-lg { + padding-right: var(--canon-spacing-lg); + } + + .cu-xl-pr-md { + padding-right: var(--canon-spacing-md); + } + + .cu-xl-pr-none { + padding-right: 0; + } + + .cu-xl-pr-sm { + padding-right: var(--canon-spacing-sm); + } + + .cu-xl-pr-xl { + padding-right: var(--canon-spacing-xl); + } + + .cu-xl-pr-xs { + padding-right: var(--canon-spacing-xs); + } + + .cu-xl-pt-2xl { + padding-top: var(--canon-spacing-2xl); + } + + .cu-xl-pt-2xs { + padding-top: var(--canon-spacing-2xs); + } + + .cu-xl-pt-lg { + padding-top: var(--canon-spacing-lg); + } + + .cu-xl-pt-md { + padding-top: var(--canon-spacing-md); + } + + .cu-xl-pt-none { + padding-top: 0; + } + + .cu-xl-pt-sm { + padding-top: var(--canon-spacing-sm); + } + + .cu-xl-pt-xl { + padding-top: var(--canon-spacing-xl); + } + + .cu-xl-pt-xs { + padding-top: var(--canon-spacing-xs); + } + + .cu-xl-px-2xl { + padding-left: var(--canon-spacing-2xl); + padding-right: var(--canon-spacing-2xl); + } + + .cu-xl-px-2xs { + padding-left: var(--canon-spacing-2xs); + padding-right: var(--canon-spacing-2xs); + } + + .cu-xl-px-lg { + padding-left: var(--canon-spacing-lg); + padding-right: var(--canon-spacing-lg); + } + + .cu-xl-px-md { + padding-left: var(--canon-spacing-md); + padding-right: var(--canon-spacing-md); + } + + .cu-xl-px-none { + padding-left: 0; + padding-right: 0; + } + + .cu-xl-px-sm { + padding-left: var(--canon-spacing-sm); + padding-right: var(--canon-spacing-sm); + } + + .cu-xl-px-xl { + padding-left: var(--canon-spacing-xl); + padding-right: var(--canon-spacing-xl); + } + + .cu-xl-px-xs { + padding-left: var(--canon-spacing-xs); + padding-right: var(--canon-spacing-xs); + } + + .cu-xl-py-2xl { + padding-top: var(--canon-spacing-2xl); + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-xl-py-2xs { + padding-top: var(--canon-spacing-2xs); + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-xl-py-lg { + padding-top: var(--canon-spacing-lg); + padding-bottom: var(--canon-spacing-lg); + } + + .cu-xl-py-md { + padding-top: var(--canon-spacing-md); + padding-bottom: var(--canon-spacing-md); + } + + .cu-xl-py-none { + padding-top: 0; + padding-bottom: 0; + } + + .cu-xl-py-sm { + padding-top: var(--canon-spacing-sm); + padding-bottom: var(--canon-spacing-sm); + } + + .cu-xl-py-xl { + padding-top: var(--canon-spacing-xl); + padding-bottom: var(--canon-spacing-xl); + } + + .cu-xl-py-xs { + padding-top: var(--canon-spacing-xs); + padding-bottom: var(--canon-spacing-xs); + } + + .cu-xl-rounded-2xl { + border-radius: var(--canon-border-radius-2xl); + } + + .cu-xl-rounded-2xs { + border-radius: var(--canon-border-radius-2xs); + } + + .cu-xl-rounded-lg { + border-radius: var(--canon-border-radius-lg); + } + + .cu-xl-rounded-md { + border-radius: var(--canon-border-radius-md); + } + + .cu-xl-rounded-none { + border-radius: 0; + } + + .cu-xl-rounded-sm { + border-radius: var(--canon-border-radius-sm); + } + + .cu-xl-rounded-xl { + border-radius: var(--canon-border-radius-xl); + } + + .cu-xl-rounded-xs { + border-radius: var(--canon-border-radius-xs); + } + + .cu-xl-row-span-1 { + grid-row: span 1 / span 1; + } + + .cu-xl-row-span-10 { + grid-row: span 10 / span 10; + } + + .cu-xl-row-span-11 { + grid-row: span 11 / span 11; + } + + .cu-xl-row-span-12 { + grid-row: span 12 / span 12; + } + + .cu-xl-row-span-2 { + grid-row: span 2 / span 2; + } + + .cu-xl-row-span-3 { + grid-row: span 3 / span 3; + } + + .cu-xl-row-span-4 { + grid-row: span 4 / span 4; + } + + .cu-xl-row-span-5 { + grid-row: span 5 / span 5; + } + + .cu-xl-row-span-6 { + grid-row: span 6 / span 6; + } + + .cu-xl-row-span-7 { + grid-row: span 7 / span 7; + } + + .cu-xl-row-span-8 { + grid-row: span 8 / span 8; + } + + .cu-xl-row-span-9 { + grid-row: span 9 / span 9; + } + + .cu-xl-row-span-auto { + grid-row: span auto / span auto; + } + + .cu-xl-wrap-reverse { + flex-wrap: wrap-reverse; + } + } +} diff --git a/packages/canon/src/css/utilities/xs.css b/packages/canon/src/css/utilities/xs.css new file mode 100644 index 0000000000..926a2cc627 --- /dev/null +++ b/packages/canon/src/css/utilities/xs.css @@ -0,0 +1,942 @@ +/* + * 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. + */ + +@layer utilities { + .cu-block { + display: block; + } + + .cu-border-base { + border-color: var(--canon-border-base); + border-width: 1px; + border-style: solid; + } + + .cu-border-error { + border-color: var(--canon-border-error); + border-width: 1px; + border-style: solid; + } + + .cu-border-none { + border-color: transparent; + border-width: 0; + } + + .cu-border-selected { + border-color: var(--canon-border-selected); + border-width: 1px; + border-style: solid; + } + + .cu-border-warning { + border-color: var(--canon-border-warning); + border-width: 1px; + border-style: solid; + } + + .cu-col-end-1 { + grid-column-end: 1; + } + + .cu-col-end-10 { + grid-column-end: 10; + } + + .cu-col-end-11 { + grid-column-end: 11; + } + + .cu-col-end-12 { + grid-column-end: 12; + } + + .cu-col-end-13 { + grid-column-end: 13; + } + + .cu-col-end-2 { + grid-column-end: 2; + } + + .cu-col-end-3 { + grid-column-end: 3; + } + + .cu-col-end-4 { + grid-column-end: 4; + } + + .cu-col-end-5 { + grid-column-end: 5; + } + + .cu-col-end-6 { + grid-column-end: 6; + } + + .cu-col-end-7 { + grid-column-end: 7; + } + + .cu-col-end-8 { + grid-column-end: 8; + } + + .cu-col-end-9 { + grid-column-end: 9; + } + + .cu-col-end-auto { + grid-column-end: auto; + } + + .cu-col-span-1 { + grid-column: span 1 / span 1; + } + + .cu-col-span-10 { + grid-column: span 10 / span 10; + } + + .cu-col-span-11 { + grid-column: span 11 / span 11; + } + + .cu-col-span-12 { + grid-column: span 12 / span 12; + } + + .cu-col-span-2 { + grid-column: span 2 / span 2; + } + + .cu-col-span-3 { + grid-column: span 3 / span 3; + } + + .cu-col-span-4 { + grid-column: span 4 / span 4; + } + + .cu-col-span-5 { + grid-column: span 5 / span 5; + } + + .cu-col-span-6 { + grid-column: span 6 / span 6; + } + + .cu-col-span-7 { + grid-column: span 7 / span 7; + } + + .cu-col-span-8 { + grid-column: span 8 / span 8; + } + + .cu-col-span-9 { + grid-column: span 9 / span 9; + } + + .cu-col-span-auto { + grid-column: span auto / span auto; + } + + .cu-col-start-1 { + grid-column-start: 1; + } + + .cu-col-start-10 { + grid-column-start: 10; + } + + .cu-col-start-11 { + grid-column-start: 11; + } + + .cu-col-start-12 { + grid-column-start: 12; + } + + .cu-col-start-13 { + grid-column-start: 13; + } + + .cu-col-start-2 { + grid-column-start: 2; + } + + .cu-col-start-3 { + grid-column-start: 3; + } + + .cu-col-start-4 { + grid-column-start: 4; + } + + .cu-col-start-5 { + grid-column-start: 5; + } + + .cu-col-start-6 { + grid-column-start: 6; + } + + .cu-col-start-7 { + grid-column-start: 7; + } + + .cu-col-start-8 { + grid-column-start: 8; + } + + .cu-col-start-9 { + grid-column-start: 9; + } + + .cu-col-start-auto { + grid-column-start: auto; + } + + .cu-flex { + display: flex; + } + + .cu-flex-col { + flex-direction: column; + } + + .cu-flex-nowrap { + flex-wrap: nowrap; + } + + .cu-flex-row { + flex-direction: row; + } + + .cu-flex-wrap { + flex-wrap: wrap; + } + + .cu-flex-wrap-reverse { + flex-wrap: wrap-reverse; + } + + .cu-gap-2xl { + gap: var(--canon-spacing-2xl); + } + + .cu-gap-lg { + gap: var(--canon-spacing-lg); + } + + .cu-gap-md { + gap: var(--canon-spacing-md); + } + + .cu-gap-none { + gap: 0; + } + + .cu-gap-sm { + gap: var(--canon-spacing-sm); + } + + .cu-gap-xl { + gap: var(--canon-spacing-xl); + } + + .cu-gap-xs { + gap: var(--canon-spacing-xs); + } + + .cu-grid { + display: grid; + } + + .cu-grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); + } + + .cu-grid-cols-10 { + grid-template-columns: repeat(10, minmax(0, 1fr)); + } + + .cu-grid-cols-11 { + grid-template-columns: repeat(11, minmax(0, 1fr)); + } + + .cu-grid-cols-12 { + grid-template-columns: repeat(12, minmax(0, 1fr)); + } + + .cu-grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .cu-grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .cu-grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .cu-grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } + + .cu-grid-cols-6 { + grid-template-columns: repeat(6, minmax(0, 1fr)); + } + + .cu-grid-cols-7 { + grid-template-columns: repeat(7, minmax(0, 1fr)); + } + + .cu-grid-cols-8 { + grid-template-columns: repeat(8, minmax(0, 1fr)); + } + + .cu-grid-cols-9 { + grid-template-columns: repeat(9, minmax(0, 1fr)); + } + + .cu-grid-cols-auto { + grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); + } + + .cu-hidden { + display: none; + } + + .cu-inline { + display: inline; + } + + .cu-inline-block { + display: inline-block; + } + + .cu-items-center { + align-items: center; + } + + .cu-items-end { + align-items: flex-end; + } + + .cu-items-start { + align-items: flex-start; + } + + .cu-items-stretch { + align-items: stretch; + } + + .cu-justify-around { + justify-content: space-around; + } + + .cu-justify-between { + justify-content: space-between; + } + + .cu-justify-center { + justify-content: center; + } + + .cu-justify-end { + justify-content: flex-end; + } + + .cu-justify-start { + justify-content: flex-start; + } + + .cu-justify-stretch { + justify-content: stretch; + } + + .cu-m-2xl { + margin: var(--canon-spacing-2xl); + } + + .cu-m-2xs { + margin: var(--canon-spacing-2xs); + } + + .cu-m-lg { + margin: var(--canon-spacing-lg); + } + + .cu-m-md { + margin: var(--canon-spacing-md); + } + + .cu-m-none { + margin: 0; + } + + .cu-m-sm { + margin: var(--canon-spacing-sm); + } + + .cu-m-xl { + margin: var(--canon-spacing-xl); + } + + .cu-m-xs { + margin: var(--canon-spacing-xs); + } + + .cu-mb-2xl { + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-mb-2xs { + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-mb-lg { + margin-bottom: var(--canon-spacing-lg); + } + + .cu-mb-md { + margin-bottom: var(--canon-spacing-md); + } + + .cu-mb-none { + margin-bottom: 0; + } + + .cu-mb-sm { + margin-bottom: var(--canon-spacing-sm); + } + + .cu-mb-xl { + margin-bottom: var(--canon-spacing-xl); + } + + .cu-mb-xs { + margin-bottom: var(--canon-spacing-xs); + } + + .cu-ml-2xl { + margin-left: var(--canon-spacing-2xl); + } + + .cu-ml-2xs { + margin-left: var(--canon-spacing-2xs); + } + + .cu-ml-lg { + margin-left: var(--canon-spacing-lg); + } + + .cu-ml-md { + margin-left: var(--canon-spacing-md); + } + + .cu-ml-none { + margin-left: 0; + } + + .cu-ml-sm { + margin-left: var(--canon-spacing-sm); + } + + .cu-ml-xl { + margin-left: var(--canon-spacing-xl); + } + + .cu-ml-xs { + margin-left: var(--canon-spacing-xs); + } + + .cu-mr-2xl { + margin-right: var(--canon-spacing-2xl); + } + + .cu-mr-2xs { + margin-right: var(--canon-spacing-2xs); + } + + .cu-mr-lg { + margin-right: var(--canon-spacing-lg); + } + + .cu-mr-md { + margin-right: var(--canon-spacing-md); + } + + .cu-mr-none { + margin-right: 0; + } + + .cu-mr-sm { + margin-right: var(--canon-spacing-sm); + } + + .cu-mr-xl { + margin-right: var(--canon-spacing-xl); + } + + .cu-mr-xs { + margin-right: var(--canon-spacing-xs); + } + + .cu-mt-2xl { + margin-top: var(--canon-spacing-2xl); + } + + .cu-mt-2xs { + margin-top: var(--canon-spacing-2xs); + } + + .cu-mt-lg { + margin-top: var(--canon-spacing-lg); + } + + .cu-mt-md { + margin-top: var(--canon-spacing-md); + } + + .cu-mt-none { + margin-top: 0; + } + + .cu-mt-sm { + margin-top: var(--canon-spacing-sm); + } + + .cu-mt-xl { + margin-top: var(--canon-spacing-xl); + } + + .cu-mt-xs { + margin-top: var(--canon-spacing-xs); + } + + .cu-mx-2xl { + margin-left: var(--canon-spacing-2xl); + margin-right: var(--canon-spacing-2xl); + } + + .cu-mx-2xs { + margin-left: var(--canon-spacing-2xs); + margin-right: var(--canon-spacing-2xs); + } + + .cu-mx-lg { + margin-left: var(--canon-spacing-lg); + margin-right: var(--canon-spacing-lg); + } + + .cu-mx-md { + margin-left: var(--canon-spacing-md); + margin-right: var(--canon-spacing-md); + } + + .cu-mx-none { + margin-left: 0; + margin-right: 0; + } + + .cu-mx-sm { + margin-left: var(--canon-spacing-sm); + margin-right: var(--canon-spacing-sm); + } + + .cu-mx-xl { + margin-left: var(--canon-spacing-xl); + margin-right: var(--canon-spacing-xl); + } + + .cu-mx-xs { + margin-left: var(--canon-spacing-xs); + margin-right: var(--canon-spacing-xs); + } + + .cu-my-2xl { + margin-top: var(--canon-spacing-2xl); + margin-bottom: var(--canon-spacing-2xl); + } + + .cu-my-2xs { + margin-top: var(--canon-spacing-2xs); + margin-bottom: var(--canon-spacing-2xs); + } + + .cu-my-lg { + margin-top: var(--canon-spacing-lg); + margin-bottom: var(--canon-spacing-lg); + } + + .cu-my-md { + margin-top: var(--canon-spacing-md); + margin-bottom: var(--canon-spacing-md); + } + + .cu-my-none { + margin-top: 0; + margin-bottom: 0; + } + + .cu-my-sm { + margin-top: var(--canon-spacing-sm); + margin-bottom: var(--canon-spacing-sm); + } + + .cu-my-xl { + margin-top: var(--canon-spacing-xl); + margin-bottom: var(--canon-spacing-xl); + } + + .cu-my-xs { + margin-top: var(--canon-spacing-xs); + margin-bottom: var(--canon-spacing-xs); + } + + .cu-p-2xl { + padding: var(--canon-spacing-2xl); + } + + .cu-p-2xs { + padding: var(--canon-spacing-2xs); + } + + .cu-p-lg { + padding: var(--canon-spacing-lg); + } + + .cu-p-md { + padding: var(--canon-spacing-md); + } + + .cu-p-none { + padding: 0; + } + + .cu-p-sm { + padding: var(--canon-spacing-sm); + } + + .cu-p-xl { + padding: var(--canon-spacing-xl); + } + + .cu-p-xs { + padding: var(--canon-spacing-xs); + } + + .cu-pb-2xl { + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-pb-2xs { + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-pb-lg { + padding-bottom: var(--canon-spacing-lg); + } + + .cu-pb-md { + padding-bottom: var(--canon-spacing-md); + } + + .cu-pb-none { + padding-bottom: 0; + } + + .cu-pb-sm { + padding-bottom: var(--canon-spacing-sm); + } + + .cu-pb-xl { + padding-bottom: var(--canon-spacing-xl); + } + + .cu-pb-xs { + padding-bottom: var(--canon-spacing-xs); + } + + .cu-pl-2xl { + padding-left: var(--canon-spacing-2xl); + } + + .cu-pl-2xs { + padding-left: var(--canon-spacing-2xs); + } + + .cu-pl-lg { + padding-left: var(--canon-spacing-lg); + } + + .cu-pl-md { + padding-left: var(--canon-spacing-md); + } + + .cu-pl-none { + padding-left: 0; + } + + .cu-pl-sm { + padding-left: var(--canon-spacing-sm); + } + + .cu-pl-xl { + padding-left: var(--canon-spacing-xl); + } + + .cu-pl-xs { + padding-left: var(--canon-spacing-xs); + } + + .cu-pr-2xl { + padding-right: var(--canon-spacing-2xl); + } + + .cu-pr-2xs { + padding-right: var(--canon-spacing-2xs); + } + + .cu-pr-lg { + padding-right: var(--canon-spacing-lg); + } + + .cu-pr-md { + padding-right: var(--canon-spacing-md); + } + + .cu-pr-none { + padding-right: 0; + } + + .cu-pr-sm { + padding-right: var(--canon-spacing-sm); + } + + .cu-pr-xl { + padding-right: var(--canon-spacing-xl); + } + + .cu-pr-xs { + padding-right: var(--canon-spacing-xs); + } + + .cu-pt-2xl { + padding-top: var(--canon-spacing-2xl); + } + + .cu-pt-2xs { + padding-top: var(--canon-spacing-2xs); + } + + .cu-pt-lg { + padding-top: var(--canon-spacing-lg); + } + + .cu-pt-md { + padding-top: var(--canon-spacing-md); + } + + .cu-pt-none { + padding-top: 0; + } + + .cu-pt-sm { + padding-top: var(--canon-spacing-sm); + } + + .cu-pt-xl { + padding-top: var(--canon-spacing-xl); + } + + .cu-pt-xs { + padding-top: var(--canon-spacing-xs); + } + + .cu-px-2xl { + padding-left: var(--canon-spacing-2xl); + padding-right: var(--canon-spacing-2xl); + } + + .cu-px-2xs { + padding-left: var(--canon-spacing-2xs); + padding-right: var(--canon-spacing-2xs); + } + + .cu-px-lg { + padding-left: var(--canon-spacing-lg); + padding-right: var(--canon-spacing-lg); + } + + .cu-px-md { + padding-left: var(--canon-spacing-md); + padding-right: var(--canon-spacing-md); + } + + .cu-px-none { + padding-left: 0; + padding-right: 0; + } + + .cu-px-sm { + padding-left: var(--canon-spacing-sm); + padding-right: var(--canon-spacing-sm); + } + + .cu-px-xl { + padding-left: var(--canon-spacing-xl); + padding-right: var(--canon-spacing-xl); + } + + .cu-px-xs { + padding-left: var(--canon-spacing-xs); + padding-right: var(--canon-spacing-xs); + } + + .cu-py-2xl { + padding-top: var(--canon-spacing-2xl); + padding-bottom: var(--canon-spacing-2xl); + } + + .cu-py-2xs { + padding-top: var(--canon-spacing-2xs); + padding-bottom: var(--canon-spacing-2xs); + } + + .cu-py-lg { + padding-top: var(--canon-spacing-lg); + padding-bottom: var(--canon-spacing-lg); + } + + .cu-py-md { + padding-top: var(--canon-spacing-md); + padding-bottom: var(--canon-spacing-md); + } + + .cu-py-none { + padding-top: 0; + padding-bottom: 0; + } + + .cu-py-sm { + padding-top: var(--canon-spacing-sm); + padding-bottom: var(--canon-spacing-sm); + } + + .cu-py-xl { + padding-top: var(--canon-spacing-xl); + padding-bottom: var(--canon-spacing-xl); + } + + .cu-py-xs { + padding-top: var(--canon-spacing-xs); + padding-bottom: var(--canon-spacing-xs); + } + + .cu-rounded-2xl { + border-radius: var(--canon-border-radius-2xl); + } + + .cu-rounded-2xs { + border-radius: var(--canon-border-radius-2xs); + } + + .cu-rounded-lg { + border-radius: var(--canon-border-radius-lg); + } + + .cu-rounded-md { + border-radius: var(--canon-border-radius-md); + } + + .cu-rounded-none { + border-radius: 0; + } + + .cu-rounded-sm { + border-radius: var(--canon-border-radius-sm); + } + + .cu-rounded-xl { + border-radius: var(--canon-border-radius-xl); + } + + .cu-rounded-xs { + border-radius: var(--canon-border-radius-xs); + } + + .cu-row-span-1 { + grid-row: span 1 / span 1; + } + + .cu-row-span-10 { + grid-row: span 10 / span 10; + } + + .cu-row-span-11 { + grid-row: span 11 / span 11; + } + + .cu-row-span-12 { + grid-row: span 12 / span 12; + } + + .cu-row-span-2 { + grid-row: span 2 / span 2; + } + + .cu-row-span-3 { + grid-row: span 3 / span 3; + } + + .cu-row-span-4 { + grid-row: span 4 / span 4; + } + + .cu-row-span-5 { + grid-row: span 5 / span 5; + } + + .cu-row-span-6 { + grid-row: span 6 / span 6; + } + + .cu-row-span-7 { + grid-row: span 7 / span 7; + } + + .cu-row-span-8 { + grid-row: span 8 / span 8; + } + + .cu-row-span-9 { + grid-row: span 9 / span 9; + } + + .cu-row-span-auto { + grid-row: span auto / span auto; + } + + .cu-wrap-reverse { + flex-wrap: wrap-reverse; + } +} diff --git a/packages/canon/src/hooks/useIsomorphicLayoutEffect.ts b/packages/canon/src/hooks/useIsomorphicLayoutEffect.ts new file mode 100644 index 0000000000..25ea45124e --- /dev/null +++ b/packages/canon/src/hooks/useIsomorphicLayoutEffect.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. + */ +import { useEffect, useLayoutEffect } from 'react'; + +export const useIsomorphicLayoutEffect = + typeof window !== 'undefined' ? useLayoutEffect : useEffect; diff --git a/packages/canon/src/hooks/useMediaQuery.ts b/packages/canon/src/hooks/useMediaQuery.ts new file mode 100644 index 0000000000..9e2cc9ef0b --- /dev/null +++ b/packages/canon/src/hooks/useMediaQuery.ts @@ -0,0 +1,76 @@ +/* + * 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 { useState } from 'react'; + +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; + +type UseMediaQueryOptions = { + defaultValue?: boolean; + initializeWithValue?: boolean; +}; + +const IS_SERVER = typeof window === 'undefined'; + +export function useMediaQuery( + query: string, + { + defaultValue = false, + initializeWithValue = true, + }: UseMediaQueryOptions = {}, +): boolean { + const getMatches = (query: string): boolean => { + if (IS_SERVER) { + return defaultValue; + } + return window.matchMedia(query).matches; + }; + + const [matches, setMatches] = useState(() => { + if (initializeWithValue) { + return getMatches(query); + } + return defaultValue; + }); + + // Handles the change event of the media query. + function handleChange() { + setMatches(getMatches(query)); + } + + useIsomorphicLayoutEffect(() => { + const matchMedia = window.matchMedia(query); + + // Triggered at the first client-side load and if query changes + handleChange(); + + // Use deprecated `addListener` and `removeListener` to support Safari < 14 (#135) + if (matchMedia.addListener) { + matchMedia.addListener(handleChange); + } else { + matchMedia.addEventListener('change', handleChange); + } + + return () => { + if (matchMedia.removeListener) { + matchMedia.removeListener(handleChange); + } else { + matchMedia.removeEventListener('change', handleChange); + } + }; + }, [query]); + + return matches; +} diff --git a/packages/canon/src/index.ts b/packages/canon/src/index.ts index 198a626f06..f6cca4bed6 100644 --- a/packages/canon/src/index.ts +++ b/packages/canon/src/index.ts @@ -20,7 +20,23 @@ * @packageDocumentation */ -export * from './components/Button'; +// Providers +export * from './contexts/canon'; + +// Layout components export * from './components/Box'; +export * from './components/Grid'; +export * from './components/Stack'; +export * from './components/Inline'; +export * from './components/Container'; +export * from './components/Text'; +export * from './components/Heading'; + +// UI components +export * from './components/Button'; export * from './components/Icon'; -export * from './layout/types'; +export * from './components/Checkbox'; +export * from './components/Table'; + +// Types +export * from './types'; diff --git a/packages/canon/src/layout/properties.ts b/packages/canon/src/layout/properties.ts deleted file mode 100644 index 37cb53666c..0000000000 --- a/packages/canon/src/layout/properties.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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, - xxs: 'var(--canon-space-xxs)', - xs: 'var(--canon-space-xs)', - sm: 'var(--canon-space-sm)', - md: 'var(--canon-space-md)', - lg: 'var(--canon-space-lg)', - xl: 'var(--canon-space-xl)', - xxl: 'var(--canon-space-xxl)', -}; diff --git a/packages/canon/src/layout/sprinkles.css.ts b/packages/canon/src/layout/sprinkles.css.ts deleted file mode 100644 index 7e85487fe3..0000000000 --- a/packages/canon/src/layout/sprinkles.css.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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 deleted file mode 100644 index c051dacb44..0000000000 --- a/packages/canon/src/layout/types.ts +++ /dev/null @@ -1,131 +0,0 @@ -/* - * 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 deleted file mode 100644 index 77f43927f2..0000000000 --- a/packages/canon/src/theme/context.tsx +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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/theme.css b/packages/canon/src/theme/theme.css deleted file mode 100644 index 7a7f440252..0000000000 --- a/packages/canon/src/theme/theme.css +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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 { - --canon-accent: #1ed760; - --canon-background: #f8f8f8; - --canon-surface-1: #fff; - --canon-surface-2: #f4f4f4; - --canon-outline: #666; - --canon-outline-focus: #ccc; - --canon-error: #f50000; - --canon-text-primary: #000; - --canon-text-secondary: #646464; - --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); - - --canon-font-sans: 'Geist', serif; - --canon-font-monospace: 'Monospace', monospace; - --canon-font-emoji: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', - 'Noto Color Emoji'; - - --canon-space-unit: 1em; - --canon-space-xxs: calc(0.25 * var(--canon-space-unit)); - --canon-space-xs: calc(0.5 * var(--canon-space-unit)); - --canon-space-sm: calc(0.75 * var(--canon-space-unit)); - --canon-space-md: calc(1.25 * var(--canon-space-unit)); - --canon-space-lg: calc(2 * var(--canon-space-unit)); - --canon-space-xl: calc(3.25 * var(--canon-space-unit)); - --canon-space-xxl: calc(5.25 * var(--canon-space-unit)); -} - -/* Dark theme */ -[data-theme='dark'] { - --canon-accent: #1ed760; - --canon-background: #000; - --canon-surface-1: #121212; - --canon-surface-2: #292929; - --canon-outline: #666; - --canon-outline-focus: #ccc; - --canon-text-primary: #f0f0f0; - --canon-text-secondary: #666; -} diff --git a/packages/canon/src/types.ts b/packages/canon/src/types.ts new file mode 100644 index 0000000000..1211b1be4d --- /dev/null +++ b/packages/canon/src/types.ts @@ -0,0 +1,113 @@ +/* + * 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 AsProps = + | 'div' + | 'span' + | 'p' + | 'article' + | 'section' + | 'main' + | 'nav' + | 'aside' + | 'ul' + | 'ol' + | 'li' + | 'details' + | 'summary' + | 'dd' + | 'dl' + | 'dt'; + +/** @public */ +export type Breakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'; + +/** @public */ +export type Space = 'none' | '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'; + +/** @public */ +export type Display = 'none' | 'flex' | 'block' | 'inline'; + +/** @public */ +export type FlexDirection = 'row' | 'column'; + +/** @public */ +export type FlexWrap = 'wrap' | 'nowrap' | 'wrap-reverse'; + +/** @public */ +export type JustifyContent = + | 'stretch' + | 'start' + | 'center' + | 'end' + | 'around' + | 'between'; + +/** @public */ +export type AlignItems = 'stretch' | 'start' | 'center' | 'end'; + +/** @public */ +export type BorderRadius = + | 'none' + | '2xs' + | 'xs' + | 'sm' + | 'md' + | 'lg' + | 'xl' + | '2xl'; + +/** @public */ +export type Border = 'none' | 'base' | 'error' | 'warning' | 'selected'; + +/** @public */ +export type Columns = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 'auto'; + +/** @public */ +export interface SpaceProps { + margin?: Space | Partial>; + marginBottom?: Space | Partial>; + marginLeft?: Space | Partial>; + marginRight?: Space | Partial>; + marginTop?: Space | Partial>; + marginX?: Space | Partial>; + marginY?: Space | Partial>; + padding?: Space | Partial>; + paddingBottom?: Space | Partial>; + paddingLeft?: Space | Partial>; + paddingRight?: Space | Partial>; + paddingTop?: Space | Partial>; + paddingX?: Space | Partial>; + paddingY?: Space | Partial>; +} + +/** @public */ +export interface UtilityProps extends SpaceProps { + alignItems?: AlignItems | Partial>; + border?: Border | Partial>; + borderRadius?: BorderRadius | Partial>; + colEnd?: Columns | 'auto' | Partial>; + colSpan?: Columns | 'full' | Partial>; + colStart?: Columns | 'auto' | Partial>; + columns?: Columns | Partial>; + display?: Display | Partial>; + flexDirection?: FlexDirection | Partial>; + flexWrap?: FlexWrap | Partial>; + gap?: Space | Partial>; + justifyContent?: JustifyContent | Partial>; + rowSpan?: Columns | 'full' | Partial>; +} diff --git a/packages/canon/src/utils/getClassNames.ts b/packages/canon/src/utils/getClassNames.ts new file mode 100644 index 0000000000..684e633027 --- /dev/null +++ b/packages/canon/src/utils/getClassNames.ts @@ -0,0 +1,206 @@ +/* + * 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 type { Breakpoint, UtilityProps } from '../types'; + +const spaceMap = (type: string) => ({ + none: `${type}-none`, + '2xs': `${type}-2xs`, + xs: `${type}-xs`, + sm: `${type}-sm`, + md: `${type}-md`, + lg: `${type}-lg`, + xl: `${type}-xl`, + '2xl': `${type}-2xl`, +}); + +const valueMap: Record> = { + alignItems: { + stretch: 'items-stretch', + start: 'items-start', + center: 'items-center', + end: 'items-end', + }, + border: { + none: 'border-none', + base: 'border-base', + error: 'border-error', + warning: 'border-warning', + selected: 'border-selected', + }, + borderRadius: { + none: 'rounded-none', + '2xs': 'rounded-2xs', + xs: 'rounded-xs', + sm: 'rounded-sm', + md: 'rounded-md', + lg: 'rounded-lg', + xl: 'rounded-xl', + '2xl': 'rounded-2xl', + }, + colEnd: { + 1: 'col-end-1', + 2: 'col-end-2', + 3: 'col-end-3', + 4: 'col-end-4', + 5: 'col-end-5', + 6: 'col-end-6', + 7: 'col-end-7', + 8: 'col-end-8', + 9: 'col-end-9', + 10: 'col-end-10', + 11: 'col-end-11', + 12: 'col-end-12', + auto: 'col-end-auto', + }, + colSpan: { + 1: 'col-span-1', + 2: 'col-span-2', + 3: 'col-span-3', + 4: 'col-span-4', + 5: 'col-span-5', + 6: 'col-span-6', + 7: 'col-span-7', + 8: 'col-span-8', + 9: 'col-span-9', + 10: 'col-span-10', + 11: 'col-span-11', + 12: 'col-span-12', + auto: 'col-span-auto', + }, + colStart: { + 1: 'col-start-1', + 2: 'col-start-2', + 3: 'col-start-3', + 4: 'col-start-4', + 5: 'col-start-5', + 6: 'col-start-6', + 7: 'col-start-7', + 8: 'col-start-8', + 9: 'col-start-9', + 10: 'col-start-10', + 11: 'col-start-11', + 12: 'col-start-12', + auto: 'col-start-auto', + }, + columns: { + 1: 'grid-cols-1', + 2: 'grid-cols-2', + 3: 'grid-cols-3', + 4: 'grid-cols-4', + 5: 'grid-cols-5', + 6: 'grid-cols-6', + 7: 'grid-cols-7', + 8: 'grid-cols-8', + 9: 'grid-cols-9', + 10: 'grid-cols-10', + 11: 'grid-cols-11', + 12: 'grid-cols-12', + auto: 'grid-cols-auto', + }, + display: { + none: 'hidden', + flex: 'flex', + block: 'block', + inline: 'inline', + }, + flexDirection: { + row: 'flex-row', + column: 'flex-col', + }, + flexWrap: { + wrap: 'flex-wrap', + nowrap: 'flex-nowrap', + 'wrap-reverse': 'flex-wrap-reverse', + }, + gap: spaceMap('gap'), + justifyContent: { + stretch: 'justify-stretch', + start: 'justify-start', + center: 'justify-center', + end: 'justify-end', + around: 'justify-around', + between: 'justify-between', + }, + margin: spaceMap('m'), + marginBottom: spaceMap('mb'), + marginLeft: spaceMap('ml'), + marginRight: spaceMap('mr'), + marginTop: spaceMap('mt'), + marginX: spaceMap('mx'), + marginY: spaceMap('my'), + padding: spaceMap('p'), + paddingBottom: spaceMap('pb'), + paddingLeft: spaceMap('pl'), + paddingRight: spaceMap('pr'), + paddingTop: spaceMap('pt'), + paddingX: spaceMap('px'), + paddingY: spaceMap('py'), + rowSpan: { + 1: 'row-span-1', + 2: 'row-span-2', + 3: 'row-span-3', + 4: 'row-span-4', + 5: 'row-span-5', + 6: 'row-span-6', + 7: 'row-span-7', + 8: 'row-span-8', + 9: 'row-span-9', + 10: 'row-span-10', + 11: 'row-span-11', + 12: 'row-span-12', + full: 'row-span-full', + }, +}; + +const generateClassNames = (propName: string, propValue: any) => { + const classNames: string[] = []; + + // If the property name is not in the valueMap, return an empty array + if (!valueMap.hasOwnProperty(propName)) { + return classNames; + } + + if (typeof propValue === 'string' || typeof propValue === 'number') { + // If the property value is a string, map it to the valueMap + const value = valueMap[propName]?.[propValue] || propValue; + classNames.push(`cu-${value}`); + } else if (typeof propValue === 'object') { + // If the property value is an object, map each key-value pair + Object.entries(propValue as Record).forEach( + ([breakpoint, value]) => { + const mappedValue = valueMap[propName]?.[value] || value; + + if (breakpoint === 'xs') { + classNames.push(`cu-${mappedValue}`); + } else { + classNames.push(`cu-${breakpoint}-${mappedValue}`); + } + }, + ); + } + return classNames; +}; + +export const getClassNames = (props: UtilityProps) => { + const classNames: string[] = []; + + Object.entries(props).forEach(([propName, propValue]) => { + classNames.push(...generateClassNames(propName, propValue)); + }); + + return classNames.filter(Boolean).join(' '); +}; diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index cdf5e80818..96c511d97e 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/catalog-client +## 1.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + +## 1.9.0 + +### Minor Changes + +- 384e494: Internal updates to generated code. + +### Patch Changes + +- d7e7836: Fixed a bug in the `queryEntities` method where errors were not being handled properly. +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + +## 1.9.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + ## 1.9.0-next.1 ### Minor Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index db66b541c7..4dbd595089 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/catalog-client", - "version": "1.9.0-next.1", + "version": "1.9.1-next.0", "description": "An isomorphic client for the catalog backend", "backstage": { "role": "common-library" diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md index b9e7addea6..a8447c64fe 100644 --- a/packages/catalog-model/CHANGELOG.md +++ b/packages/catalog-model/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/catalog-model +## 1.7.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/errors@1.2.7-next.0 + +## 1.7.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 1.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + ## 1.7.1 ### Patch Changes diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index 61a3159ed2..0e14357671 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/catalog-model", - "version": "1.7.1", + "version": "1.7.3-next.0", "description": "Types and validators that help describe the model of a Backstage Catalog", "backstage": { "role": "common-library" diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md index 5cbe2cb6e2..a2f6104715 100644 --- a/packages/cli-node/CHANGELOG.md +++ b/packages/cli-node/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/cli-node +## 0.2.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/cli-common@0.1.15 + +## 0.2.11 + +### Patch Changes + +- af665ea: add PackageManager and Lockfile interfaces for future use +- cbfc69e: Internal refactor +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/types@1.2.0 + +## 0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/types@1.2.0 + ## 0.2.11-next.0 ### Patch Changes diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index 01538d2e61..38e2fcd285 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-node", - "version": "0.2.11-next.0", + "version": "0.2.12-next.0", "description": "Node.js library for Backstage CLIs", "backstage": { "role": "node-library" diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 5fae59d357..f2396cdd3b 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,86 @@ # @backstage/cli +## 0.29.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/cli-node@0.2.12-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/release-manifests@0.0.12 + - @backstage/cli-common@0.1.15 + - @backstage/eslint-plugin@0.1.10 + - @backstage/integration@1.16.1-next.0 + +## 0.29.5-next.0 + +### Patch Changes + +- e937ce0: Fixed incompatible `@typescript-eslint` versions with current `eslint@8.x.x` +- Updated dependencies + - @backstage/config-loader@1.9.5-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.11 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/eslint-plugin@0.1.10 + - @backstage/integration@1.16.0 + - @backstage/release-manifests@0.0.12 + - @backstage/types@1.2.0 + +## 0.29.4 + +### 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 +- 3c3a7e6: Revert `css-loader@v7` bump +- 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. +- 62a9062: Updated dependency `@module-federation/enhanced` to `^0.8.0`. +- 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. +- a49030a: Add support for `--output-file` option from ESLint to `package lint` and `repo lint` commands. +- 96331fa: Enhance the behavior of the experimental support for module federation in the backstage CLI, + by using the `package.json` exports (when present) to complete the list of exposed modules. + This allows, for example, using exported `alpha` definitions through module federation. +- 5c9cc05: Use native fetch instead of node-fetch +- dcd99d2: added experimental RSPack support for build command in the repo scope +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/release-manifests@0.0.12 + - @backstage/cli-node@0.2.11 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/eslint-plugin@0.1.10 + - @backstage/types@1.2.0 + +## 0.29.3-next.2 + +### Patch Changes + +- 62a9062: Updated dependency `@module-federation/enhanced` to `^0.8.0`. +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/eslint-plugin@0.1.10 + - @backstage/integration@1.16.0-next.1 + - @backstage/release-manifests@0.0.12-next.1 + - @backstage/types@1.2.0 + ## 0.29.3-next.1 ### Patch Changes diff --git a/packages/cli/config/nodeTransform.cjs b/packages/cli/config/nodeTransform.cjs index fc25044fd0..1cf79cb1bb 100644 --- a/packages/cli/config/nodeTransform.cjs +++ b/packages/cli/config/nodeTransform.cjs @@ -41,7 +41,7 @@ if (process.env.BACKSTAGE_CLI_LINKED_WORKSPACE) { } // The package import that we're overriding will always existing in the root - // node_modules of the linked workspace, so it's enough to override the the + // node_modules of the linked workspace, so it's enough to override the // parent paths with that single entry return origLoad.call(this, request, { ...parent, diff --git a/packages/cli/package.json b/packages/cli/package.json index bb338388a3..ce936223a3 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.29.3-next.1", + "version": "0.29.5-next.1", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" @@ -53,7 +53,7 @@ "@backstage/release-manifests": "workspace:^", "@backstage/types": "workspace:^", "@manypkg/get-packages": "^1.1.3", - "@module-federation/enhanced": "^0.7.0", + "@module-federation/enhanced": "^0.8.0", "@octokit/graphql": "^5.0.0", "@octokit/graphql-schema": "^13.7.0", "@octokit/oauth-app": "^4.2.0", @@ -77,8 +77,8 @@ "@swc/jest": "^0.2.22", "@types/jest": "^29.5.11", "@types/webpack-env": "^1.15.2", - "@typescript-eslint/eslint-plugin": "^6.12.0", - "@typescript-eslint/parser": "^6.7.2", + "@typescript-eslint/eslint-plugin": "^8.17.0", + "@typescript-eslint/parser": "^8.16.0", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "^3.0.0", "bfj": "^8.0.0", @@ -88,21 +88,21 @@ "commander": "^12.0.0", "cross-fetch": "^4.0.0", "cross-spawn": "^7.0.3", - "css-loader": "^7.0.0", + "css-loader": "^6.5.1", "ctrlc-windows": "^2.1.0", "esbuild": "^0.24.0", "esbuild-loader": "^4.0.0", "eslint": "^8.6.0", "eslint-config-prettier": "^9.0.0", "eslint-formatter-friendly": "^7.0.0", - "eslint-plugin-deprecation": "^2.0.0", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-jest": "^28.0.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-unused-imports": "^3.0.0", - "eslint-webpack-plugin": "^4.0.0", + "eslint-plugin-deprecation": "^3.0.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jest": "^28.9.0", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-unused-imports": "^4.1.4", + "eslint-webpack-plugin": "^4.2.0", "express": "^4.17.1", "fork-ts-checker-webpack-plugin": "^9.0.0", "fs-extra": "^11.2.0", diff --git a/packages/cli/src/commands/build/buildFrontend.ts b/packages/cli/src/commands/build/buildFrontend.ts index 0ba0669c32..ec89008b81 100644 --- a/packages/cli/src/commands/build/buildFrontend.ts +++ b/packages/cli/src/commands/build/buildFrontend.ts @@ -19,6 +19,7 @@ import { resolve as resolvePath } from 'path'; import { buildBundle, getModuleFederationOptions } from '../../lib/bundler'; import { getEnvironmentParallelism } from '../../lib/parallel'; import { loadCliConfig } from '../../modules/config/lib/config'; +import { BackstagePackageJson } from '@backstage/cli-node'; interface BuildAppOptions { targetDir: string; @@ -30,20 +31,22 @@ interface BuildAppOptions { export async function buildFrontend(options: BuildAppOptions) { const { targetDir, writeStats, configPaths, rspack } = options; - const { name } = await fs.readJson(resolvePath(targetDir, 'package.json')); - + const packageJson = (await fs.readJson( + resolvePath(targetDir, 'package.json'), + )) as BackstagePackageJson; await buildBundle({ targetDir, entry: 'src/index', parallelism: getEnvironmentParallelism(), statsJsonEnabled: writeStats, - moduleFederation: getModuleFederationOptions( - name, + moduleFederation: await getModuleFederationOptions( + packageJson, + resolvePath(targetDir), options.isModuleFederationRemote, ), ...(await loadCliConfig({ args: configPaths, - fromPackage: name, + fromPackage: packageJson.name, })), rspack, }); diff --git a/packages/cli/src/commands/repo/build.ts b/packages/cli/src/commands/repo/build.ts index 7e6d235e7d..cd5e32dd06 100644 --- a/packages/cli/src/commands/repo/build.ts +++ b/packages/cli/src/commands/repo/build.ts @@ -31,6 +31,11 @@ import { createScriptOptionsParser } from './optionsParser'; export async function command(opts: OptionValues, cmd: Command): Promise { let packages = await PackageGraph.listTargetPackages(); + const shouldUseRspack = Boolean(process.env.EXPERIMENTAL_RSPACK); + + const rspack = shouldUseRspack + ? (require('@rspack/core') as typeof import('@rspack/core').rspack) + : undefined; if (opts.since) { const graph = PackageGraph.fromPackages(packages); @@ -111,6 +116,7 @@ export async function command(opts: OptionValues, cmd: Command): Promise { targetDir: pkg.dir, configPaths: (buildOptions.config as string[]) ?? [], writeStats: Boolean(buildOptions.stats), + rspack, }); }, }); diff --git a/packages/cli/src/commands/start/startFrontend.ts b/packages/cli/src/commands/start/startFrontend.ts index df317799f4..d47f539527 100644 --- a/packages/cli/src/commands/start/startFrontend.ts +++ b/packages/cli/src/commands/start/startFrontend.ts @@ -15,8 +15,10 @@ */ import { readJson } from 'fs-extra'; +import { resolve as resolvePath } from 'path'; import { getModuleFederationOptions, serveBundle } from '../../lib/bundler'; import { paths } from '../../lib/paths'; +import { BackstagePackageJson } from '@backstage/cli-node'; interface StartAppOptions { verifyVersions?: boolean; @@ -30,7 +32,9 @@ interface StartAppOptions { } export async function startFrontend(options: StartAppOptions) { - const { name } = await readJson(paths.resolveTarget('package.json')); + const packageJson = (await readJson( + paths.resolveTarget('package.json'), + )) as BackstagePackageJson; const waitForExit = await serveBundle({ entry: options.entry, @@ -39,8 +43,9 @@ export async function startFrontend(options: StartAppOptions) { verifyVersions: options.verifyVersions, skipOpenBrowser: options.skipOpenBrowser, linkedWorkspace: options.linkedWorkspace, - moduleFederation: getModuleFederationOptions( - name, + moduleFederation: await getModuleFederationOptions( + packageJson, + resolvePath(paths.targetDir), options.isModuleFederationRemote, ), }); diff --git a/packages/cli/src/lib/bundler/bundle.ts b/packages/cli/src/lib/bundler/bundle.ts index cb0322eb2c..7d88a2f97f 100644 --- a/packages/cli/src/lib/bundler/bundle.ts +++ b/packages/cli/src/lib/bundler/bundle.ts @@ -119,6 +119,12 @@ export async function buildBundle(options: BuildOptions) { ); } + if (rspack) { + console.log( + chalk.yellow(`⚠️ WARNING: Using experimental RSPack bundler.`), + ); + } + const { stats } = await build(configs, isCi, rspack); if (!stats) { diff --git a/packages/cli/src/lib/bundler/config.ts b/packages/cli/src/lib/bundler/config.ts index 5e379783ba..cc0dbd7c2a 100644 --- a/packages/cli/src/lib/bundler/config.ts +++ b/packages/cli/src/lib/bundler/config.ts @@ -235,13 +235,22 @@ export async function createConfig( .ModuleFederationPlugin as unknown as typeof ModuleFederationPlugin) : ModuleFederationPlugin; + const exposes = options.moduleFederation?.exposes + ? Object.fromEntries( + Object.entries(options.moduleFederation?.exposes).map(([k, v]) => [ + k, + resolvePath(paths.targetPath, v), + ]), + ) + : { + '.': paths.targetEntry, + }; + plugins.push( new AdaptedModuleFederationPlugin({ ...(isRemote && { filename: 'remoteEntry.js', - exposes: { - '.': paths.targetEntry, - }, + exposes, }), name: options.moduleFederation.name, runtime: false, diff --git a/packages/cli/src/lib/bundler/moduleFederation.ts b/packages/cli/src/lib/bundler/moduleFederation.ts index ae3f9ab048..26d1c4784b 100644 --- a/packages/cli/src/lib/bundler/moduleFederation.ts +++ b/packages/cli/src/lib/bundler/moduleFederation.ts @@ -16,11 +16,18 @@ import chalk from 'chalk'; import { ModuleFederationOptions } from './types'; +import { BackstagePackageJson } from '@backstage/cli-node'; +import { readEntryPoints } from '../entryPoints'; +import { + createTypeDistProject, + getEntryPointDefaultFeatureType, +} from '../typeDistProject'; -export function getModuleFederationOptions( - name: string, +export async function getModuleFederationOptions( + packageJson: BackstagePackageJson, + packageDir: string, isModuleFederationRemote?: boolean, -): ModuleFederationOptions | undefined { +): Promise { if ( !isModuleFederationRemote && !process.env.EXPERIMENTAL_MODULE_FEDERATION @@ -34,11 +41,43 @@ export function getModuleFederationOptions( ), ); + let exposes: ModuleFederationOptions['exposes']; + const packageRole = packageJson.backstage?.role; + if (isModuleFederationRemote && packageJson.exports && packageRole) { + const project = await createTypeDistProject(); + exposes = Object.fromEntries( + readEntryPoints(packageJson) + .filter(ep => { + if (ep.mount === './package.json') { + return false; + } + if (ep.mount === '.') { + return true; + } + // Include this additional entry point in the exposed modules + // if it exports a feature as default export. + return ( + getEntryPointDefaultFeatureType( + packageRole, + packageDir, + project, + ep.path, + ) !== null + ); + }) + .map(ep => [ep.mount, ep.path]), + ); + } + return { mode: isModuleFederationRemote ? 'remote' : 'host', // The default output mode requires the name to be a usable as a code // symbol, there might be better options here but for now we need to // sanitize the name. - name: name.replaceAll('@', '').replaceAll('/', '__').replaceAll('-', '_'), + name: packageJson.name + .replaceAll('@', '') + .replaceAll('/', '__') + .replaceAll('-', '_'), + exposes, }; } diff --git a/packages/cli/src/lib/bundler/server.ts b/packages/cli/src/lib/bundler/server.ts index dc16a4577d..1b62c82ce5 100644 --- a/packages/cli/src/lib/bundler/server.ts +++ b/packages/cli/src/lib/bundler/server.ts @@ -233,6 +233,12 @@ DEPRECATION WARNING: React Router Beta is deprecated and support for it will be ? require('@rspack/dev-server').RspackDevServer : WebpackDevServer; + if (rspack) { + console.log( + chalk.yellow(`⚠️ WARNING: Using experimental RSPack dev server.`), + ); + } + const publicPaths = await resolveOptionalBundlingPaths({ entry: 'src/index-public-experimental', dist: 'dist/public', diff --git a/packages/cli/src/lib/bundler/types.ts b/packages/cli/src/lib/bundler/types.ts index c5afb86b88..e44236a602 100644 --- a/packages/cli/src/lib/bundler/types.ts +++ b/packages/cli/src/lib/bundler/types.ts @@ -23,6 +23,12 @@ export type ModuleFederationOptions = { name: string; // Whether this is a host or remote bundle mode: 'host' | 'remote'; + exposes?: { + /** + * Modules that should be exposed by this container. + */ + [k: string]: string; + }; }; export type BundlingOptions = { diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index 8f3bb87bce..fd99a9cac4 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,47 @@ # @backstage/config-loader +## 1.9.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/cli-common@0.1.15 + +## 1.9.5-next.0 + +### Patch Changes + +- 8ecf8cb: Exclude `@backstage/backend-common` from schema collection if `@backstage/backend-defaults` is present +- Updated dependencies + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 1.9.3 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 1.9.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 1.9.3-next.0 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 336df8b1c0..c964e01c41 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/config-loader", - "version": "1.9.3-next.0", + "version": "1.9.5-next.1", "description": "Config loading functionality used by Backstage backend, and CLI", "backstage": { "role": "node-library" diff --git a/packages/config-loader/src/schema/collect.test.ts b/packages/config-loader/src/schema/collect.test.ts index 8c6d1c6b90..53db5c6da7 100644 --- a/packages/config-loader/src/schema/collect.test.ts +++ b/packages/config-loader/src/schema/collect.test.ts @@ -68,6 +68,7 @@ describe('collectConfigSchemas', () => { { path: path.join('node_modules', 'a', 'package.json'), value: mockSchema, + packageName: 'a', }, ]); }); @@ -89,6 +90,62 @@ describe('collectConfigSchemas', () => { { path: path.join('root', 'package.json'), value: mockSchema, + packageName: 'root', + }, + ]); + }); + + it('should not include schemas for backend-common if theres a backend-defaults package', async () => { + mockDir.setContent({ + root: { + 'package.json': JSON.stringify({ + name: 'root', + dependencies: { + '@backstage/backend-common': '1', + '@backstage/backend-defaults': '1', + }, + configSchema: { ...mockSchema, title: 'root' }, + }), + }, + node_modules: { + '@backstage': { + 'backend-common': { + 'package.json': JSON.stringify({ + name: '@backstage/backend-common', + version: '1', + configSchema: { ...mockSchema, title: 'backend-common' }, + }), + }, + 'backend-defaults': { + 'package.json': JSON.stringify({ + name: '@backstage/backend-defaults', + version: '1', + configSchema: { ...mockSchema, title: 'backend-defaults' }, + }), + }, + }, + }, + }); + + process.chdir(mockDir.path); + + await expect( + collectConfigSchemas(['root'], [path.join('root', 'package.json')]), + ).resolves.toEqual([ + { + path: path.join('root', 'package.json'), + value: { ...mockSchema, title: 'root' }, + packageName: 'root', + }, + { + path: path.join( + 'node_modules', + '@backstage', + 'backend-defaults', + 'package.json', + ), + value: { ...mockSchema, title: 'backend-defaults' }, + packageName: '@backstage/backend-defaults', }, ]); }); @@ -159,18 +216,22 @@ describe('collectConfigSchemas', () => { { path: path.join('node_modules', 'b', 'package.json'), value: { ...mockSchema, title: 'b' }, + packageName: 'b', }, { path: path.join('node_modules', 'c1', 'package.json'), value: { ...mockSchema, title: 'c1' }, + packageName: 'c1', }, { path: path.join('node_modules', 'd1', 'package.json'), value: { ...mockSchema, title: 'd1' }, + packageName: 'd1', }, { path: path.join('root', 'package.json'), value: { ...mockSchema, title: 'root' }, + packageName: 'root', }, ]), ); @@ -213,10 +274,12 @@ describe('collectConfigSchemas', () => { { path: path.join('node_modules', 'a', 'package.json'), value: { ...mockSchema, title: 'inline' }, + packageName: 'a', }, { path: path.join('node_modules', 'b', 'schema.json'), value: { ...mockSchema, title: 'external' }, + packageName: 'b', }, { path: path.join('node_modules', 'c', 'schema.d.ts'), @@ -231,6 +294,7 @@ describe('collectConfigSchemas', () => { }, required: ['tsKey'], }, + packageName: 'c', }, ]), ); @@ -284,14 +348,17 @@ describe('collectConfigSchemas', () => { { path: path.join('node_modules', 'a', 'package.json'), value: mockSchema, + packageName: 'a', }, { path: path.join('node_modules', 'b', 'package.json'), value: { ...mockSchema, title: 'b' }, + packageName: 'b', }, { path: path.join('node_modules', 'c', 'package.json'), value: { ...mockSchema, title: 'c1' }, + packageName: 'c', }, { path: path.join( @@ -302,6 +369,7 @@ describe('collectConfigSchemas', () => { 'package.json', ), value: { ...mockSchema, title: 'c2' }, + packageName: 'c', }, ]), ); diff --git a/packages/config-loader/src/schema/collect.ts b/packages/config-loader/src/schema/collect.ts index 7120c12d90..c7af64e0f3 100644 --- a/packages/config-loader/src/schema/collect.ts +++ b/packages/config-loader/src/schema/collect.ts @@ -45,7 +45,7 @@ export async function collectConfigSchemas( packagePaths: string[], ): Promise { const schemas = new Array(); - const tsSchemaPaths = new Array(); + const tsSchemaPaths = new Array<{ packageName: string; path: string }>(); const visitedPackageVersions = new Map>(); // pkgName: [versions...] const currentDir = await fs.realpath(process.cwd()); @@ -115,22 +115,25 @@ export async function collectConfigSchemas( ); } if (isDts) { - tsSchemaPaths.push( - relativePath( + tsSchemaPaths.push({ + path: relativePath( currentDir, resolvePath(dirname(pkgPath), pkg.configSchema), ), - ); + packageName: pkg.name, + }); } else { const path = resolvePath(dirname(pkgPath), pkg.configSchema); const value = await fs.readJson(path); schemas.push({ + packageName: pkg.name, value, path: relativePath(currentDir, path), }); } } else { schemas.push({ + packageName: pkg.name, value: pkg.configSchema, path: relativePath(currentDir, pkgPath), }); @@ -150,15 +153,31 @@ export async function collectConfigSchemas( ]); const tsSchemas = await compileTsSchemas(tsSchemaPaths); + const allSchemas = schemas.concat(tsSchemas); - return schemas.concat(tsSchemas); + const hasBackendDefaults = allSchemas.some( + ({ packageName }) => packageName === '@backstage/backend-defaults', + ); + + if (hasBackendDefaults) { + // We filter out backend-common schemas here to avoid issues with + // schema merging over different versions of the same schema. + // led to issues such as https://github.com/backstage/backstage/issues/28170 + return allSchemas.filter( + ({ packageName }) => packageName !== '@backstage/backend-common', + ); + } + + return allSchemas; } // This handles the support of TypeScript .d.ts config schema declarations. // We collect all typescript schema definition and compile them all in one go. // This is much faster than compiling them separately. -async function compileTsSchemas(paths: string[]) { - if (paths.length === 0) { +async function compileTsSchemas( + entries: { path: string; packageName: string }[], +) { + if (entries.length === 0) { return []; } @@ -168,20 +187,23 @@ async function compileTsSchemas(paths: string[]) { 'typescript-json-schema' ); - const program = getProgramFromFiles(paths, { - incremental: false, - isolatedModules: true, - lib: ['ES5'], // Skipping most libs speeds processing up a lot, we just need the primitive types anyway - noEmit: true, - noResolve: true, - skipLibCheck: true, // Skipping lib checks speeds things up - skipDefaultLibCheck: true, - strict: true, - typeRoots: [], // Do not include any additional types - types: [], - }); + const program = getProgramFromFiles( + entries.map(({ path }) => path), + { + incremental: false, + isolatedModules: true, + lib: ['ES5'], // Skipping most libs speeds processing up a lot, we just need the primitive types anyway + noEmit: true, + noResolve: true, + skipLibCheck: true, // Skipping lib checks speeds things up + skipDefaultLibCheck: true, + strict: true, + typeRoots: [], // Do not include any additional types + types: [], + }, + ); - const tsSchemas = paths.map(path => { + const tsSchemas = entries.map(({ path, packageName }) => { let value; try { const generator = buildGenerator( @@ -228,7 +250,7 @@ async function compileTsSchemas(paths: string[]) { if (!value) { throw new Error(`Invalid schema in ${path}, missing Config export`); } - return { path, value }; + return { path, value, packageName }; }); return tsSchemas; diff --git a/packages/config-loader/src/schema/compile.test.ts b/packages/config-loader/src/schema/compile.test.ts index ff0a9543aa..b39d2537d1 100644 --- a/packages/config-loader/src/schema/compile.test.ts +++ b/packages/config-loader/src/schema/compile.test.ts @@ -21,10 +21,12 @@ describe('compileConfigSchemas', () => { const validate = compileConfigSchemas([ { path: 'a', + packageName: 'a', value: { type: 'object', properties: { a: { type: 'string' } } }, }, { path: 'b', + packageName: 'b', value: { type: 'object', properties: { b: { type: 'number' } } }, }, ]); @@ -64,6 +66,7 @@ describe('compileConfigSchemas', () => { const validate = compileConfigSchemas([ { path: 'a1', + packageName: 'a1', value: { type: 'object', properties: { @@ -80,6 +83,7 @@ describe('compileConfigSchemas', () => { }, { path: 'a2', + packageName: 'a2', value: { type: 'object', properties: { @@ -126,6 +130,7 @@ describe('compileConfigSchemas', () => { compileConfigSchemas([ { path: 'a1', + packageName: 'a1', value: { type: 'object', properties: { a: { type: 'string', visibility: 'frontend' } }, @@ -133,6 +138,7 @@ describe('compileConfigSchemas', () => { }, { path: 'a2', + packageName: 'a2', value: { type: 'object', properties: { a: { type: 'string', visibility: 'secret' } }, @@ -148,6 +154,7 @@ describe('compileConfigSchemas', () => { const validate = compileConfigSchemas([ { path: 'a1', + packageName: 'a1', value: { type: 'object', properties: { @@ -179,6 +186,7 @@ describe('compileConfigSchemas', () => { const validate = compileConfigSchemas([ { path: 'a1', + packageName: 'a1', value: { type: 'object', properties: { @@ -242,6 +250,7 @@ describe('deepVisibility', () => { const validate = compileConfigSchemas([ { path: 'a1', + packageName: 'a1', value: { type: 'object', properties: { @@ -257,6 +266,7 @@ describe('deepVisibility', () => { }, { path: 'a2', + packageName: 'a2', value: { type: 'object', deepVisibility: 'secret', @@ -305,6 +315,7 @@ describe('deepVisibility', () => { compileConfigSchemas([ { path: 'a1', + packageName: 'a1', value: { type: 'object', properties: { @@ -320,6 +331,7 @@ describe('deepVisibility', () => { }, { path: 'a2', + packageName: 'a2', value: { type: 'object', deepVisibility: 'secret', @@ -346,6 +358,7 @@ describe('deepVisibility', () => { compileConfigSchemas([ { path: 'a2', + packageName: 'a2', value: { type: 'object', deepVisibility: 'secret', @@ -376,6 +389,7 @@ describe('deepVisibility', () => { compileConfigSchemas([ { path: 'a2', + packageName: 'a2', value: { type: 'object', properties: { @@ -398,6 +412,7 @@ describe('deepVisibility', () => { compileConfigSchemas([ { path: 'a1', + packageName: 'a1', value: { type: 'object', properties: { @@ -418,6 +433,7 @@ describe('deepVisibility', () => { }, { path: 'a2', + packageName: 'a2', value: { type: 'object', deepVisibility: 'secret', diff --git a/packages/config-loader/src/schema/types.ts b/packages/config-loader/src/schema/types.ts index 8f679c93fc..4ba65245da 100644 --- a/packages/config-loader/src/schema/types.ts +++ b/packages/config-loader/src/schema/types.ts @@ -29,6 +29,10 @@ export type ConfigSchemaPackageEntry = { * The relative path that the configuration schema was discovered at. */ path: string; + /** + * The package name for the package this belongs to + */ + packageName: string; }; /** diff --git a/packages/config-loader/src/sources/types.ts b/packages/config-loader/src/sources/types.ts index abdf2f5c8e..fedce213c5 100644 --- a/packages/config-loader/src/sources/types.ts +++ b/packages/config-loader/src/sources/types.ts @@ -39,7 +39,7 @@ export interface ReadConfigDataOptions { } /** - * The the generator returned by {@link ConfigSource.readConfigData}. + * The generator returned by {@link ConfigSource.readConfigData}. * * @public */ diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md index e7ed06f626..6a1758386d 100644 --- a/packages/config/CHANGELOG.md +++ b/packages/config/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/config +## 1.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/errors@1.2.7-next.0 + +## 1.3.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 1.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + ## 1.3.0 ### Minor Changes diff --git a/packages/config/package.json b/packages/config/package.json index b3130dcab5..37e011f363 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/config", - "version": "1.3.0", + "version": "1.3.2-next.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 ecb3781525..b4fcc236c8 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/core-app-api +## 1.15.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/version-bridge@1.0.10 + +## 1.15.3 + +### Patch Changes + +- e5fa018: The OAuth 2 client implementations will now attempt to refresh the session when the existing session doesn't have the required scopes. The previous behavior was to only try to refresh the session of it was missing, and otherwise directly request a new session. This fixes an issue where some auth providers will not return access tokens with certain scopes unless explicitly requested, leading to an auth popup even if the underlying session already had been granted the requested scopes. +- 2830689: Decrease OAuth2 token refresh grace period +- Updated dependencies + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## 1.15.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + ## 1.15.3-next.0 ### Patch Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index a7b64e5218..9cb1f68af1 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.3-next.0", + "version": "1.15.4-next.0", "description": "Core app API used by Backstage apps", "backstage": { "role": "web-library" diff --git a/packages/core-app-api/src/apis/implementations/DiscoveryApi/UrlPatternDiscovery.ts b/packages/core-app-api/src/apis/implementations/DiscoveryApi/UrlPatternDiscovery.ts index 58ffc9441b..37b50bdcbb 100644 --- a/packages/core-app-api/src/apis/implementations/DiscoveryApi/UrlPatternDiscovery.ts +++ b/packages/core-app-api/src/apis/implementations/DiscoveryApi/UrlPatternDiscovery.ts @@ -26,7 +26,7 @@ const ERROR_PREFIX = 'Invalid discovery URL pattern,'; */ export class UrlPatternDiscovery implements DiscoveryApi { /** - * Creates a new UrlPatternDiscovery given a template. The the only + * Creates a new UrlPatternDiscovery given a template. The only * interpolation done for the template is to replace instances of `{{pluginId}}` * with the ID of the plugin being requested. * diff --git a/packages/core-app-api/src/apis/system/ApiProvider.test.tsx b/packages/core-app-api/src/apis/system/ApiProvider.test.tsx index 6460e12900..ceb3a0d12a 100644 --- a/packages/core-app-api/src/apis/system/ApiProvider.test.tsx +++ b/packages/core-app-api/src/apis/system/ApiProvider.test.tsx @@ -55,7 +55,7 @@ describe('ApiProvider', () => { , ); - renderedHoc.getByText('hoc message: hello'); + expect(renderedHoc.getByText('hoc message: hello')).toBeInTheDocument(); }); it('should provide nested access to apis', () => { @@ -84,7 +84,7 @@ describe('ApiProvider', () => { , ); - renderedHook.getByText('a=z b=y'); + expect(renderedHook.getByText('a=z b=y')).toBeInTheDocument(); }); it('should ignore deps in prototype', () => { @@ -107,7 +107,7 @@ describe('ApiProvider', () => { , ); - renderedHoc.getByText('hoc message: hello'); + expect(renderedHoc.getByText('hoc message: hello')).toBeInTheDocument(); }); it('should error if no provider is available', () => { @@ -229,6 +229,6 @@ describe('v1 consumer', () => { , ); - renderedHook.getByText('hook message: hello'); + expect(renderedHook.getByText('hook message: hello')).toBeInTheDocument(); }); }); diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md index bcb2a1828c..4feac45ec7 100644 --- a/packages/core-compat-api/CHANGELOG.md +++ b/packages/core-compat-api/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/core-compat-api +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/version-bridge@1.0.10 + +## 0.3.4 + +### Patch Changes + +- 1f30730: Updated dependency `@oriflame/backstage-plugin-score-card` to `^0.9.0`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-plugin-api@1.10.2 + - @backstage/version-bridge@1.0.10 + +## 0.3.4-next.2 + +### Patch Changes + +- 1f30730: Updated dependency `@oriflame/backstage-plugin-score-card` to `^0.9.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/version-bridge@1.0.10 + ## 0.3.4-next.1 ### Patch Changes diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index 101484b70b..4c9409356c 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.4-next.1", + "version": "0.3.5-next.0", "backstage": { "role": "web-library" }, @@ -46,7 +46,7 @@ "@backstage/plugin-catalog": "workspace:^", "@backstage/test-utils": "workspace:^", "@backstage/types": "workspace:^", - "@oriflame/backstage-plugin-score-card": "^0.8.0", + "@oriflame/backstage-plugin-score-card": "^0.9.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 7650f9b2b5..2fd2cb6973 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/core-components +## 0.16.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/theme@0.6.3 + - @backstage/version-bridge@1.0.10 + +## 0.16.2 + +### Patch Changes + +- e47be38: Added data-testid to placeholder rendered by Progress component to simplify assertions in tests +- Updated dependencies + - @backstage/theme@0.6.3 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/version-bridge@1.0.10 + +## 0.16.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/version-bridge@1.0.10 + ## 0.16.2-next.1 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index ec9fd07e76..5689b9e4f7 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-components", - "version": "0.16.2-next.1", + "version": "0.16.3-next.0", "description": "Core components used by Backstage plugins and apps", "backstage": { "role": "web-library" diff --git a/packages/core-components/src/components/CodeSnippet/CodeSnippet.test.tsx b/packages/core-components/src/components/CodeSnippet/CodeSnippet.test.tsx index fec5b7ddf7..c0096e7ae9 100644 --- a/packages/core-components/src/components/CodeSnippet/CodeSnippet.test.tsx +++ b/packages/core-components/src/components/CodeSnippet/CodeSnippet.test.tsx @@ -34,8 +34,12 @@ describe('', () => { // react-syntax-highlighter is large and can cause significant slowdowns // This test makes sure we're loading things in asynchronously and not too broadly. it('renders quickly', async () => { + const start = new Date(); await renderInTestApp(); - }, 1000); + const end = new Date(); + + expect(end.getTime() - start.getTime()).toBeLessThanOrEqual(1000); + }, 1500); it('renders text without exploding', async () => { const { getByText } = await renderInTestApp(); diff --git a/packages/core-components/src/components/FeatureDiscovery/FeatureCalloutCircular.test.tsx b/packages/core-components/src/components/FeatureDiscovery/FeatureCalloutCircular.test.tsx index f72e33ac4b..b5106e1bf9 100644 --- a/packages/core-components/src/components/FeatureDiscovery/FeatureCalloutCircular.test.tsx +++ b/packages/core-components/src/components/FeatureDiscovery/FeatureCalloutCircular.test.tsx @@ -58,8 +58,8 @@ describe('', () => { description="description" />, ); - rendered.getByText('description'); - rendered.getByText('title'); + expect(rendered.getByText('description')).toBeInTheDocument(); + expect(rendered.getByText('title')).toBeInTheDocument(); }); it('renders with correct style', async () => { diff --git a/packages/core-components/src/components/OverflowTooltip/OverflowTooltip.test.tsx b/packages/core-components/src/components/OverflowTooltip/OverflowTooltip.test.tsx index 2fea7fa5e1..a65c758c28 100644 --- a/packages/core-components/src/components/OverflowTooltip/OverflowTooltip.test.tsx +++ b/packages/core-components/src/components/OverflowTooltip/OverflowTooltip.test.tsx @@ -20,10 +20,12 @@ import { OverflowTooltip } from './OverflowTooltip'; describe('', () => { it('renders without exploding', async () => { - render(); + expect( + render(), + ).toBeTruthy(); }); it('renders without exploding when the text prop is missing', async () => { - render(); + expect(render()).toBeTruthy(); }); }); diff --git a/packages/core-components/src/components/ProgressBars/Gauge.test.tsx b/packages/core-components/src/components/ProgressBars/Gauge.test.tsx index 2d92391a30..0c19d5acb2 100644 --- a/packages/core-components/src/components/ProgressBars/Gauge.test.tsx +++ b/packages/core-components/src/components/ProgressBars/Gauge.test.tsx @@ -24,34 +24,34 @@ describe('', () => { const { getByText } = await renderInTestApp( , ); - getByText('10%'); + expect(getByText('10%')).toBeInTheDocument(); }); it('handles fractional prop', async () => { const { getByText } = await renderInTestApp( , ); - getByText('10%'); + expect(getByText('10%')).toBeInTheDocument(); }); it('handles max prop', async () => { const { getByText } = await renderInTestApp( , ); - getByText('1%'); + expect(getByText('1%')).toBeInTheDocument(); }); it('handles unit prop', async () => { const { getByText } = await renderInTestApp( , ); - getByText('10m'); + expect(getByText('10m')).toBeInTheDocument(); }); it('handle relativeToMax prop', async () => { const { getByText } = await renderInTestApp( , ); - getByText('7 pts'); + expect(getByText('7 pts')).toBeInTheDocument(); }); it('handle decimalDigits prop', async () => { @@ -65,7 +65,7 @@ describe('', () => { unit="/10" />, ); - getByText('5.50/10'); + expect(getByText('5.50/10')).toBeInTheDocument(); }); const ok = '#111'; diff --git a/packages/core-components/src/components/TrendLine/TrendLine.test.tsx b/packages/core-components/src/components/TrendLine/TrendLine.test.tsx index 0d98c2dfdc..3cb54875c5 100644 --- a/packages/core-components/src/components/TrendLine/TrendLine.test.tsx +++ b/packages/core-components/src/components/TrendLine/TrendLine.test.tsx @@ -43,14 +43,14 @@ describe('TrendLine', () => { }); }); - describe.skip('when the data finishes within the the warning threshold', () => { + describe.skip('when the data finishes within the warning threshold', () => { it('renders with the correct color', async () => { await renderInTestApp(); expect(screen.getByTitle('sparkline')).toBeInTheDocument(); }); }); - describe.skip('when the data finishes within the the error threshold', () => { + describe.skip('when the data finishes within the error threshold', () => { it('renders with the correct color', async () => { await renderInTestApp(); expect(screen.getByTitle('sparkline')).toBeInTheDocument(); diff --git a/packages/core-components/src/layout/ContentHeader/ContentHeader.test.tsx b/packages/core-components/src/layout/ContentHeader/ContentHeader.test.tsx index 5ae2efb806..8be54b9114 100644 --- a/packages/core-components/src/layout/ContentHeader/ContentHeader.test.tsx +++ b/packages/core-components/src/layout/ContentHeader/ContentHeader.test.tsx @@ -17,6 +17,7 @@ import React from 'react'; import { ContentHeader } from './ContentHeader'; import { renderInTestApp } from '@backstage/test-utils'; +import _ from 'lodash'; jest.mock('react-helmet', () => { return { @@ -27,14 +28,14 @@ jest.mock('react-helmet', () => { describe('', () => { it('should render with title', async () => { const rendered = await renderInTestApp(); - rendered.getByText('Title'); + expect(rendered.getByText('Title')).toBeInTheDocument(); }); it('should render without title', async () => { const rendered = await renderInTestApp( content, ); - rendered.getByText('content'); + expect(rendered.getByText('content')).toBeInTheDocument(); }); it('should render with titleComponent', async () => { @@ -43,13 +44,13 @@ describe('', () => { const rendered = await renderInTestApp( , ); - rendered.getByText(title); + expect(rendered.getByText(title)).toBeInTheDocument(); }); it('should render with description', async () => { const rendered = await renderInTestApp( , ); - rendered.getByText('description'); + expect(rendered.getByText('description')).toBeInTheDocument(); }); }); diff --git a/packages/core-components/src/layout/Header/Header.test.tsx b/packages/core-components/src/layout/Header/Header.test.tsx index 776e39045c..2a63b4fedc 100644 --- a/packages/core-components/src/layout/Header/Header.test.tsx +++ b/packages/core-components/src/layout/Header/Header.test.tsx @@ -29,42 +29,46 @@ jest.mock('react-helmet', () => { describe('
', () => { it('should render with title', async () => { const rendered = await renderInTestApp(
); - rendered.getByText('Title'); + expect(rendered.getByText('Title')).toBeInTheDocument(); }); it('should set document title', async () => { const rendered = await renderInTestApp(
); - rendered.getByText('Title1'); - rendered.getByText('defaultTitle: Title1 | Backstage'); + expect(rendered.getByText('Title1')).toBeInTheDocument(); + expect( + rendered.getByText('defaultTitle: Title1 | Backstage'), + ).toBeInTheDocument(); }); it('should override document title', async () => { const rendered = await renderInTestApp(
, ); - rendered.getByText('Title1'); - rendered.getByText('defaultTitle: Title2 | Backstage'); + expect(rendered.getByText('Title1')).toBeInTheDocument(); + expect( + rendered.getByText('defaultTitle: Title2 | Backstage'), + ).toBeInTheDocument(); }); it('should have subtitle', async () => { const rendered = await renderInTestApp(
, ); - rendered.getByText('Subtitle'); + expect(rendered.getByText('Subtitle')).toBeInTheDocument(); }); it('should have type rendered', async () => { const rendered = await renderInTestApp(
, ); - rendered.getByText('tool'); + expect(rendered.getByText('tool')).toBeInTheDocument(); }); it('should have breadcrumb rendered', async () => { const rendered = await renderInTestApp(
, ); - rendered.getAllByText('Title'); + expect(rendered.getAllByText('Title')).toBeTruthy(); }); it('should use app.title', async () => { @@ -75,6 +79,6 @@ describe('
', () => {
, , ); - rendered.getAllByText(/Title | Blah/); + expect(rendered.getAllByText(/Title | Blah/)).toBeTruthy(); }); }); diff --git a/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.test.tsx b/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.test.tsx index b56ae3167f..fc9b4f449c 100644 --- a/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.test.tsx +++ b/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.test.tsx @@ -22,7 +22,14 @@ import userEvent from '@testing-library/user-event'; describe('', () => { it('renders without any items and without exploding', async () => { - await renderInTestApp(); + const rendered = await renderInTestApp( + , + ); + + expect(rendered.queryByTestId('header-action-menu')).toBeInTheDocument(); + expect( + rendered.queryByTestId('header-action-item'), + ).not.toBeInTheDocument(); }); it('can open the menu and click menu items', async () => { diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index 2ddb6333c7..bb29bc4a10 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/core-plugin-api +## 1.10.3-next.0 + +### Patch Changes + +- b40eb41: Move `Expand` and `ExpandRecursive` to `@backstage/types` +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/version-bridge@1.0.10 + +## 1.10.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## 1.10.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + ## 1.10.1 ### Patch Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 176f6014b6..e3959b3990 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.1", + "version": "1.10.3-next.0", "description": "Core API used by Backstage plugins", "backstage": { "role": "web-library" diff --git a/packages/core-plugin-api/report-alpha.api.md b/packages/core-plugin-api/report-alpha.api.md index c0f0d02535..281d943e50 100644 --- a/packages/core-plugin-api/report-alpha.api.md +++ b/packages/core-plugin-api/report-alpha.api.md @@ -4,6 +4,8 @@ ```ts import { ApiRef } from '@backstage/core-plugin-api'; +import { Expand } from '@backstage/types'; +import { ExpandRecursive } from '@backstage/types'; import { Observable } from '@backstage/types'; import { TranslationMessages as TranslationMessages_2 } from '@backstage/core-plugin-api/alpha'; import { TranslationRef as TranslationRef_2 } from '@backstage/core-plugin-api/alpha'; diff --git a/packages/core-plugin-api/src/apis/definitions/TranslationApi.ts b/packages/core-plugin-api/src/apis/definitions/TranslationApi.ts index 202b2093a0..dba8753828 100644 --- a/packages/core-plugin-api/src/apis/definitions/TranslationApi.ts +++ b/packages/core-plugin-api/src/apis/definitions/TranslationApi.ts @@ -15,7 +15,7 @@ */ import { ApiRef, createApiRef } from '@backstage/core-plugin-api'; -import { Observable } from '@backstage/types'; +import { Expand, ExpandRecursive, Observable } from '@backstage/types'; import { TranslationRef } from '../../translation'; /** @@ -98,22 +98,6 @@ type CollapsedMessages = { : key]: TMessages[key]; }; -/** - * Helper type that expands type hints - * - * @ignore - */ -type Expand = T extends infer O ? { [K in keyof O]: O[K] } : never; - -/** - * Helper type that expands type hints recursively - * - * @ignore - */ -type ExpandRecursive = T extends infer O - ? { [K in keyof O]: ExpandRecursive } - : never; - /** * Trim away whitespace * diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index ce9aa221b0..e6b2cda208 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/create-app +## 0.5.24-next.2 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## 0.5.24-next.1 + +### Patch Changes + +- 828c993: Added `-j 2` to `dev` script to help cases where the backend does not start up during local development + +## 0.5.24-next.0 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## 0.5.23 + +### 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`. +- e913fdf: Add github backend module to create-app and improve error messages +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## 0.5.23-next.2 + +### Patch Changes + +- e913fdf: Add github backend module to create-app and improve error messages +- Updated dependencies + - @backstage/cli-common@0.1.15 + ## 0.5.23-next.1 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index c852cadb7f..df834fe126 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.5.23-next.1", + "version": "0.5.24-next.2", "description": "A CLI that helps you create your own Backstage app", "backstage": { "role": "cli" diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 27c5765a12..3d5240977e 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -91,6 +91,7 @@ jest.mock('./versions', () => ({ '@backstage/plugin-kubernetes-backend': '1.0.0', '@backstage/plugin-org': '1.0.0', '@backstage/plugin-scaffolder': '1.0.0', + '@backstage/plugin-scaffolder-backend-module-github': '1.0.0', '@backstage/plugin-permission-react': '1.0.0', '@backstage/plugin-search': '1.0.0', '@backstage/plugin-search-react': '1.0.0', diff --git a/packages/create-app/src/lib/versions.ts b/packages/create-app/src/lib/versions.ts index 9a7158ea55..d06912cca3 100644 --- a/packages/create-app/src/lib/versions.ts +++ b/packages/create-app/src/lib/versions.ts @@ -72,6 +72,7 @@ import { version as pluginPermissionNode } from '../../../../plugins/permission- import { version as pluginProxyBackend } from '../../../../plugins/proxy-backend/package.json'; import { version as pluginScaffolder } from '../../../../plugins/scaffolder/package.json'; import { version as pluginScaffolderBackend } from '../../../../plugins/scaffolder-backend/package.json'; +import { version as pluginScaffolderBackendModuleGithub } from '../../../../plugins/scaffolder-backend-module-github/package.json'; import { version as pluginSearch } from '../../../../plugins/search/package.json'; import { version as pluginSearchReact } from '../../../../plugins/search-react/package.json'; import { version as pluginSearchBackend } from '../../../../plugins/search-backend/package.json'; @@ -130,6 +131,8 @@ export const packageVersions = { '@backstage/plugin-proxy-backend': pluginProxyBackend, '@backstage/plugin-scaffolder': pluginScaffolder, '@backstage/plugin-scaffolder-backend': pluginScaffolderBackend, + '@backstage/plugin-scaffolder-backend-module-github': + pluginScaffolderBackendModuleGithub, '@backstage/plugin-search': pluginSearch, '@backstage/plugin-search-react': pluginSearchReact, '@backstage/plugin-search-backend': pluginSearchBackend, diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 21bdd41bdf..ea2a438429 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -6,7 +6,7 @@ "node": "20 || 22" }, "scripts": { - "dev": "yarn workspaces foreach -A --include backend --include app --parallel -v -i run start", + "dev": "yarn workspaces foreach -A --include backend --include app --parallel -j 2 -v -i run start", "start": "yarn workspace app start", "start-backend": "yarn workspace backend start", "build:backend": "yarn workspace backend build", diff --git a/packages/create-app/templates/default-app/packages/backend/package.json.hbs b/packages/create-app/templates/default-app/packages/backend/package.json.hbs index bb05beddaa..42afefd3b8 100644 --- a/packages/create-app/templates/default-app/packages/backend/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/backend/package.json.hbs @@ -33,6 +33,7 @@ "@backstage/plugin-permission-node": "^{{version '@backstage/plugin-permission-node'}}", "@backstage/plugin-proxy-backend": "^{{version '@backstage/plugin-proxy-backend'}}", "@backstage/plugin-scaffolder-backend": "^{{version '@backstage/plugin-scaffolder-backend'}}", + "@backstage/plugin-scaffolder-backend-module-github": "^{{version '@backstage/plugin-scaffolder-backend-module-github'}}", "@backstage/plugin-search-backend": "^{{version '@backstage/plugin-search-backend'}}", "@backstage/plugin-search-backend-module-catalog": "^{{version '@backstage/plugin-search-backend-module-catalog'}}", "@backstage/plugin-search-backend-module-pg": "^{{version '@backstage/plugin-search-backend-module-pg'}}", diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index 69a73511c6..6d0a6f4ca5 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -13,6 +13,7 @@ const backend = createBackend(); backend.add(import('@backstage/plugin-app-backend')); backend.add(import('@backstage/plugin-proxy-backend')); backend.add(import('@backstage/plugin-scaffolder-backend')); +backend.add(import('@backstage/plugin-scaffolder-backend-module-github')); backend.add(import('@backstage/plugin-techdocs-backend')); // auth plugin diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index d97bb0c44b..4166201ca7 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,55 @@ # @backstage/dev-utils +## 1.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/app-defaults@1.5.16-next.0 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/theme@0.6.3 + +## 1.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/integration-react@1.2.2 + +## 1.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/core-app-api@1.15.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + +## 1.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + ## 1.1.5-next.1 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index ef1b92b954..9af46d1f91 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.1.5-next.1", + "version": "1.1.6-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 90c72dfdef..87fe1442c0 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,48 @@ # e2e-test +## 0.2.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.24-next.2 + - @backstage/errors@1.2.7-next.0 + - @backstage/cli-common@0.1.15 + +## 0.2.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.24-next.1 + +## 0.2.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.24-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/errors@1.2.6 + +## 0.2.23 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.23 + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + +## 0.2.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.23-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-common@0.1.15 + ## 0.2.23-next.1 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index c3c5457405..548aedb4f5 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,6 +1,6 @@ { "name": "e2e-test", - "version": "0.2.23-next.1", + "version": "0.2.24-next.2", "description": "E2E test for verifying Backstage packages", "backstage": { "role": "cli" diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index f1a0ec7a5d..3f78104038 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/errors +## 1.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + +## 1.2.6 + +### Patch Changes + +- 1d4b5b9: Trim `error.cause.stack` in addition to `error.stack` when trimming stack traces from serialized errors. +- Updated dependencies + - @backstage/types@1.2.0 + +## 1.2.6-next.0 + +### Patch Changes + +- 1d4b5b9: Trim `error.cause.stack` in addition to `error.stack` when trimming stack traces from serialized errors. +- Updated dependencies + - @backstage/types@1.2.0 + ## 1.2.5 ### Patch Changes diff --git a/packages/errors/package.json b/packages/errors/package.json index 45ec6d3816..021067f1cd 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/errors", - "version": "1.2.5", + "version": "1.2.7-next.0", "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 c4a5354119..5e97506f00 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.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/frontend-defaults@0.1.5-next.0 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/version-bridge@1.0.10 + +## 0.10.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.15.3 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-defaults@0.1.4 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## 0.10.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-defaults@0.1.4-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + ## 0.10.3-next.1 ### Patch Changes diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index a75dd2b09d..44f4248f8b 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.3-next.1", + "version": "0.10.4-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-defaults/CHANGELOG.md b/packages/frontend-defaults/CHANGELOG.md index 7601acc7e0..91b44e3747 100644 --- a/packages/frontend-defaults/CHANGELOG.md +++ b/packages/frontend-defaults/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/frontend-defaults +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/frontend-app-api@0.10.4-next.0 + - @backstage/plugin-app@0.1.5-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-app@0.1.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/frontend-app-api@0.10.3 + +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-app@0.1.4-next.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index f8c63c5afb..2db3d377ea 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-defaults", - "version": "0.1.4-next.1", + "version": "0.1.5-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-internal/CHANGELOG.md b/packages/frontend-internal/CHANGELOG.md index c3cbeb7b76..8c9a4e222a 100644 --- a/packages/frontend-internal/CHANGELOG.md +++ b/packages/frontend-internal/CHANGELOG.md @@ -1,5 +1,32 @@ # @internal/frontend +## 0.0.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/version-bridge@1.0.10 + +## 0.0.4 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## 0.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + ## 0.0.4-next.1 ### Patch Changes diff --git a/packages/frontend-internal/package.json b/packages/frontend-internal/package.json index 817e8f0812..7e5cb9ed74 100644 --- a/packages/frontend-internal/package.json +++ b/packages/frontend-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/frontend", - "version": "0.0.4-next.1", + "version": "0.0.5-next.0", "backstage": { "role": "web-library", "inline": true diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index b5471f63d6..9a0edc47d8 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/frontend-plugin-api +## 0.9.4-next.0 + +### Patch Changes + +- b40eb41: Move `Expand` and `ExpandRecursive` to `@backstage/types` +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/version-bridge@1.0.10 + +## 0.9.3 + +### Patch Changes + +- 5f04976: Fixed a bug that caused missing code in published packages. +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## 0.9.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + ## 0.9.3-next.1 ### Patch Changes diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 74822f2b91..0c45b10693 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.3-next.1", + "version": "0.9.4-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-plugin-api/report.api.md b/packages/frontend-plugin-api/report.api.md index acc9efed61..24c2ff6d3b 100644 --- a/packages/frontend-plugin-api/report.api.md +++ b/packages/frontend-plugin-api/report.api.md @@ -39,6 +39,7 @@ import { ErrorApi } from '@backstage/core-plugin-api'; import { ErrorApiError } from '@backstage/core-plugin-api'; import { ErrorApiErrorContext } from '@backstage/core-plugin-api'; import { errorApiRef } from '@backstage/core-plugin-api'; +import { Expand } from '@backstage/types'; import { FeatureFlag } from '@backstage/core-plugin-api'; import { FeatureFlagsApi } from '@backstage/core-plugin-api'; import { featureFlagsApiRef } from '@backstage/core-plugin-api'; diff --git a/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx b/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx index de1cbe211e..4d0b4f37a7 100644 --- a/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx +++ b/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx @@ -98,7 +98,7 @@ describe('PageBlueprint', () => { const tester = createExtensionTester(myPage); - // TODO(blam): test for the routePath output doesn't work, due to the the way the test harness works + // TODO(blam): test for the routePath output doesn't work, due to the way the test harness works // expect(tester.data(coreExtensionData.routePath)).toBe('/test'); expect(tester.get(coreExtensionData.routeRef)).toBe(mockRouteRef); diff --git a/packages/frontend-plugin-api/src/types.ts b/packages/frontend-plugin-api/src/types.ts index a658760758..9088a9d772 100644 --- a/packages/frontend-plugin-api/src/types.ts +++ b/packages/frontend-plugin-api/src/types.ts @@ -17,13 +17,6 @@ import { ReactNode } from 'react'; import { FrontendPlugin } from './wiring'; -// TODO(Rugvip): This might be a quite useful utility type, maybe add to @backstage/types? -/** - * Utility type to expand type aliases into their equivalent type. - * @ignore - */ -export type Expand = T extends infer O ? { [K in keyof O]: O[K] } : never; - /** @public */ export type CoreProgressProps = {}; diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.ts b/packages/frontend-plugin-api/src/wiring/createExtension.ts index 16f9f341a7..baf0b31215 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.ts @@ -15,7 +15,7 @@ */ import { ApiHolder, AppNode } from '../apis'; -import { Expand } from '../types'; +import { Expand } from '@backstage/types'; import { ResolveInputValueOverrides, resolveInputOverrides, diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts index e22179127a..3d55b0bbe0 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts @@ -15,7 +15,7 @@ */ import { ApiHolder, AppNode } from '../apis'; -import { Expand } from '../types'; +import { Expand } from '@backstage/types'; import { ExtensionDefinition, ResolvedExtensionInputs, diff --git a/packages/frontend-plugin-api/src/wiring/resolveInputOverrides.ts b/packages/frontend-plugin-api/src/wiring/resolveInputOverrides.ts index cf201779e0..0541ca3620 100644 --- a/packages/frontend-plugin-api/src/wiring/resolveInputOverrides.ts +++ b/packages/frontend-plugin-api/src/wiring/resolveInputOverrides.ts @@ -15,7 +15,7 @@ */ import { AppNode } from '../apis'; -import { Expand } from '../types'; +import { Expand } from '@backstage/types'; import { ResolvedExtensionInput } from './createExtension'; import { ExtensionDataContainer, diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index 29ad36435e..bb9408eed9 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.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/frontend-app-api@0.10.4-next.0 + - @backstage/plugin-app@0.1.5-next.0 + - @backstage/test-utils@1.7.4-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/version-bridge@1.0.10 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-app@0.1.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/config@1.3.1 + - @backstage/frontend-app-api@0.10.3 + - @backstage/test-utils@1.7.3 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/frontend-app-api@0.10.3-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-app@0.1.4-next.2 + ## 0.2.4-next.1 ### Patch Changes diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index 793d67b500..87dd5937e9 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.4-next.1", + "version": "0.2.5-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/integration-aws-node/CHANGELOG.md b/packages/integration-aws-node/CHANGELOG.md index 26f65cf239..93241411fb 100644 --- a/packages/integration-aws-node/CHANGELOG.md +++ b/packages/integration-aws-node/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/integration-aws-node +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + ## 0.1.13 ### Patch Changes diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json index a75ace7986..e6054cf1cf 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", + "version": "0.1.15-next.0", "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 e447dd21af..3e285a1498 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/integration-react +## 1.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/integration@1.16.1-next.0 + +## 1.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + +## 1.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration@1.16.0-next.1 + ## 1.2.2-next.0 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 052f84a736..53ad6f1bf7 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-react", - "version": "1.2.2-next.0", + "version": "1.2.3-next.0", "description": "Frontend package for managing integrations towards external systems", "backstage": { "role": "web-library" diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 6c09d51df5..cf58088ec2 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/integration +## 1.16.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + +## 1.16.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/errors@1.2.6 + - @backstage/config@1.3.1 + +## 1.16.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + ## 1.16.0-next.0 ### Minor Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index 4fddb1bdbb..23b5924a43 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "1.16.0-next.0", + "version": "1.16.1-next.0", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/release-manifests/CHANGELOG.md b/packages/release-manifests/CHANGELOG.md index 33042e37e8..e88324250f 100644 --- a/packages/release-manifests/CHANGELOG.md +++ b/packages/release-manifests/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/release-manifests +## 0.0.12 + +### Patch Changes + +- 2e140dc: Switch to native fetch for loading release manifests +- b29eaea: Allow overriding the fetch function used inside getManifestByVersion + ## 0.0.12-next.1 ### Patch Changes diff --git a/packages/release-manifests/package.json b/packages/release-manifests/package.json index b888d68e41..0b24a93c6a 100644 --- a/packages/release-manifests/package.json +++ b/packages/release-manifests/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/release-manifests", - "version": "0.0.12-next.1", + "version": "0.0.12", "description": "Helper library for receiving release manifests", "backstage": { "role": "common-library" diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index eb44b2ac4c..66425b0ebf 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,60 @@ # @backstage/repo-tools +## 0.12.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/cli-node@0.2.12-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/cli-common@0.1.15 + +## 0.12.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.9.5-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.11 + - @backstage/errors@1.2.6 + +## 0.12.0 + +### Minor Changes + +- c1eccd6: Fix invalid path and malformed flags bugs in api-reports.ts + +### Patch Changes + +- 860e3b5: Generated OpenAPI clients now support paths with tags. +- 5f04976: Fixed a bug that caused missing code in published packages. +- 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/backend-plugin-api@1.1.0 + - @backstage/cli-node@0.2.11 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + +## 0.12.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/cli-node@0.2.11-next.1 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + ## 0.12.0-next.1 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 03995ad421..8b5ba736c8 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/repo-tools", - "version": "0.12.0-next.1", + "version": "0.12.1-next.1", "description": "CLI for Backstage repo tooling ", "backstage": { "role": "cli" diff --git a/packages/scaffolder-internal/CHANGELOG.md b/packages/scaffolder-internal/CHANGELOG.md index 18c4056a71..585c0edb51 100644 --- a/packages/scaffolder-internal/CHANGELOG.md +++ b/packages/scaffolder-internal/CHANGELOG.md @@ -1,5 +1,44 @@ # @internal/scaffolder +## 0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.3-next.2 + - @backstage/frontend-plugin-api@0.9.4-next.0 + +## 0.0.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.3-next.1 + +## 0.0.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.3-next.0 + - @backstage/frontend-plugin-api@0.9.3 + +## 0.0.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.2 + - @backstage/frontend-plugin-api@0.9.3 + +## 0.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/frontend-plugin-api@0.9.3-next.2 + ## 0.0.4-next.1 ### Patch Changes diff --git a/packages/scaffolder-internal/package.json b/packages/scaffolder-internal/package.json index 23bdc9caf8..4f4479919d 100644 --- a/packages/scaffolder-internal/package.json +++ b/packages/scaffolder-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/scaffolder", - "version": "0.0.4-next.1", + "version": "0.0.5-next.2", "backstage": { "role": "web-library", "inline": true diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 6b696824ef..c39a760304 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,91 @@ # techdocs-cli-embedded-app +## 0.2.104-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.12.1-next.1 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.1 + - @backstage/app-defaults@1.5.16-next.0 + - @backstage/cli@0.29.5-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/test-utils@1.7.4-next.0 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/theme@0.6.3 + +## 0.2.104-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.1-next.0 + - @backstage/plugin-techdocs@1.12.1-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/integration-react@1.2.2 + +## 0.2.104-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.29.5-next.0 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-app-api@1.15.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/test-utils@1.7.3 + - @backstage/theme@0.6.3 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/plugin-techdocs-react@1.2.12 + +## 0.2.103 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.29.4 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/core-app-api@1.15.3 + - @backstage/plugin-catalog@1.26.0 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/test-utils@1.7.3 + - @backstage/plugin-techdocs-react@1.2.12 + +## 0.2.103-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/app-defaults@1.5.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 0.2.103-next.1 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 3cb71cd2c8..c7685aab83 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.103-next.1", + "version": "0.2.104-next.2", "backstage": { "role": "frontend" }, diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index dd5a85ad53..ea73d21769 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,49 @@ # @techdocs/cli +## 1.8.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-techdocs-node@1.12.16-next.1 + - @backstage/cli-common@0.1.15 + +## 1.8.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/plugin-techdocs-node@1.12.16-next.0 + +## 1.8.24 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-techdocs-node@1.12.15 + - @backstage/catalog-model@1.7.2 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + +## 1.8.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + ## 1.8.24-next.1 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index e61fbd5c84..77e0f56974 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.8.24-next.1", + "version": "1.8.25-next.1", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 617abaa71a..a36766d16c 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/test-utils +## 1.7.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/theme@0.6.3 + +## 1.7.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.15.3 + - @backstage/theme@0.6.3 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-permission-react@0.4.29 + +## 1.7.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 1.7.3-next.0 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 0b9bd1ea92..394769e375 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/test-utils", - "version": "1.7.3-next.0", + "version": "1.7.4-next.0", "description": "Utilities to test Backstage plugins and apps.", "backstage": { "role": "web-library" diff --git a/packages/theme/CHANGELOG.md b/packages/theme/CHANGELOG.md index bf58f00548..f2a2f41a2f 100644 --- a/packages/theme/CHANGELOG.md +++ b/packages/theme/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/theme +## 0.6.3 + +### Patch Changes + +- 5f04976: Fixed a bug that caused missing code in published packages. + ## 0.6.3-next.0 ### Patch Changes diff --git a/packages/theme/package.json b/packages/theme/package.json index f30561bf91..089f42d49d 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/theme", - "version": "0.6.3-next.0", + "version": "0.6.3", "description": "material-ui theme for use with Backstage.", "backstage": { "role": "web-library" diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index c7980abd94..261db3ef73 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/types +## 1.2.1-next.0 + +### Patch Changes + +- b40eb41: Move `Expand` and `ExpandRecursive` to `@backstage/types` + ## 1.2.0 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index efbc62a9a2..ac5c7e121a 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/types", - "version": "1.2.0", + "version": "1.2.1-next.0", "description": "Common TypeScript types used within Backstage", "backstage": { "role": "common-library" diff --git a/packages/types/report.api.md b/packages/types/report.api.md index 8169a506ef..b6bfae0862 100644 --- a/packages/types/report.api.md +++ b/packages/types/report.api.md @@ -21,6 +21,20 @@ export type DeferredPromise< // @public export function durationToMilliseconds(duration: HumanDuration): number; +// @public +export type Expand = T extends infer O + ? { + [K in keyof O]: O[K]; + } + : never; + +// @public +export type ExpandRecursive = T extends infer O + ? { + [K in keyof O]: ExpandRecursive; + } + : never; + // @public export type HumanDuration = { years?: number; diff --git a/packages/types/src/expand.test.ts b/packages/types/src/expand.test.ts new file mode 100644 index 0000000000..007cef27ef --- /dev/null +++ b/packages/types/src/expand.test.ts @@ -0,0 +1,38 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Expand, ExpandRecursive } from './expand'; + +describe('expand', () => { + it('should expand type aliases into their equivalent type', () => { + type Test = { a: string } & { b: number }; + // expanded type + type Result = Expand; + + const result: Result = { a: 'string', b: 1 }; + expect(result).toEqual({ a: 'string', b: 1 }); + }); + + it('should expand types recursively', () => { + type Test = { a: string } & { b: { c: { e: string } } } & { + b: { c: { d: boolean } }; + }; + // expanded type + type Result = ExpandRecursive; + + const result: Result = { a: 'string', b: { c: { e: 'string', d: true } } }; + expect(result).toEqual({ a: 'string', b: { c: { e: 'string', d: true } } }); + }); +}); diff --git a/packages/types/src/expand.ts b/packages/types/src/expand.ts new file mode 100644 index 0000000000..6c417642e4 --- /dev/null +++ b/packages/types/src/expand.ts @@ -0,0 +1,31 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Utility type to expand type aliases into their equivalent type. + * @public + */ + +export type Expand = T extends infer O ? { [K in keyof O]: O[K] } : never; + +/** + * Helper type that expands type hints recursively + * + * @public + */ +export type ExpandRecursive = T extends infer O + ? { [K in keyof O]: ExpandRecursive } + : never; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 480c85818a..707c158b03 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -24,3 +24,4 @@ export { createDeferred, type DeferredPromise } from './deferred'; export type { JsonArray, JsonObject, JsonPrimitive, JsonValue } from './json'; export type { Observable, Observer, Subscription } from './observable'; export { type HumanDuration, durationToMilliseconds } from './time'; +export { type Expand, type ExpandRecursive } from './expand'; diff --git a/packages/yarn-plugin/CHANGELOG.md b/packages/yarn-plugin/CHANGELOG.md index 24f0a41354..6b7ba0c9fc 100644 --- a/packages/yarn-plugin/CHANGELOG.md +++ b/packages/yarn-plugin/CHANGELOG.md @@ -1,5 +1,17 @@ # yarn-plugin-backstage +## 0.0.4 + +### Patch Changes + +- 48cc7c5: Use yarn's built-in http utilities for fetching release manifests +- ac91864: Switch to using `reduceDependency` hook to replace `backstage:^` versions. This + makes the same yarn.lock file valid whether or not the plugin is installed. +- ee49cb4: Fixed path resolution on windows +- Updated dependencies + - @backstage/release-manifests@0.0.12 + - @backstage/cli-common@0.1.15 + ## 0.0.4-next.1 ### Patch Changes diff --git a/packages/yarn-plugin/README.md b/packages/yarn-plugin/README.md index 67ea19b1bd..c1d5647b8e 100644 --- a/packages/yarn-plugin/README.md +++ b/packages/yarn-plugin/README.md @@ -24,3 +24,17 @@ The resulting changes in the file system should be committed to your repo. The yarn plugin recognizes the version string `"backstage:^"`, and replaces it with the appropriate version based on the overall Backstage version in backstage.json. + +## Local Development + +- Run unit tests: `yarn test` +- Build the plugin locally: `yarn build` +- Rebuild whenever plugin files change: `yarn start` +- Install local build (in a package directory outside the Backstage monorepo): + `yarn plugin import +/path/to/backstage-repo/packages/yarn-plugin/bundles/@yarnpkg/plugin-backstage.js` + +The plugin can be manually tested in any repository running at least yarn 4.1.1. +Sadly it can't be manually tested directly in the Backstage monorepo - since +packages in this repository use `workspace:^` dependencies, there's no use case +for the yarn plugin. diff --git a/packages/yarn-plugin/package.json b/packages/yarn-plugin/package.json index bca6fed42f..742b9bbe93 100644 --- a/packages/yarn-plugin/package.json +++ b/packages/yarn-plugin/package.json @@ -1,6 +1,6 @@ { "name": "yarn-plugin-backstage", - "version": "0.0.4-next.1", + "version": "0.0.4", "description": "Yarn plugin for working with Backstage monorepos", "backstage": { "role": "node-library" @@ -41,6 +41,8 @@ "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@yarnpkg/builder": "^4.0.0", - "nodemon": "^3.0.1" + "fs-extra": "^11.2.0", + "nodemon": "^3.0.1", + "yaml": "^2.0.0" } } diff --git a/packages/yarn-plugin/report.api.md b/packages/yarn-plugin/report.api.md index 928703ed3e..620bbbb567 100644 --- a/packages/yarn-plugin/report.api.md +++ b/packages/yarn-plugin/report.api.md @@ -3,10 +3,11 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { Hooks } from '@yarnpkg/plugin-pack'; +import { Hooks } from '@yarnpkg/core'; +import { Hooks as Hooks_2 } from '@yarnpkg/plugin-pack'; import { Plugin as Plugin_2 } from '@yarnpkg/core'; // @public (undocumented) -const plugin: Plugin_2; +const plugin: Plugin_2; export default plugin; ``` diff --git a/packages/yarn-plugin/src/handlers/beforeWorkspacePacking.ts b/packages/yarn-plugin/src/handlers/beforeWorkspacePacking.ts index e5823607e3..436c949b1e 100644 --- a/packages/yarn-plugin/src/handlers/beforeWorkspacePacking.ts +++ b/packages/yarn-plugin/src/handlers/beforeWorkspacePacking.ts @@ -15,11 +15,7 @@ */ import { Descriptor, Workspace, structUtils } from '@yarnpkg/core'; -import { - bindBackstageVersion, - getCurrentBackstageVersion, - getPackageVersion, -} from '../util'; +import { getPackageVersion } from '../util'; import { PROTOCOL } from '../constants'; const hasBackstageVersion = (range: string) => @@ -45,8 +41,6 @@ export const beforeWorkspacePacking = async ( workspace: Workspace, rawManifest: any, ) => { - const backstageVersion = getCurrentBackstageVersion(); - for (const dependencyType of ['dependencies', 'devDependencies'] as const) { const entries = Array.from( workspace.manifest.getForScope(dependencyType).values(), @@ -69,7 +63,7 @@ export const beforeWorkspacePacking = async ( ); rawManifest[finalDependencyType][ident] = `^${await getPackageVersion( - bindBackstageVersion(descriptor, backstageVersion), + descriptor, workspace.project.configuration, )}`; } diff --git a/packages/yarn-plugin/src/handlers/index.ts b/packages/yarn-plugin/src/handlers/index.ts new file mode 100644 index 0000000000..baa144b36f --- /dev/null +++ b/packages/yarn-plugin/src/handlers/index.ts @@ -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 { beforeWorkspacePacking } from './beforeWorkspacePacking'; +export { reduceDependency } from './reduceDependency'; diff --git a/packages/yarn-plugin/src/handlers/reduceDependency.test.ts b/packages/yarn-plugin/src/handlers/reduceDependency.test.ts new file mode 100644 index 0000000000..dfe29485b6 --- /dev/null +++ b/packages/yarn-plugin/src/handlers/reduceDependency.test.ts @@ -0,0 +1,165 @@ +/* + * 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 { Configuration, Project, structUtils, httpUtils } from '@yarnpkg/core'; +import { npath, ppath } from '@yarnpkg/fslib'; +import { createMockDirectory } from '@backstage/backend-test-utils'; +import { reduceDependency } from './reduceDependency'; + +describe('reduceDependency', () => { + const mockDir = createMockDirectory(); + let project: Project; + let getMock: jest.SpyInstance< + ReturnType<(typeof httpUtils)['get']>, + Parameters<(typeof httpUtils)['get']> + >; + + beforeEach(() => { + project = new Project(ppath.cwd(), { + configuration: Configuration.create(ppath.cwd()), + }); + + jest + .spyOn(ppath, 'cwd') + .mockReturnValue(npath.toPortablePath(mockDir.path)); + + jest + .spyOn(process, 'cwd') + .mockReturnValue(npath.toPortablePath(mockDir.path)); + + getMock = jest.spyOn(httpUtils, 'get').mockResolvedValue({ + releaseVersion: '1.23.45', + packages: [ + { + name: '@backstage/core', + version: '6.7.8', + }, + ], + }); + + mockDir.setContent({ + 'backstage.json': JSON.stringify({ + version: '1.23.45', + }), + 'package.json': JSON.stringify({ + workspaces: { + packages: ['packages/*'], + }, + }), + packages: { + a: { + 'package.json': JSON.stringify({ + name: 'a', + dependencies: { + '@backstage/core': 'backstage:^', + }, + }), + }, + }, + }); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + it.each` + range + ${'npm:1.2.3'} + ${'link:../foo/bar'} + ${'workspace:^'} + `('returns non-backstage range "$range" unchanged', async ({ range }) => { + const descriptor = structUtils.makeDescriptor( + structUtils.makeIdent('backstage', 'core'), + range, + ); + + await expect(reduceDependency(descriptor, project)).resolves.toEqual( + descriptor, + ); + }); + + it.each` + selector + ${'*'} + ${'latest'} + `( + 'rejects backstage: ranges with invalid selector "$selector"', + async ({ selector }) => { + await expect( + reduceDependency( + structUtils.makeDescriptor( + structUtils.makeIdent('backstage', 'core'), + `backstage:${selector}`, + ), + project, + ), + ).rejects.toThrow(/unexpected version selector/i); + }, + ); + + describe('with range "backstage:^"', () => { + it('loads the manifest for the current Backstage version', async () => { + await reduceDependency( + structUtils.makeDescriptor( + structUtils.makeIdent('backstage', 'core'), + 'backstage:^', + ), + project, + ); + + expect(getMock).toHaveBeenCalledWith( + 'https://versions.backstage.io/v1/releases/1.23.45/manifest.json', + expect.anything(), + ); + }); + + it('replaces the range with the corresponding npm package range', async () => { + await expect( + reduceDependency( + structUtils.makeDescriptor( + structUtils.makeIdent('backstage', 'core'), + 'backstage:^', + ), + project, + ), + ).resolves.toEqual( + structUtils.makeDescriptor( + structUtils.makeIdent('backstage', 'core'), + 'npm:^6.7.8', + ), + ); + }); + + it(`throws for packages that don't appear in the manifest`, async () => { + await expect( + reduceDependency( + structUtils.makeDescriptor( + structUtils.makeIdent('backstage', 'other'), + 'backstage:^', + ), + project, + ), + ).rejects.toThrow( + expect.objectContaining({ + message: expect.stringContaining( + 'Package @backstage/other not found in manifest for Backstage v1.23.45', + ), + }), + ); + }); + }); +}); diff --git a/packages/yarn-plugin/src/handlers/reduceDependency.ts b/packages/yarn-plugin/src/handlers/reduceDependency.ts new file mode 100644 index 0000000000..e00a39c27c --- /dev/null +++ b/packages/yarn-plugin/src/handlers/reduceDependency.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 { Descriptor, Project, structUtils } from '@yarnpkg/core'; +import { getPackageVersion } from '../util'; +import { PROTOCOL } from '../constants'; + +export const reduceDependency = async ( + dependency: Descriptor, + project: Project, +) => { + const range = structUtils.parseRange(dependency.range); + + if (range.protocol === PROTOCOL) { + return structUtils.makeDescriptor( + dependency, + `npm:^${await getPackageVersion(dependency, project.configuration)}`, + ); + } + + return dependency; +}; diff --git a/packages/yarn-plugin/src/index.test.ts b/packages/yarn-plugin/src/index.test.ts new file mode 100644 index 0000000000..d58387bca9 --- /dev/null +++ b/packages/yarn-plugin/src/index.test.ts @@ -0,0 +1,306 @@ +/* + * 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 { join as joinPath } from 'path'; +import { spawn, SpawnOptionsWithoutStdio } from 'child_process'; +import fs from 'fs-extra'; +import yaml from 'yaml'; +import { findPaths } from '@backstage/cli-common'; +import { createMockDirectory } from '@backstage/backend-test-utils'; + +jest.setTimeout(30_000); + +const mockDir = createMockDirectory(); + +const executeCommand = ( + command: string, + args: string[], + options?: SpawnOptionsWithoutStdio, +): Promise<{ + exitCode: number; + stdout: string; + stderr: string; +}> => { + return new Promise((resolve, reject) => { + const stdout: Buffer[] = []; + const stderr: Buffer[] = []; + + const shell = process.platform === 'win32'; + const proc = spawn(command, args, { ...options, shell }); + + proc.stdout?.on('data', data => { + stdout.push(Buffer.from(data)); + }); + + proc.stderr?.on('data', data => { + stderr.push(Buffer.from(data)); + }); + + proc.on('error', reject); + proc.on('exit', exitCode => { + resolve({ + exitCode: exitCode ?? 0, + stdout: Buffer.concat(stdout).toString('utf8'), + stderr: Buffer.concat(stderr).toString('utf8'), + }); + }); + }); +}; + +const runYarnInstall = () => + executeCommand('yarn', ['--mode=update-lockfile'], { cwd: mockDir.path }); + +const nonWorkspaceEntries = (lockFileString: string = '') => { + const lockFile = yaml.parse(lockFileString); + + const result: Record = {}; + for (const key of Object.keys(lockFile)) { + if (lockFile[key].version !== '0.0.0-use.local') { + result[key] = lockFile[key]; + } + } + + return result; +}; + +describe('Backstage yarn plugin', () => { + describe.each` + yarnVersion + ${'4.1.1'} + ${'stable'} + `('yarn $yarnVersion', ({ yarnVersion }) => { + let initialLockFileContent: string | undefined; + + beforeAll(async () => { + const { targetRoot } = findPaths(process.cwd()); + await executeCommand('yarn', ['build'], { + cwd: joinPath(targetRoot, 'packages/yarn-plugin'), + }); + + mockDir.setContent({ + 'yarn.lock': '', + 'package.json': JSON.stringify({ + workspaces: { + packages: ['packages/*'], + }, + }), + 'backstage.json': JSON.stringify({ version: '0.9.0' }), + packages: { + a: { + 'package.json': JSON.stringify({ + name: 'a', + dependencies: { + '@backstage/config': '^0.1.2', + }, + }), + }, + b: { + 'package.json': JSON.stringify({ + name: 'b', + dependencies: { + '@backstage/cli-common': '^0.1.1', + '@backstage/config': '^0.1.2', + }, + }), + }, + }, + }); + + await executeCommand('yarn', ['set', 'version', yarnVersion], { + cwd: mockDir.path, + }); + + await executeCommand( + 'yarn', + ['config', 'set', 'enableGlobalCache', 'true'], + { cwd: mockDir.path }, + ); + + await runYarnInstall(); + + initialLockFileContent = await fs.readFile( + joinPath(mockDir.path, 'yarn.lock'), + 'utf-8', + ); + + await executeCommand( + 'yarn', + [ + 'plugin', + 'import', + joinPath( + targetRoot, + 'packages/yarn-plugin/bundles/@yarnpkg/plugin-backstage.js', + ), + ], + { + cwd: mockDir.path, + }, + ); + }); + + beforeEach(() => { + mockDir.addContent({ + 'backstage.json': JSON.stringify({ version: '0.9.0' }), + packages: { + a: { + 'package.json': JSON.stringify({ + name: 'a', + dependencies: { + '@backstage/config': '^0.1.2', + }, + }), + }, + b: { + 'package.json': JSON.stringify({ + name: 'b', + dependencies: { + '@backstage/cli-common': '^0.1.1', + '@backstage/config': '^0.1.2', + }, + }), + }, + }, + }); + }); + + it('does not change yarn.lock when no backstage:^ versions are present', async () => { + await runYarnInstall(); + + await expect( + fs.readFile(joinPath(mockDir.path, 'yarn.lock'), 'utf-8'), + ).resolves.toEqual(initialLockFileContent); + }); + + describe('with backstage:^ dependencies', () => { + beforeEach(async () => { + mockDir.addContent({ + 'packages/a/package.json': JSON.stringify({ + name: 'a', + dependencies: { + '@backstage/config': 'backstage:^', + }, + }), + 'packages/b/package.json': JSON.stringify({ + name: 'b', + dependencies: { + '@backstage/config': 'backstage:^', + '@backstage/cli-common': 'backstage:^', + }, + }), + }); + + await runYarnInstall(); + }); + + it('retains existing lockfile entries', async () => { + const lockFileContent = await fs.readFile( + joinPath(mockDir.path, 'yarn.lock'), + 'utf-8', + ); + + expect(nonWorkspaceEntries(lockFileContent)).toEqual( + nonWorkspaceEntries(initialLockFileContent), + ); + }); + + it('bumps packages when backstage.json changes', async () => { + mockDir.addContent({ + 'backstage.json': JSON.stringify({ + version: '1.0.0', + }), + }); + + await runYarnInstall(); + + const lockFileContent = await fs.readFile( + joinPath(mockDir.path, 'yarn.lock'), + 'utf-8', + ); + + const lockFile = yaml.parse(lockFileContent); + + // Versions from old manifest no longer appear in lockfile + expect(lockFile['@backstage/cli-common@npm:^0.1.1']).toBeUndefined(); + expect(lockFile['@backstage/config@npm:^0.1.2']).toBeUndefined(); + + // Versions from new manifest have been added to lockfile + expect(lockFile['@backstage/cli-common@npm:^0.1.8']).toBeDefined(); + expect(lockFile['@backstage/config@npm:^1.0.0']).toBeDefined(); + }); + + describe('after removing backstage:^ dependencies', () => { + beforeEach(async () => { + mockDir.addContent({ + 'packages/a/package.json': JSON.stringify({ + name: 'a', + dependencies: { + '@backstage/config': '^0.1.2', + }, + }), + 'packages/b/package.json': JSON.stringify({ + name: 'b', + dependencies: { + '@backstage/config': '^0.1.2', + '@backstage/cli-common': '^0.1.1', + }, + }), + }); + + await runYarnInstall(); + }); + + it('restores the original yarn.lock content', async () => { + const lockFileContent = await fs.readFile( + joinPath(mockDir.path, 'yarn.lock'), + 'utf-8', + ); + + expect(lockFileContent).toEqual(initialLockFileContent); + }); + }); + + describe.each` + packageName | description + ${'node-fetch'} | ${'non-Backstage package'} + ${'@backstage/foo'} | ${'invalid Backstage package'} + `( + 'when backstage:^ range is used with $description "$packageName"', + ({ packageName }) => { + beforeEach(async () => { + mockDir.addContent({ + 'packages/c/package.json': JSON.stringify({ + name: 'c', + dependencies: { + [packageName]: 'backstage:^', + }, + }), + }); + }); + + it('fails to install', async () => { + const { exitCode, stdout } = await runYarnInstall(); + + expect(exitCode).toEqual(1); + expect(stdout).toContain( + `Package ${packageName} not found in manifest for Backstage v0.9.0`, + ); + }); + }, + ); + }); + }); +}); diff --git a/packages/yarn-plugin/src/index.ts b/packages/yarn-plugin/src/index.ts index 9c20e9a45c..dcf2fe6943 100644 --- a/packages/yarn-plugin/src/index.ts +++ b/packages/yarn-plugin/src/index.ts @@ -21,10 +21,9 @@ * @packageDocumentation */ -import { Plugin, semverUtils, YarnVersion } from '@yarnpkg/core'; -import { Hooks } from '@yarnpkg/plugin-pack'; -import { beforeWorkspacePacking } from './handlers/beforeWorkspacePacking'; -import { BackstageResolver } from './resolver/BackstageResolver'; +import { Plugin, Hooks, semverUtils, YarnVersion } from '@yarnpkg/core'; +import { Hooks as PackHooks } from '@yarnpkg/plugin-pack'; +import { beforeWorkspacePacking, reduceDependency } from './handlers'; // All dependencies of the yarn plugin are bundled during the build. Chalk // triples the size of the plugin bundle when included, so we avoid the @@ -44,11 +43,11 @@ if (!semverUtils.satisfiesWithPrereleases(YarnVersion, '^4.1.1')) { /** * @public */ -const plugin: Plugin = { +const plugin: Plugin = { hooks: { + reduceDependency, beforeWorkspacePacking, }, - resolvers: [BackstageResolver], }; export default plugin; diff --git a/packages/yarn-plugin/src/resolver/BackstageResolver.test.ts b/packages/yarn-plugin/src/resolver/BackstageResolver.test.ts deleted file mode 100644 index 8cba189cb8..0000000000 --- a/packages/yarn-plugin/src/resolver/BackstageResolver.test.ts +++ /dev/null @@ -1,301 +0,0 @@ -/* - * 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 { - Configuration, - Project, - ResolveOptions, - structUtils, - ThrowReport, - httpUtils, -} from '@yarnpkg/core'; -import { npath, ppath } from '@yarnpkg/fslib'; -import { BackstageResolver } from './BackstageResolver'; -import { createMockDirectory } from '@backstage/backend-test-utils'; - -describe('BackstageResolver', () => { - const mockDir = createMockDirectory(); - let backstageResolver: BackstageResolver; - let resolveOptions: ResolveOptions; - - beforeEach(() => { - jest - .spyOn(ppath, 'cwd') - .mockReturnValue(npath.toPortablePath(mockDir.path)); - - jest - .spyOn(process, 'cwd') - .mockReturnValue(npath.toPortablePath(mockDir.path)); - - jest.spyOn(httpUtils, 'get').mockResolvedValue({ - releaseVersion: '1.23.45', - packages: [ - { - name: '@backstage/core', - version: '6.7.8', - }, - ], - }); - - mockDir.setContent({ - 'backstage.json': JSON.stringify({ - version: '1.23.45', - }), - 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, - }), - packages: { - a: { - 'package.json': JSON.stringify({ - name: 'a', - dependencies: { - '@backstage/core': 'backstage:^', - }, - }), - }, - }, - }); - - backstageResolver = new BackstageResolver(); - - resolveOptions = { - resolver: backstageResolver, - project: new Project(ppath.cwd(), { - configuration: Configuration.create(ppath.cwd()), - }), - report: new ThrowReport(), - }; - }); - - afterEach(() => { - jest.restoreAllMocks(); - }); - - describe('supportsDescriptor', () => { - it.each([ - ['backstage:^'], - ['backstage:1.26.0-next.3'], - ['backstage:anything'], - ])('returns true for range "%s"', range => { - expect( - backstageResolver.supportsDescriptor( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - range, - ), - ), - ).toEqual(true); - }); - }); - - describe('bindDescriptor', () => { - describe('with range "backstage:^"', () => { - it('returns a descriptor with a version range for the current Backstage version', () => { - expect( - backstageResolver.bindDescriptor( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - 'backstage:^', - ), - ), - ).toEqual( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - 'backstage:^::v=1.23.45', - ), - ); - }); - }); - - describe('with range "backstage:^::v=1.23.45"', () => { - it('returns the correct descriptor', () => { - expect( - backstageResolver.bindDescriptor( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - 'backstage:^::v=1.23.45', - ), - ), - ).toEqual( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - 'backstage:^::v=1.23.45', - ), - ); - }); - }); - }); - - describe('getCandidates', () => { - it('returns an npm: descriptor based on the manifest for the appropriate backstage version', async () => { - const descriptor = structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - 'backstage:^::v=1.23.45', - ); - - await expect( - backstageResolver.getCandidates(descriptor, {}, resolveOptions), - ).resolves.toEqual([structUtils.makeLocator(descriptor, 'npm:6.7.8')]); - }); - - it('rejects descriptors not using the backstage: protocol', async () => { - await expect( - backstageResolver.getCandidates( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - 'npm:1.2.3', - ), - {}, - resolveOptions, - ), - ).rejects.toThrow(/unsupported version protocol/i); - }); - - it('rejects backstage: ranges missing a version parameter', async () => { - await expect( - backstageResolver.getCandidates( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - 'backstage:^', - ), - {}, - resolveOptions, - ), - ).rejects.toThrow(/missing Backstage version/i); - }); - - it('rejects backstage: ranges with multiple version parameters', async () => { - await expect( - backstageResolver.getCandidates( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - 'backstage:^::v=1&v=2', - ), - {}, - resolveOptions, - ), - ).rejects.toThrow(/multiple Backstage versions/i); - }); - - it.each` - selector - ${'*'} - ${'latest'} - `( - 'rejects backstage: ranges with invalid selector "$selector"', - async ({ selector }) => { - await expect( - backstageResolver.getCandidates( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - `backstage:${selector}`, - ), - {}, - resolveOptions, - ), - ).rejects.toThrow(/unexpected version selector/i); - }, - ); - }); - - describe('getSatisfying', () => { - it('filters out locators for other packages', async () => { - await expect( - backstageResolver.getSatisfying( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - 'backstage:^::v=1.23.45', - ), - {}, - [ - structUtils.makeLocator( - structUtils.makeIdent('backstage', 'foo'), - 'npm:1.2.3', - ), - structUtils.makeLocator( - structUtils.makeIdent('backstage', 'core'), - 'npm:6.7.8', - ), - structUtils.makeLocator( - structUtils.makeIdent('backstage', 'bar'), - 'npm:1.2.3', - ), - ], - resolveOptions, - ), - ).resolves.toEqual({ - locators: [ - structUtils.makeLocator( - structUtils.makeIdent('backstage', 'core'), - 'npm:6.7.8', - ), - ], - sorted: true, - }); - }); - - it('filters out locators for other package versions', async () => { - await expect( - backstageResolver.getSatisfying( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - 'backstage:^::v=1.23.45', - ), - {}, - [ - structUtils.makeLocator( - structUtils.makeIdent('backstage', 'core'), - 'npm:5.6.7', - ), - structUtils.makeLocator( - structUtils.makeIdent('backstage', 'core'), - 'npm:6.7.8', - ), - structUtils.makeLocator( - structUtils.makeIdent('backstage', 'bar'), - 'npm:7.8.9', - ), - ], - resolveOptions, - ), - ).resolves.toEqual({ - locators: [ - structUtils.makeLocator( - structUtils.makeIdent('backstage', 'core'), - 'npm:6.7.8', - ), - ], - sorted: true, - }); - }); - - it('throws for non `backstage:` descriptors', async () => { - await expect( - backstageResolver.getSatisfying( - structUtils.makeDescriptor( - structUtils.makeIdent('backstage', 'core'), - 'npm:1.2.3', - ), - {}, - [], - resolveOptions, - ), - ).rejects.toThrow(/unsupported version protocol/i); - }); - }); -}); diff --git a/packages/yarn-plugin/src/resolver/BackstageResolver.ts b/packages/yarn-plugin/src/resolver/BackstageResolver.ts deleted file mode 100644 index d2d0c98d1e..0000000000 --- a/packages/yarn-plugin/src/resolver/BackstageResolver.ts +++ /dev/null @@ -1,128 +0,0 @@ -/* - * 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 { - structUtils, - Descriptor, - Locator, - Package, - Resolver, - ResolveOptions, -} from '@yarnpkg/core'; -import { PROTOCOL } from '../constants'; -import { - bindBackstageVersion, - getCurrentBackstageVersion, - getPackageVersion, -} from '../util'; - -export class BackstageResolver implements Resolver { - static protocol = PROTOCOL; - - supportsDescriptor = (descriptor: Descriptor) => - descriptor.range.startsWith(BackstageResolver.protocol); - - shouldPersistResolution = () => true; - - /** - * Called for each dependency present in the dependency list of a package - * definition. If it returns a new descriptor, this new descriptor will be - * used. - * - * In this plugin, we convert the specific range "backstage:^" to - * "backstage:". This new range will be the one - * stored in lockfile entries, ensuring that we re-resolve the package when - * the version in backstage.json changes. - */ - bindDescriptor(descriptor: Descriptor): Descriptor { - if (descriptor.range === 'backstage:^') { - return bindBackstageVersion(descriptor, getCurrentBackstageVersion()); - } - - return descriptor; - } - - /** - * Given a descriptor, return the list of locators that potentially satisfy - * it. The implementation in this plugin converts a `backstage:` range with a - * concrete version into the appropriate concrete npm version for that - * backstage release. - */ - async getCandidates( - descriptor: Descriptor, - _dependencies: Record, - opts: ResolveOptions, - ): Promise { - return [ - structUtils.makeLocator( - descriptor, - `npm:${await getPackageVersion( - descriptor, - opts.project.configuration, - )}`, - ), - ]; - } - - /** - * Given a descriptor and a list of possible locators, return a filtered list - * containing only locators that satisfy the descriptor. Since each Backstage - * release version corresponds to a single version for each package, we just - * need to filter that array for locators with that exact version. - */ - async getSatisfying( - descriptor: Descriptor, - _dependencies: Record, - locators: Array, - opts: ResolveOptions, - ): Promise<{ locators: Locator[]; sorted: boolean }> { - const packageVersion = await getPackageVersion( - descriptor, - opts.project.configuration, - ); - - return { - locators: locators.filter( - locator => - structUtils.areIdentsEqual(descriptor, locator) && - locator.reference === `npm:${packageVersion}`, - ), - sorted: true, - }; - } - - /** - * This plugin does not need to support any locators itself, since the - * `getCandidates` method will always convert `backstage:` versions into - * `npm:` versions which can be handled as usual. - */ - supportsLocator = () => false; - - /** - * This resolver never transforms the packages that are actually depended on, - * only replaces versions. As such there's never a need to add additional - * dependencies. - */ - getResolutionDependencies = () => ({}); - - /** - * Once transformed into locators (through getCandidates), the versions are - * resolved by the NpmSemverResolver - */ - async resolve(): Promise { - throw new Error(`Unreachable`); - } -} diff --git a/packages/yarn-plugin/src/util/getCurrentBackstageVersion.test.ts b/packages/yarn-plugin/src/util/getCurrentBackstageVersion.test.ts new file mode 100644 index 0000000000..4b1f008fce --- /dev/null +++ b/packages/yarn-plugin/src/util/getCurrentBackstageVersion.test.ts @@ -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 { npath, ppath, xfs } from '@yarnpkg/fslib'; +import { createMockDirectory } from '@backstage/backend-test-utils'; +import { memoize } from './memoize'; +import { getCurrentBackstageVersion } from './getCurrentBackstageVersion'; + +/** + * Disable memoization to allow testing behavior under a variety of + * circumstances. + */ +jest.mock('./memoize', () => { + const memoizeMock: jest.MockedFn & { + memoizationEnabled?: boolean; + } = jest.fn(fn => { + const memoized = jest.requireActual('./memoize').memoize(fn); + + return () => { + if (memoizeMock.memoizationEnabled) { + return memoized(); + } + + return fn(); + }; + }); + + return { memoize: memoizeMock }; +}); + +const memoizeMock = memoize as jest.MockedFunction & { + memoizationEnabled?: boolean; +}; + +describe('getCurrentBackstageVersion', () => { + const mockDir = createMockDirectory(); + + beforeEach(() => { + jest + .spyOn(process, 'cwd') + .mockReturnValue(npath.toPortablePath(mockDir.path)); + + jest + .spyOn(ppath, 'cwd') + .mockReturnValue(npath.toPortablePath(mockDir.path)); + + mockDir.setContent({ + 'package.json': JSON.stringify({}), + }); + }); + + it('retrieves the version of Backstage from backstage.json', () => { + mockDir.addContent({ + 'backstage.json': JSON.stringify({ + version: '1.23.45', + }), + }); + + expect(getCurrentBackstageVersion()).toEqual('1.23.45'); + }); + + it.each` + description | content + ${'is missing'} | ${{}} + ${'is invalid'} | ${{ 'backstage.json': '}{' }} + ${'has missing version'} | ${{ 'backstage.json': '{"a":"b"}' }} + ${'has invalid version'} | ${{ 'backstage.json': '{"version":"foobar"}' }} + `('throws if backstage.json $description', ({ content }) => { + mockDir.addContent(content); + + expect(() => getCurrentBackstageVersion()).toThrow( + /valid version string not found/i, + ); + }); + + it('caches repeated calls', () => { + mockDir.addContent({ + 'backstage.json': JSON.stringify({ + version: '1.23.45', + }), + }); + + memoizeMock.memoizationEnabled = true; + + const readJsonSyncSpy = jest.spyOn(xfs, 'readJsonSync'); + + expect(readJsonSyncSpy).toHaveBeenCalledTimes(0); + + getCurrentBackstageVersion(); + getCurrentBackstageVersion(); + + expect(readJsonSyncSpy).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/yarn-plugin/src/util/getCurrentBackstageVersion.ts b/packages/yarn-plugin/src/util/getCurrentBackstageVersion.ts new file mode 100644 index 0000000000..5280854fb3 --- /dev/null +++ b/packages/yarn-plugin/src/util/getCurrentBackstageVersion.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. + */ + +import assert from 'assert'; +import { valid as semverValid } from 'semver'; +import { ppath, xfs } from '@yarnpkg/fslib'; +import { BACKSTAGE_JSON } from '@backstage/cli-common'; +import { memoize } from './memoize'; +import { getWorkspaceRoot } from './getWorkspaceRoot'; + +export const getCurrentBackstageVersion = memoize(() => { + const backstageJsonPath = ppath.join(getWorkspaceRoot(), BACKSTAGE_JSON); + + let backstageVersion: string | null = null; + try { + backstageVersion = semverValid(xfs.readJsonSync(backstageJsonPath).version); + + assert(backstageVersion !== null); + } catch { + throw new Error('Valid version string not found in backstage.json'); + } + + return backstageVersion; +}); diff --git a/packages/yarn-plugin/src/util.ts b/packages/yarn-plugin/src/util/getPackageVersion.ts similarity index 72% rename from packages/yarn-plugin/src/util.ts rename to packages/yarn-plugin/src/util/getPackageVersion.ts index ee89a647e3..25ff795c06 100644 --- a/packages/yarn-plugin/src/util.ts +++ b/packages/yarn-plugin/src/util/getPackageVersion.ts @@ -20,35 +20,10 @@ import { httpUtils, structUtils, } from '@yarnpkg/core'; -import { ppath, xfs } from '@yarnpkg/fslib'; -import { valid as semverValid } from 'semver'; -import { BACKSTAGE_JSON, findPaths } from '@backstage/cli-common'; import { getManifestByVersion } from '@backstage/release-manifests'; -import { PROTOCOL } from './constants'; - -export const getCurrentBackstageVersion = () => { - const workspaceRoot = ppath.resolve(findPaths(ppath.cwd()).targetRoot); - - const backstageJson = xfs.readJsonSync( - ppath.join(workspaceRoot, BACKSTAGE_JSON), - ); - - const backstageVersion = semverValid(backstageJson.version); - - if (backstageVersion === null) { - throw new Error('Valid version string not found in backstage.json'); - } - - return backstageVersion; -}; - -export const bindBackstageVersion = ( - descriptor: Descriptor, - backstageVersion: string, -) => { - return structUtils.bindDescriptor(descriptor, { v: backstageVersion }); -}; +import { PROTOCOL } from '../constants'; +import { getCurrentBackstageVersion } from './getCurrentBackstageVersion'; export const getPackageVersion = async ( descriptor: Descriptor, @@ -69,20 +44,10 @@ export const getPackageVersion = async ( ); } - if (!range.params?.v) { - throw new Error( - `Missing Backstage version parameter in range "${descriptor.range}" for package ${ident}`, - ); - } - - if (Array.isArray(range.params.v)) { - throw new Error( - `Multiple Backstage versions specified in range "${descriptor.range}" for package ${ident}`, - ); - } + const backstageVersion = getCurrentBackstageVersion(); const manifest = await getManifestByVersion({ - version: range.params.v, + version: backstageVersion, // We override the fetch function used inside getManifestByVersion with a // custom implementation that calls yarn's built-in `httpUtils` method // instead. This has a couple of benefits: @@ -121,7 +86,7 @@ export const getPackageVersion = async ( if (!manifestEntry) { throw new Error( - `Package ${ident} not found in manifest for Backstage v${range.selector}. ` + + `Package ${ident} not found in manifest for Backstage v${backstageVersion}. ` + `This means the specified package is not included in this Backstage ` + `release. This may imply the package has been replaced with an alternative - ` + `please review the documentation for the package. If you need to continue ` + diff --git a/packages/yarn-plugin/src/util/getWorkspaceRoot.test.ts b/packages/yarn-plugin/src/util/getWorkspaceRoot.test.ts new file mode 100644 index 0000000000..11538b3d50 --- /dev/null +++ b/packages/yarn-plugin/src/util/getWorkspaceRoot.test.ts @@ -0,0 +1,70 @@ +/* + * 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 { findPaths, Paths } from '@backstage/cli-common'; + +const setPlatform = (platform: string) => { + Object.defineProperty(process, `platform`, { + configurable: true, + value: platform, + }); +}; + +describe('getWorkspaceRoot', () => { + /** + * Yarn uses a PortablePath type which uses the posix separator + * regardless of platform and prefixes absolute paths with a separator. + * + * https://yarnpkg.com/api/yarnpkg-fslib#type-safe-paths + */ + describe.each` + platform | native | portable + ${'darwin'} | ${'/test/workspace/'} | ${'/test/workspace/'} + ${'win32'} | ${'C:\\test\\workspace\\'} | ${'/C:/test/workspace/'} + `('platform: $platform', ({ platform, native, portable }) => { + let realPlatform: string; + let getWorkspaceRoot: () => string; + let mockFindPaths: jest.MockedFunction; + + beforeEach(() => { + realPlatform = process.platform; + setPlatform(platform); + + jest.resetModules(); + + mockFindPaths = jest.fn(); + + jest.doMock('@backstage/cli-common', () => ({ + ...jest.requireActual('@backstage/cli-common'), + findPaths: mockFindPaths, + })); + + getWorkspaceRoot = require('./getWorkspaceRoot').getWorkspaceRoot; + }); + + afterEach(() => { + setPlatform(realPlatform); + }); + + it('returns an appropriately-formatted workspace root path', () => { + mockFindPaths.mockReturnValue({ + targetRoot: native, + } as Paths); + + expect(getWorkspaceRoot()).toEqual(portable); + }); + }); +}); diff --git a/packages/yarn-plugin/src/util/getWorkspaceRoot.ts b/packages/yarn-plugin/src/util/getWorkspaceRoot.ts new file mode 100644 index 0000000000..d6f3e98e10 --- /dev/null +++ b/packages/yarn-plugin/src/util/getWorkspaceRoot.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 { npath, ppath } from '@yarnpkg/fslib'; +import { findPaths } from '@backstage/cli-common'; + +export const getWorkspaceRoot = () => { + return npath.toPortablePath( + findPaths(npath.fromPortablePath(ppath.cwd())).targetRoot, + ); +}; diff --git a/packages/yarn-plugin/src/util/index.ts b/packages/yarn-plugin/src/util/index.ts new file mode 100644 index 0000000000..139c033468 --- /dev/null +++ b/packages/yarn-plugin/src/util/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 { getPackageVersion } from './getPackageVersion'; diff --git a/packages/yarn-plugin/src/util/memoize.test.ts b/packages/yarn-plugin/src/util/memoize.test.ts new file mode 100644 index 0000000000..4f8c761eea --- /dev/null +++ b/packages/yarn-plugin/src/util/memoize.test.ts @@ -0,0 +1,31 @@ +/* + * 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 { memoize } from './memoize'; + +describe('memoize', () => { + it('memoizes', () => { + const mockFunc = jest.fn().mockReturnValue('abc'); + + const memoized = memoize(mockFunc); + + expect(memoized()).toEqual('abc'); + expect(memoized()).toEqual('abc'); + expect(memoized()).toEqual('abc'); + + expect(mockFunc).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/yarn-plugin/src/util/memoize.ts b/packages/yarn-plugin/src/util/memoize.ts new file mode 100644 index 0000000000..b224f22467 --- /dev/null +++ b/packages/yarn-plugin/src/util/memoize.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. + */ + +export const memoize = (fn: () => T): typeof fn => { + let invoked = false; + let result: ReturnType; + + return () => { + if (!invoked) { + result = fn(); + invoked = true; + } + + return result; + }; +}; diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 406eba89a4..b82ed199c7 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-api-docs +## 0.12.3-next.1 + +### Patch Changes + +- dcf6e72: Fix typo in default path of api docs definition route +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.1 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## 0.12.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-catalog@1.26.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## 0.12.2 + +### Patch Changes + +- 11babd9: Fix link styling in ProvidedApisCard component so it aligns with other card components. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-catalog@1.26.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-react@0.4.29 + +## 0.12.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 0.12.2-next.1 ### Patch Changes diff --git a/plugins/api-docs/README-alpha.md b/plugins/api-docs/README-alpha.md index d92fdb53da..ddff429135 100644 --- a/plugins/api-docs/README-alpha.md +++ b/plugins/api-docs/README-alpha.md @@ -826,10 +826,10 @@ export default createFrontendModule({ createEntityContentExtension({ // Name is necessary so the system knows that this extension will override the default 'definition' entity content extension provided by the 'api-docs' plugin name: 'definition', - // Returing a custom content component + // Returning a custom content component loader: () => import('./components').then(m => ( - + )), }), ], diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 30b73fc398..96243c125e 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-api-docs", - "version": "0.12.2-next.1", + "version": "0.12.3-next.1", "description": "A Backstage plugin that helps represent API entities in the frontend", "backstage": { "role": "frontend-plugin", diff --git a/plugins/api-docs/src/alpha.tsx b/plugins/api-docs/src/alpha.tsx index b38bfc6c91..c6757e180e 100644 --- a/plugins/api-docs/src/alpha.tsx +++ b/plugins/api-docs/src/alpha.tsx @@ -189,7 +189,7 @@ const apiDocsProvidingComponentsEntityCard = EntityCardBlueprint.make({ const apiDocsDefinitionEntityContent = EntityContentBlueprint.make({ name: 'definition', params: { - defaultPath: '/defintion', + defaultPath: '/definition', defaultTitle: 'Definition', filter: 'kind:api', loader: async () => diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index df45b6dd06..5e396ff5f8 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,62 @@ # @backstage/plugin-app-backend +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-app-node@0.1.29-next.1 + +## 0.4.4-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/config-loader@1.9.5-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-app-node@0.1.29-next.0 + +## 0.4.3 + +### Patch Changes + +- 74c3f2a: Fixed a bug where config would not be injected on the `/` and `/index.html` paths. +- 5c9cc05: Use native fetch instead of node-fetch +- d66fa80: Fix root route handling when query parameters are present +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-app-node@0.1.28 + +## 0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-app-node@0.1.28-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.4.3-next.1 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 0743eac013..fb70b82ec8 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-backend", - "version": "0.4.3-next.1", + "version": "0.4.4-next.1", "description": "A Backstage backend plugin that serves the Backstage frontend app", "backstage": { "role": "backend-plugin", @@ -57,7 +57,6 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/config-loader": "workspace:^", diff --git a/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts b/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts index 1179a11ef3..86e8119cb2 100644 --- a/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts +++ b/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { PluginDatabaseManager } from '@backstage/backend-common'; import { Knex } from 'knex'; import { DateTime } from 'luxon'; import partition from 'lodash/partition'; import { StaticAsset, StaticAssetInput, StaticAssetProvider } from './types'; import { + DatabaseService, LoggerService, resolvePackagePath, } from '@backstage/backend-plugin-api'; @@ -38,7 +38,7 @@ interface StaticAssetRow { /** @internal */ export interface StaticAssetsStoreOptions { - database: PluginDatabaseManager; + database: DatabaseService; logger: LoggerService; } diff --git a/plugins/app-backend/src/service/appPlugin.test.ts b/plugins/app-backend/src/service/appPlugin.test.ts index 068405c19c..0c5ac1efb0 100644 --- a/plugins/app-backend/src/service/appPlugin.test.ts +++ b/plugins/app-backend/src/service/appPlugin.test.ts @@ -20,7 +20,6 @@ import { startTestBackend, } from '@backstage/backend-test-utils'; import { appPlugin } from './appPlugin'; -import { createRootLogger } from '@backstage/backend-common'; import { overridePackagePathResolution } from '@backstage/backend-plugin-api/testUtils'; const mockDir = createMockDirectory(); @@ -29,9 +28,6 @@ overridePackagePathResolution({ path: mockDir.path, }); -// Make sure root logger is initialized ahead of FS mock -createRootLogger(); - describe('appPlugin', () => { afterEach(() => { mockDir.clear(); diff --git a/plugins/app-backend/src/service/router.ts b/plugins/app-backend/src/service/router.ts index 24671fe5e9..4926383638 100644 --- a/plugins/app-backend/src/service/router.ts +++ b/plugins/app-backend/src/service/router.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { notFoundHandler } from '@backstage/backend-common'; import { DatabaseService, resolvePackagePath, @@ -22,7 +21,7 @@ import { } from '@backstage/backend-plugin-api'; import { AppConfig } from '@backstage/config'; import helmet from 'helmet'; -import express from 'express'; +import express, { Request, Response } from 'express'; import Router from 'express-promise-router'; import fs from 'fs-extra'; import { resolve as resolvePath } from 'path'; @@ -299,7 +298,9 @@ async function createEntryPointRouter({ if (staticFallbackHandler) { staticRouter.use(staticFallbackHandler); } - staticRouter.use(notFoundHandler()); + staticRouter.use((_req: Request, res: Response) => { + res.status(404).end(); + }); router.use('/static', staticRouter); diff --git a/plugins/app-node/CHANGELOG.md b/plugins/app-node/CHANGELOG.md index 6b2aae8034..3cafb1c6ed 100644 --- a/plugins/app-node/CHANGELOG.md +++ b/plugins/app-node/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-app-node +## 0.1.29-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config-loader@1.9.5-next.1 + +## 0.1.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.9.5-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.1.28 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/config-loader@1.9.3 + +## 0.1.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/config-loader@1.9.3-next.1 + ## 0.1.28-next.1 ### Patch Changes diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json index 4cc057a1d2..f812406fca 100644 --- a/plugins/app-node/package.json +++ b/plugins/app-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-node", - "version": "0.1.28-next.1", + "version": "0.1.29-next.1", "description": "Node.js library for the app plugin", "backstage": { "role": "node-library", diff --git a/plugins/app-visualizer/CHANGELOG.md b/plugins/app-visualizer/CHANGELOG.md index 386f022eaa..d7b6267ef2 100644 --- a/plugins/app-visualizer/CHANGELOG.md +++ b/plugins/app-visualizer/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-app-visualizer +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + +## 0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + ## 0.1.14-next.1 ### Patch Changes diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index 5d919d8749..c3c05c95d9 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-visualizer", - "version": "0.1.14-next.1", + "version": "0.1.15-next.0", "description": "Visualizes the Backstage app structure", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app/CHANGELOG.md b/plugins/app/CHANGELOG.md index d49f7a8304..8826b4776d 100644 --- a/plugins/app/CHANGELOG.md +++ b/plugins/app/CHANGELOG.md @@ -1,5 +1,43 @@ # @backstage/plugin-app +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/theme@0.6.3 + +## 0.1.4 + +### 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 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-permission-react@0.4.29 + +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/app/package.json b/plugins/app/package.json index e4f4cb333d..6d788c8dc8 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app", - "version": "0.1.4-next.1", + "version": "0.1.5-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "app", diff --git a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md index 45adec8243..b06a538736 100644 --- a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-auth-backend-module-atlassian-provider +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-atlassian-provider/package.json b/plugins/auth-backend-module-atlassian-provider/package.json index 34c477e1ee..7d5485db48 100644 --- a/plugins/auth-backend-module-atlassian-provider/package.json +++ b/plugins/auth-backend-module-atlassian-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-atlassian-provider", - "version": "0.3.3-next.1", + "version": "0.3.4-next.1", "description": "The atlassian-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-auth0-provider/CHANGELOG.md b/plugins/auth-backend-module-auth0-provider/CHANGELOG.md index bd72623c32..ba38906b6f 100644 --- a/plugins/auth-backend-module-auth0-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-auth0-provider/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-auth-backend-module-auth0-provider +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-auth0-provider/package.json b/plugins/auth-backend-module-auth0-provider/package.json index ad857a3ddb..2f138ff440 100644 --- a/plugins/auth-backend-module-auth0-provider/package.json +++ b/plugins/auth-backend-module-auth0-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-auth0-provider", - "version": "0.1.3-next.1", + "version": "0.1.4-next.1", "description": "The auth0-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md index bab6b48dab..1b41c5c8e3 100644 --- a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-auth-backend-module-aws-alb-provider +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + +## 0.3.1 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.1 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + +## 0.3.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.3.1-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-aws-alb-provider/package.json b/plugins/auth-backend-module-aws-alb-provider/package.json index 9c051165d7..8ac11cc481 100644 --- a/plugins/auth-backend-module-aws-alb-provider/package.json +++ b/plugins/auth-backend-module-aws-alb-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-aws-alb-provider", - "version": "0.3.1-next.1", + "version": "0.3.2-next.1", "description": "The aws-alb provider module for the Backstage auth backend.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md index 7808d77a28..ecb6e5056d 100644 --- a/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-auth-backend-module-azure-easyauth-provider +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/errors@1.2.6 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-azure-easyauth-provider/package.json b/plugins/auth-backend-module-azure-easyauth-provider/package.json index c521b33435..a9de03f65a 100644 --- a/plugins/auth-backend-module-azure-easyauth-provider/package.json +++ b/plugins/auth-backend-module-azure-easyauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-azure-easyauth-provider", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "The azure-easyauth-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md index 1111537aa4..36e0883f9c 100644 --- a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-auth-backend-module-bitbucket-provider +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-bitbucket-provider/package.json b/plugins/auth-backend-module-bitbucket-provider/package.json index ded19e9238..a063375298 100644 --- a/plugins/auth-backend-module-bitbucket-provider/package.json +++ b/plugins/auth-backend-module-bitbucket-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-bitbucket-provider", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "The bitbucket-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md b/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md index 687583ebf0..4d4ba8ad3b 100644 --- a/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-auth-backend-module-bitbucket-server-provider +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.1.3 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-bitbucket-server-provider/package.json b/plugins/auth-backend-module-bitbucket-server-provider/package.json index 589e4fa91c..4175f53a66 100644 --- a/plugins/auth-backend-module-bitbucket-server-provider/package.json +++ b/plugins/auth-backend-module-bitbucket-server-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-bitbucket-server-provider", - "version": "0.1.3-next.1", + "version": "0.1.4-next.1", "description": "The bitbucket-server-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md index 6db569fbde..47a1dad35a 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-auth-backend-module-cloudflare-access-provider +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + +## 0.3.3 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-cloudflare-access-provider/package.json b/plugins/auth-backend-module-cloudflare-access-provider/package.json index 994d2df694..fc73e0b7be 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/package.json +++ b/plugins/auth-backend-module-cloudflare-access-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-cloudflare-access-provider", - "version": "0.3.3-next.1", + "version": "0.3.4-next.1", "description": "The cloudflare-access-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md index f34710f0a1..222ce814d7 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-auth-backend-module-gcp-iap-provider +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/types@1.2.0 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-gcp-iap-provider/package.json b/plugins/auth-backend-module-gcp-iap-provider/package.json index b5a9c4bd68..6027a031c0 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/package.json +++ b/plugins/auth-backend-module-gcp-iap-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-gcp-iap-provider", - "version": "0.3.3-next.1", + "version": "0.3.4-next.1", "description": "A GCP IAP auth provider module for the Backstage auth backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-github-provider/CHANGELOG.md b/plugins/auth-backend-module-github-provider/CHANGELOG.md index 9dd1e27943..c2c991e790 100644 --- a/plugins/auth-backend-module-github-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-github-provider/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-auth-backend-module-github-provider +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-github-provider/package.json b/plugins/auth-backend-module-github-provider/package.json index 45b2495e7a..58f09cddbe 100644 --- a/plugins/auth-backend-module-github-provider/package.json +++ b/plugins/auth-backend-module-github-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-github-provider", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "The github-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md index 5822e9b8aa..e82db0a635 100644 --- a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-auth-backend-module-gitlab-provider +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-gitlab-provider/package.json b/plugins/auth-backend-module-gitlab-provider/package.json index eb8efa482f..a34118c32d 100644 --- a/plugins/auth-backend-module-gitlab-provider/package.json +++ b/plugins/auth-backend-module-gitlab-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-gitlab-provider", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "The gitlab-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-google-provider/CHANGELOG.md b/plugins/auth-backend-module-google-provider/CHANGELOG.md index 023721fd6e..8db132cdf5 100644 --- a/plugins/auth-backend-module-google-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-google-provider/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-auth-backend-module-google-provider +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.2.3 + +### Patch Changes + +- 79b055a: Pass through `includeGrantedScopes` in order to persist scopes across refresh calls +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-google-provider/package.json b/plugins/auth-backend-module-google-provider/package.json index 169ae171b6..d21f7bac17 100644 --- a/plugins/auth-backend-module-google-provider/package.json +++ b/plugins/auth-backend-module-google-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-google-provider", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "A Google auth provider module for the Backstage auth backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-guest-provider/CHANGELOG.md b/plugins/auth-backend-module-guest-provider/CHANGELOG.md index 64f8deaaa4..7ab4aad177 100644 --- a/plugins/auth-backend-module-guest-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-guest-provider/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-auth-backend-module-guest-provider +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/errors@1.2.6 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-guest-provider/package.json b/plugins/auth-backend-module-guest-provider/package.json index 53bd5b72ba..5e4ddfd3fb 100644 --- a/plugins/auth-backend-module-guest-provider/package.json +++ b/plugins/auth-backend-module-guest-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-guest-provider", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "The guest-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md index aa043345a7..4fffc7d752 100644 --- a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-auth-backend-module-microsoft-provider +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.2.3 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-microsoft-provider/package.json b/plugins/auth-backend-module-microsoft-provider/package.json index 4a66ca2e32..ed56d44cf4 100644 --- a/plugins/auth-backend-module-microsoft-provider/package.json +++ b/plugins/auth-backend-module-microsoft-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-microsoft-provider", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "The microsoft-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md index 1214418320..535fd08171 100644 --- a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-auth-backend-module-oauth2-provider +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-provider/package.json b/plugins/auth-backend-module-oauth2-provider/package.json index b75f6e39c2..0596fa8ac7 100644 --- a/plugins/auth-backend-module-oauth2-provider/package.json +++ b/plugins/auth-backend-module-oauth2-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-provider", - "version": "0.3.3-next.1", + "version": "0.3.4-next.1", "description": "The oauth2-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md index 44c74e288c..f69db092d0 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-auth-backend-module-oauth2-proxy-provider +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/package.json b/plugins/auth-backend-module-oauth2-proxy-provider/package.json index 8b173df200..05349f834b 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/package.json +++ b/plugins/auth-backend-module-oauth2-proxy-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-proxy-provider", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "The oauth2-proxy-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md index 5900d01590..9ecc4596e8 100644 --- a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-auth-backend-module-oidc-provider +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-backend@0.24.2-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.1 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-oidc-provider/package.json b/plugins/auth-backend-module-oidc-provider/package.json index 2e40d255c6..ca208df2d3 100644 --- a/plugins/auth-backend-module-oidc-provider/package.json +++ b/plugins/auth-backend-module-oidc-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oidc-provider", - "version": "0.3.3-next.1", + "version": "0.3.4-next.1", "description": "The oidc-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-okta-provider/CHANGELOG.md b/plugins/auth-backend-module-okta-provider/CHANGELOG.md index 4c8437f3c4..3bd855baa8 100644 --- a/plugins/auth-backend-module-okta-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-okta-provider/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-auth-backend-module-okta-provider +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-okta-provider/package.json b/plugins/auth-backend-module-okta-provider/package.json index 0712c714ef..a29f99e448 100644 --- a/plugins/auth-backend-module-okta-provider/package.json +++ b/plugins/auth-backend-module-okta-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-okta-provider", - "version": "0.1.3-next.1", + "version": "0.1.4-next.1", "description": "The okta-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md b/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md index 8b26308542..9cae4da384 100644 --- a/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-auth-backend-module-onelogin-provider +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-onelogin-provider/package.json b/plugins/auth-backend-module-onelogin-provider/package.json index 67ca38acce..152eb17695 100644 --- a/plugins/auth-backend-module-onelogin-provider/package.json +++ b/plugins/auth-backend-module-onelogin-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-onelogin-provider", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "The onelogin-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md index 7606f9120e..73bce5162e 100644 --- a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-auth-backend-module-pinniped-provider +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/config@1.3.1 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-pinniped-provider/package.json b/plugins/auth-backend-module-pinniped-provider/package.json index 2d93b4f236..979f43339c 100644 --- a/plugins/auth-backend-module-pinniped-provider/package.json +++ b/plugins/auth-backend-module-pinniped-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-pinniped-provider", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "The pinniped-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md index 3245132355..1d7bc69205 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-auth-backend-module-vmware-cloud-provider +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + +## 0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/catalog-model@1.7.2 + +## 0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + ## 0.4.2-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-vmware-cloud-provider/package.json b/plugins/auth-backend-module-vmware-cloud-provider/package.json index b31f291e18..870d2d6d21 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/package.json +++ b/plugins/auth-backend-module-vmware-cloud-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-vmware-cloud-provider", - "version": "0.4.2-next.1", + "version": "0.4.3-next.1", "description": "The vmware-cloud-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index d35c858747..8e0ef1989a 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,133 @@ # @backstage/plugin-auth-backend +## 0.24.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.4-next.1 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.4-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.4-next.1 + - @backstage/plugin-auth-backend-module-auth0-provider@0.1.4-next.1 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.4-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.4-next.1 + - @backstage/plugin-auth-backend-module-oidc-provider@0.3.4-next.1 + - @backstage/plugin-auth-backend-module-okta-provider@0.1.4-next.1 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.2-next.1 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-google-provider@0.2.4-next.1 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.4-next.1 + - @backstage/catalog-client@1.9.1-next.0 + +## 0.24.2-next.0 + +### Patch Changes + +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.4-next.0 + - @backstage/plugin-auth-backend-module-auth0-provider@0.1.4-next.0 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.2-next.0 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.4-next.0 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.4-next.0 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.4-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-google-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.4-next.0 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.4-next.0 + - @backstage/plugin-auth-backend-module-oidc-provider@0.3.4-next.0 + - @backstage/plugin-auth-backend-module-okta-provider@0.1.4-next.0 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.4-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## 0.24.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 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1 + - @backstage/plugin-auth-backend-module-google-provider@0.2.3 + - @backstage/errors@1.2.6 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3 + - @backstage/plugin-auth-backend-module-auth0-provider@0.1.3 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3 + - @backstage/plugin-auth-backend-module-oidc-provider@0.3.3 + - @backstage/plugin-auth-backend-module-okta-provider@0.1.3 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3 + +## 0.24.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-auth0-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-oidc-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-okta-provider@0.1.3-next.2 + - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1-next.2 + - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3-next.2 + - @backstage/plugin-auth-backend-module-google-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.24.1-next.1 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index e33f72a5d8..f1f0cf0d22 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend", - "version": "0.24.1-next.1", + "version": "0.24.2-next.1", "description": "A Backstage backend plugin that handles authentication", "backstage": { "role": "backend-plugin", diff --git a/plugins/auth-backend/src/database/AuthDatabase.ts b/plugins/auth-backend/src/database/AuthDatabase.ts index ec4d2034e7..43b48401e2 100644 --- a/plugins/auth-backend/src/database/AuthDatabase.ts +++ b/plugins/auth-backend/src/database/AuthDatabase.ts @@ -14,11 +14,11 @@ * limitations under the License. */ +import { DatabaseManager } from '@backstage/backend-common'; import { - DatabaseManager, - PluginDatabaseManager, -} from '@backstage/backend-common'; -import { resolvePackagePath } from '@backstage/backend-plugin-api'; + DatabaseService, + resolvePackagePath, +} from '@backstage/backend-plugin-api'; import { ConfigReader } from '@backstage/config'; import { Knex } from 'knex'; @@ -32,10 +32,10 @@ const migrationsDir = resolvePackagePath( * asked for, and runs migrations. */ export class AuthDatabase { - readonly #database: PluginDatabaseManager; + readonly #database: DatabaseService; #promise: Promise | undefined; - static create(database: PluginDatabaseManager): AuthDatabase { + static create(database: DatabaseService): AuthDatabase { return new AuthDatabase(database); } @@ -60,7 +60,7 @@ export class AuthDatabase { }); } - private constructor(database: PluginDatabaseManager) { + private constructor(database: DatabaseService) { this.#database = database; } diff --git a/plugins/auth-backend/src/identity/StaticKeyStore.ts b/plugins/auth-backend/src/identity/StaticKeyStore.ts index 13b9faf771..f7274d4b83 100644 --- a/plugins/auth-backend/src/identity/StaticKeyStore.ts +++ b/plugins/auth-backend/src/identity/StaticKeyStore.ts @@ -15,7 +15,7 @@ */ import { AnyJWK, KeyStore, StoredKey } from './types'; import { exportJWK, importPKCS8, importSPKI, JWK } from 'jose'; -import { KeyLike } from 'jose/dist/types/types'; +import { KeyLike } from 'jose'; import { promises as fs } from 'fs'; import { Config } from '@backstage/config'; diff --git a/plugins/auth-backend/src/providers/router.ts b/plugins/auth-backend/src/providers/router.ts index e449372143..2867611075 100644 --- a/plugins/auth-backend/src/providers/router.ts +++ b/plugins/auth-backend/src/providers/router.ts @@ -14,12 +14,10 @@ * limitations under the License. */ -import { - PluginEndpointDiscovery, - TokenManager, -} from '@backstage/backend-common'; +import { TokenManager } from '@backstage/backend-common'; import { AuthService, + DiscoveryService, HttpAuthService, LoggerService, } from '@backstage/backend-plugin-api'; @@ -47,7 +45,7 @@ export function bindProviderRouters( baseUrl: string; config: Config; logger: LoggerService; - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; auth: AuthService; httpAuth: HttpAuthService; tokenManager?: TokenManager; diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 3cae640270..da724b8a2a 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,58 @@ # @backstage/plugin-auth-node +## 0.5.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/catalog-client@1.9.1-next.0 + +## 0.5.6-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 0.5.5 + +### Patch Changes + +- c907440: Improved error forwarding for OAuth refresh endpoints +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/catalog-client@1.9.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.5.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.5.5-next.1 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 6b5861d494..f44607e10e 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.5.5-next.1", + "version": "0.5.6-next.1", "backstage": { "role": "node-library", "pluginId": "auth", @@ -56,6 +56,7 @@ "zod-validation-error": "^3.4.0" }, "devDependencies": { + "@backstage/backend-defaults": "workspace:^", "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "cookie-parser": "^1.4.6", diff --git a/plugins/auth-node/report.api.md b/plugins/auth-node/report.api.md index db61257f7a..e5f33b4e7e 100644 --- a/plugins/auth-node/report.api.md +++ b/plugins/auth-node/report.api.md @@ -6,6 +6,7 @@ import { BackstageIdentityResponse as BackstageIdentityResponse_2 } from '@backstage/plugin-auth-node'; import { BackstageSignInResult as BackstageSignInResult_2 } from '@backstage/plugin-auth-node'; import { Config } from '@backstage/config'; +import { DiscoveryService } from '@backstage/backend-plugin-api'; import { Entity } from '@backstage/catalog-model'; import { EntityFilterQuery } from '@backstage/catalog-client'; import express from 'express'; @@ -13,7 +14,6 @@ import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { LoggerService } from '@backstage/backend-plugin-api'; -import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { Profile } from 'passport'; import { Request as Request_2 } from 'express'; import { Response as Response_2 } from 'express'; @@ -265,7 +265,7 @@ export class IdentityClient { // @public export type IdentityClientOptions = { - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; issuer?: string; algorithms?: string[]; }; diff --git a/plugins/auth-node/src/identity/DefaultIdentityClient.test.ts b/plugins/auth-node/src/identity/DefaultIdentityClient.test.ts index b9bf3cabd2..68765c6bef 100644 --- a/plugins/auth-node/src/identity/DefaultIdentityClient.test.ts +++ b/plugins/auth-node/src/identity/DefaultIdentityClient.test.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { PluginEndpointDiscovery } from '@backstage/backend-common'; + import { decodeProtectedHeader, exportJWK, @@ -27,6 +27,7 @@ import { v4 as uuid } from 'uuid'; import { DefaultIdentityClient } from './DefaultIdentityClient'; import { IdentityApiGetIdentityRequest } from './IdentityApi'; +import { DiscoveryService } from '@backstage/backend-plugin-api'; interface AnyJWK extends Record { use: 'sig'; @@ -87,7 +88,7 @@ function jwtKid(jwt: string): string { const server = setupServer(); const mockBaseUrl = 'http://backstage:9191/i-am-a-mock-base'; -const discovery: PluginEndpointDiscovery = { +const discovery: DiscoveryService = { async getBaseUrl() { return mockBaseUrl; }, diff --git a/plugins/auth-node/src/identity/DefaultIdentityClient.ts b/plugins/auth-node/src/identity/DefaultIdentityClient.ts index 1095609dec..aa6f4c95c4 100644 --- a/plugins/auth-node/src/identity/DefaultIdentityClient.ts +++ b/plugins/auth-node/src/identity/DefaultIdentityClient.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { AuthenticationError } from '@backstage/errors'; import { createRemoteJWKSet, @@ -24,10 +23,11 @@ import { JWSHeaderParameters, jwtVerify, } from 'jose'; -import { GetKeyFunction } from 'jose/dist/types/types'; +import { GetKeyFunction } from 'jose'; import { getBearerTokenFromAuthorizationHeader } from './getBearerTokenFromAuthorizationHeader'; import { IdentityApi, IdentityApiGetIdentityRequest } from './IdentityApi'; import { BackstageIdentityResponse } from '../types'; +import { DiscoveryService } from '@backstage/backend-plugin-api'; const CLOCK_MARGIN_S = 10; @@ -38,7 +38,7 @@ const CLOCK_MARGIN_S = 10; * @public */ export type IdentityClientOptions = { - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; issuer?: string; /** JWS "alg" (Algorithm) Header Parameter values. Defaults to an array containing just ES256. @@ -54,7 +54,7 @@ export type IdentityClientOptions = { * @public */ export class DefaultIdentityClient implements IdentityApi { - private readonly discovery: PluginEndpointDiscovery; + private readonly discovery: DiscoveryService; private readonly issuer?: string; private readonly algorithms?: string[]; private keyStore?: GetKeyFunction; diff --git a/plugins/auth-node/src/identity/IdentityClient.test.ts b/plugins/auth-node/src/identity/IdentityClient.test.ts index 418eb544ad..91cd1759aa 100644 --- a/plugins/auth-node/src/identity/IdentityClient.test.ts +++ b/plugins/auth-node/src/identity/IdentityClient.test.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { registerMswTestHooks } from '@backstage/backend-test-utils'; import { decodeProtectedHeader, @@ -28,6 +27,7 @@ import { setupServer } from 'msw/node'; import { v4 as uuid } from 'uuid'; import { IdentityClient } from './IdentityClient'; +import { DiscoveryService } from '@backstage/backend-plugin-api'; interface AnyJWK extends Record { use: 'sig'; @@ -88,7 +88,7 @@ function jwtKid(jwt: string): string { const server = setupServer(); const mockBaseUrl = 'http://backstage:9191/i-am-a-mock-base'; -const discovery: PluginEndpointDiscovery = { +const discovery: DiscoveryService = { async getBaseUrl() { return mockBaseUrl; }, diff --git a/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts b/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts index 4ea8dc17cc..46fa058b47 100644 --- a/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts +++ b/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts @@ -22,10 +22,11 @@ import PromiseRouter from 'express-promise-router'; import { AuthProviderRouteHandlers, AuthResolverContext } from '../types'; import { createOAuthRouteHandlers } from './createOAuthRouteHandlers'; import { OAuthAuthenticator } from './types'; -import { errorHandler } from '@backstage/backend-common'; import { encodeOAuthState, OAuthState } from './state'; import { PassportProfile } from '../passport'; import { parseWebMessageResponse } from '../flow/__testUtils__/parseWebMessageResponse'; +import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter'; +import { mockServices } from '@backstage/backend-test-utils'; const mockAuthenticator: jest.Mocked> = { initialize: jest.fn(_r => ({ ctx: 'authenticator' })), @@ -63,13 +64,17 @@ const baseConfig = { }; function wrapInApp(handlers: AuthProviderRouteHandlers) { + const middleware = MiddlewareFactory.create({ + logger: mockServices.logger.mock(), + config: mockServices.rootConfig(), + }); const app = express(); const router = PromiseRouter(); router.use(cookieParser()); app.use('/my-provider', router); - app.use(errorHandler()); + app.use(middleware.error()); router.get('/start', handlers.start.bind(handlers)); router.get('/handler/frame', handlers.frameHandler.bind(handlers)); diff --git a/plugins/auth-react/CHANGELOG.md b/plugins/auth-react/CHANGELOG.md index 6ffb637999..3368816247 100644 --- a/plugins/auth-react/CHANGELOG.md +++ b/plugins/auth-react/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-auth-react +## 0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/errors@1.2.7-next.0 + +## 0.1.10 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/core-plugin-api@1.10.2 + +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + ## 0.1.10-next.1 ### Patch Changes diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 9242dd2369..24f880b0fc 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-react", - "version": "0.1.10-next.1", + "version": "0.1.11-next.0", "description": "Web library for the auth plugin", "backstage": { "role": "web-library", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index c6b894c7a3..39d5306a9d 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.1-next.0 + +## 0.2.26 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + +## 0.2.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0-next.1 + ## 0.2.26-next.0 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/bitbucket-cloud.oas.json b/plugins/bitbucket-cloud-common/bitbucket-cloud.oas.json index d897d83047..ead80230c6 100644 --- a/plugins/bitbucket-cloud-common/bitbucket-cloud.oas.json +++ b/plugins/bitbucket-cloud-common/bitbucket-cloud.oas.json @@ -24400,7 +24400,7 @@ "title": "Pagination", "description": "Learn more about pagination", "icon": "data:image/svg+xml;base64,b'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjM4LjgyIDE1MS42Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6I2IyZDRmZjt9LmNscy0ye2ZpbGw6IzRjOWFmZjt9LmNscy0ze2ZpbGw6IzAwNTJjYzt9LmNscy00e29wYWNpdHk6MC42O30uY2xzLTV7ZmlsbDp1cmwoI2xpbmVhci1ncmFkaWVudCk7fS5jbHMtNntmaWxsOnVybCgjbGluZWFyLWdyYWRpZW50LTIpO30uY2xzLTd7ZmlsbDp1cmwoI2xpbmVhci1ncmFkaWVudC0zKTt9LmNscy04e2ZpbGw6dXJsKCNsaW5lYXItZ3JhZGllbnQtNCk7fS5jbHMtOXtmaWxsOnVybCgjbGluZWFyLWdyYWRpZW50LTUpO30uY2xzLTEwLC5jbHMtMTEsLmNscy0xMntmaWxsOm5vbmU7fS5jbHMtMTB7c3Ryb2tlOiMzMzg0ZmY7fS5jbHMtMTAsLmNscy0xMSwuY2xzLTEyLC5jbHMtMTN7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0xMXtzdHJva2U6I2ZmYWIwMDt9LmNscy0xMntzdHJva2U6I2ZhZmJmYzt9LmNscy0xM3tmaWxsOiNmZmFiMDA7c3Ryb2tlOiMyNjg0ZmY7fTwvc3R5bGU+PGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXItZ3JhZGllbnQiIHkxPSI2NS4xNyIgeDI9Ijg2LjM4IiB5Mj0iNjUuMTciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM0YzlhZmYiLz48c3RvcCBvZmZzZXQ9IjAuMDgiIHN0b3AtY29sb3I9IiM0YzlhZmYiIHN0b3Atb3BhY2l0eT0iMC45NCIvPjxzdG9wIG9mZnNldD0iMC4yNCIgc3RvcC1jb2xvcj0iIzRjOWFmZiIgc3RvcC1vcGFjaXR5PSIwLjc4Ii8+PHN0b3Agb2Zmc2V0PSIwLjQ1IiBzdG9wLWNvbG9yPSIjNGM5YWZmIiBzdG9wLW9wYWNpdHk9IjAuNTMiLz48c3RvcCBvZmZzZXQ9IjAuNTUiIHN0b3AtY29sb3I9IiM0YzlhZmYiIHN0b3Atb3BhY2l0eT0iMC40Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhci1ncmFkaWVudC0yIiB4MT0iMTUyLjQ0IiB5MT0iNjUuMTciIHgyPSIyMzguODIiIHkyPSI2NS4xNyIgeGxpbms6aHJlZj0iI2xpbmVhci1ncmFkaWVudCIvPjxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyLWdyYWRpZW50LTMiIHgxPSIxOC44NSIgeTE9IjExOC43OCIgeDI9IjEyNi4wOCIgeTI9IjExLjU2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwLjA2IiBzdG9wLWNvbG9yPSIjMDA2NWZmIi8+PHN0b3Agb2Zmc2V0PSIwLjE5IiBzdG9wLWNvbG9yPSIjMDA2NWZmIiBzdG9wLW9wYWNpdHk9IjAuOTQiLz48c3RvcCBvZmZzZXQ9IjAuNDYiIHN0b3AtY29sb3I9IiMwMDY1ZmYiIHN0b3Atb3BhY2l0eT0iMC43OCIvPjxzdG9wIG9mZnNldD0iMC44MiIgc3RvcC1jb2xvcj0iIzAwNjVmZiIgc3RvcC1vcGFjaXR5PSIwLjUzIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA2NWZmIiBzdG9wLW9wYWNpdHk9IjAuNCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXItZ3JhZGllbnQtNCIgeDE9IjExMi43NSIgeTE9IjExOC43OCIgeDI9IjIxOS45NyIgeTI9IjExLjU2IiB4bGluazpocmVmPSIjbGluZWFyLWdyYWRpZW50LTMiLz48bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhci1ncmFkaWVudC01IiB4MT0iNTAuOTciIHkxPSIxMzMuNjEiIHgyPSIxODcuODYiIHkyPSItMy4yOCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMC42NiIgc3RvcC1jb2xvcj0iIzI1Mzg1OCIvPjxzdG9wIG9mZnNldD0iMC44OCIgc3RvcC1jb2xvcj0iIzI1Mzg1OCIgc3RvcC1vcGFjaXR5PSIwLjgzIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMjUzODU4IiBzdG9wLW9wYWNpdHk9IjAuNyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjx0aXRsZT5WaWV3IFZlcnNpb25zPC90aXRsZT48ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj48ZyBpZD0iU29mdHdhcmUiPjxjaXJjbGUgY2xhc3M9ImNscy0xIiBjeD0iOTQuNTMiIGN5PSIxNDcuOTMiIHI9IjMuNjciLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjEwNi45NCIgY3k9IjE0Ny45MyIgcj0iMy42NyIvPjxjaXJjbGUgY2xhc3M9ImNscy0zIiBjeD0iMTE5LjM0IiBjeT0iMTQ3LjkzIiByPSIzLjY3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMzEuNzUiIGN5PSIxNDcuOTMiIHI9IjMuNjciLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE0NC4xNiIgY3k9IjE0Ny45MyIgcj0iMy42NyIvPjxnIGNsYXNzPSJjbHMtNCI+PHJlY3QgaWQ9Il9SZWN0YW5nbGVfIiBkYXRhLW5hbWU9IiZsdDtSZWN0YW5nbGUmZ3Q7IiBjbGFzcz0iY2xzLTUiIHk9IjI1LjkyIiB3aWR0aD0iODYuMzgiIGhlaWdodD0iNzguNDkiLz48L2c+PGcgY2xhc3M9ImNscy00Ij48cmVjdCBpZD0iX1JlY3RhbmdsZV8yIiBkYXRhLW5hbWU9IiZsdDtSZWN0YW5nbGUmZ3Q7IiBjbGFzcz0iY2xzLTYiIHg9IjE1Mi40NCIgeT0iMjUuOTIiIHdpZHRoPSI4Ni4zOCIgaGVpZ2h0PSI3OC40OSIvPjwvZz48cmVjdCBpZD0iX1JlY3RhbmdsZV8zIiBkYXRhLW5hbWU9IiZsdDtSZWN0YW5nbGUmZ3Q7IiBjbGFzcz0iY2xzLTciIHg9IjE2LjI4IiB5PSIxNC4xMiIgd2lkdGg9IjExMi4zNiIgaGVpZ2h0PSIxMDIuMDkiLz48cmVjdCBpZD0iX1JlY3RhbmdsZV80IiBkYXRhLW5hbWU9IiZsdDtSZWN0YW5nbGUmZ3Q7IiBjbGFzcz0iY2xzLTgiIHg9IjExMC4xOCIgeT0iMTQuMTIiIHdpZHRoPSIxMTIuMzYiIGhlaWdodD0iMTAyLjA5Ii8+PHJlY3QgaWQ9Il9SZWN0YW5nbGVfNSIgZGF0YS1uYW1lPSImbHQ7UmVjdGFuZ2xlJmd0OyIgY2xhc3M9ImNscy05IiB4PSI0Ny42OSIgd2lkdGg9IjE0My40NSIgaGVpZ2h0PSIxMzAuMzQiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNzkuMTYiIHkxPSIxNi4xOCIgeDI9IjExNy4yNCIgeTI9IjE2LjE4Ii8+PGxpbmUgY2xhc3M9ImNscy0xMCIgeDE9IjYyLjkzIiB5MT0iMTYuMTgiIHgyPSI3Mi42IiB5Mj0iMTYuMTgiLz48bGluZSBjbGFzcz0iY2xzLTExIiB4MT0iNzkuMTYiIHkxPSIyNi45NSIgeDI9IjExNy4yNCIgeTI9IjI2Ljk1Ii8+PGxpbmUgY2xhc3M9ImNscy0xMCIgeDE9IjYyLjkzIiB5MT0iMjYuOTUiIHgyPSI3Mi42IiB5Mj0iMjYuOTUiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNzkuMTYiIHkxPSIzNy43MiIgeDI9IjE1MC43IiB5Mj0iMzcuNzIiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNjIuOTMiIHkxPSIzNy43MiIgeDI9IjcyLjYiIHkyPSIzNy43MiIvPjxsaW5lIGNsYXNzPSJjbHMtMTEiIHgxPSIxNTAuNyIgeTE9IjQ4LjQ5IiB4Mj0iMTc1LjU5IiB5Mj0iNDguNDkiLz48bGluZSBjbGFzcz0iY2xzLTEyIiB4MT0iMTEwLjMyIiB5MT0iNDguNDkiIHgyPSIxNDMuMDUiIHkyPSI0OC40OSIvPjxsaW5lIGNsYXNzPSJjbHMtMTEiIHgxPSI3OS4xNiIgeTE9IjQ4LjQ5IiB4Mj0iMTAxLjM3IiB5Mj0iNDguNDkiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNjIuOTMiIHkxPSI0OC40OSIgeDI9IjcyLjYiIHkyPSI0OC40OSIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI3OS4xNiIgeTE9IjU5LjI2IiB4Mj0iMTUwLjciIHkyPSI1OS4yNiIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI2Mi45MyIgeTE9IjU5LjI2IiB4Mj0iNzIuNiIgeTI9IjU5LjI2Ii8+PGxpbmUgY2xhc3M9ImNscy0xMCIgeDE9Ijc5LjE2IiB5MT0iNzAuMDMiIHgyPSIxNzUuNTkiIHkyPSI3MC4wMyIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI2Mi45MyIgeTE9IjcwLjAzIiB4Mj0iNzIuNiIgeTI9IjcwLjAzIi8+PGxpbmUgY2xhc3M9ImNscy0xMSIgeDE9Ijc5LjE2IiB5MT0iODAuNzkiIHgyPSIxMTcuMjQiIHkyPSI4MC43OSIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI2Mi45MyIgeTE9IjgwLjc5IiB4Mj0iNzIuNiIgeTI9IjgwLjc5Ii8+PGxpbmUgY2xhc3M9ImNscy0xMyIgeDE9Ijc5LjE2IiB5MT0iOTEuNTYiIHgyPSIxNDkuMDYiIHkyPSI5MS41NiIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI2Mi45MyIgeTE9IjkxLjU2IiB4Mj0iNzIuNiIgeTI9IjkxLjU2Ii8+PGxpbmUgY2xhc3M9ImNscy0xMCIgeDE9IjYyLjkzIiB5MT0iODAuNzkiIHgyPSI3Mi42IiB5Mj0iODAuNzkiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNjIuOTMiIHkxPSI5MS41NiIgeDI9IjcyLjYiIHkyPSI5MS41NiIvPjxsaW5lIGNsYXNzPSJjbHMtMTEiIHgxPSI3OS4xNiIgeTE9IjEwMi4zMyIgeDI9IjExNy4yNCIgeTI9IjEwMi4zMyIvPjxsaW5lIGNsYXNzPSJjbHMtMTAiIHgxPSI2Mi45MyIgeTE9IjEwMi4zMyIgeDI9IjcyLjYiIHkyPSIxMDIuMzMiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iMTI1Ljk4IiB5MT0iMTEzLjEiIHgyPSIxNDkuMDYiIHkyPSIxMTMuMSIvPjxsaW5lIGNsYXNzPSJjbHMtMTIiIHgxPSI3OS4xNiIgeTE9IjExMy4xIiB4Mj0iMTE3LjI0IiB5Mj0iMTEzLjEiLz48bGluZSBjbGFzcz0iY2xzLTEwIiB4MT0iNjIuOTMiIHkxPSIxMTMuMSIgeDI9IjcyLjYiIHkyPSIxMTMuMSIvPjwvZz48L2c+PC9zdmc+'", - "body": "\nEndpoints that return collections of objects should always apply pagination.\nPaginated collections are always wrapped in the following wrapper object:\n\n```json\n{\n \"size\": 5421,\n \"page\": 2,\n \"pagelen\": 10,\n \"next\": \"https://api.bitbucket.org/2.0/repositories/pypy/pypy/commits?page=3\",\n \"previous\": \"https://api.bitbucket.org/2.0/repositories/pypy/pypy/commits?page=1\",\n \"values\": [\n ...\n ]\n}\n```\n\nPagination is often page-bound, with a query parameter page indicating which\npage is to be returned.\n\nHowever, clients are not expected to construct URLs themselves by manipulating\nthe page number query parameter. Instead, the response contains a link to the\nnext page. This link should be treated as an opaque location that is not to be\nconstructed by clients or even assumed to be predictable. The only contract\naround the next link is that it will return the next chunk of results.\n\nLack of a next link in the response indicates the end of the collection.\n\nThe paginated response contains the following fields:\n\n| Field | Value |\n|------------|----------|\n| `size` | Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute. |\n| `page` | Page number of the current results. This is an optional element that is not provided in all responses. |\n| `pagelen` | Current number of objects on the existing page. Globally, the minimum length is 10 and the maximum is 100. Some APIs may specify a different default. |\n| `next` | Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs. |\n| `previous` | Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs. |\n| `values` | The list of objects. This contains at most `pagelen` objects. |\n\nThe link to the next page is included such that you don't have to hardcode or construct any links. Only values and next are guaranteed (except the last page, which lacks next). This is because the previous and size values can be expensive for some data sets.\n\nIt is important to realize that Bitbucket support both list-based pagination and iterator-based pagination. List-based pagination assumes that the collection is a discrete, immutable, consistently ordered, finite array of objects with a fixed size. Clients navigate a list-based collection by requesting offset-based chunks. In Bitbucket Cloud, list-based responses include the optional size, page, and previous element. The the next and previous links typically resemble something like /foo/bar?page=4.\n\nHowever, not all result sets can be treated as immutable and finite – much like how programming languages tend to distinguish between lists and arrays on one hand and iterators or stream on the other. Where an list-based pagination offers random access into any point in a collection, iterator-based pagination can only navigate forward one element at a time. In Bitbucket such iterator-based pagination contains the next link and pagelen elements, but not necessarily anything else. In these cases, the next link's value often contains an unpredictable hash instead of an explicit page number. The commits resource uses iterator-based pagination.\n" + "body": "\nEndpoints that return collections of objects should always apply pagination.\nPaginated collections are always wrapped in the following wrapper object:\n\n```json\n{\n \"size\": 5421,\n \"page\": 2,\n \"pagelen\": 10,\n \"next\": \"https://api.bitbucket.org/2.0/repositories/pypy/pypy/commits?page=3\",\n \"previous\": \"https://api.bitbucket.org/2.0/repositories/pypy/pypy/commits?page=1\",\n \"values\": [\n ...\n ]\n}\n```\n\nPagination is often page-bound, with a query parameter page indicating which\npage is to be returned.\n\nHowever, clients are not expected to construct URLs themselves by manipulating\nthe page number query parameter. Instead, the response contains a link to the\nnext page. This link should be treated as an opaque location that is not to be\nconstructed by clients or even assumed to be predictable. The only contract\naround the next link is that it will return the next chunk of results.\n\nLack of a next link in the response indicates the end of the collection.\n\nThe paginated response contains the following fields:\n\n| Field | Value |\n|------------|----------|\n| `size` | Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute. |\n| `page` | Page number of the current results. This is an optional element that is not provided in all responses. |\n| `pagelen` | Current number of objects on the existing page. Globally, the minimum length is 10 and the maximum is 100. Some APIs may specify a different default. |\n| `next` | Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs. |\n| `previous` | Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs. |\n| `values` | The list of objects. This contains at most `pagelen` objects. |\n\nThe link to the next page is included such that you don't have to hardcode or construct any links. Only values and next are guaranteed (except the last page, which lacks next). This is because the previous and size values can be expensive for some data sets.\n\nIt is important to realize that Bitbucket support both list-based pagination and iterator-based pagination. List-based pagination assumes that the collection is a discrete, immutable, consistently ordered, finite array of objects with a fixed size. Clients navigate a list-based collection by requesting offset-based chunks. In Bitbucket Cloud, list-based responses include the optional size, page, and previous element. The next and previous links typically resemble something like /foo/bar?page=4.\n\nHowever, not all result sets can be treated as immutable and finite – much like how programming languages tend to distinguish between lists and arrays on one hand and iterators or stream on the other. Where an list-based pagination offers random access into any point in a collection, iterator-based pagination can only navigate forward one element at a time. In Bitbucket such iterator-based pagination contains the next link and pagelen elements, but not necessarily anything else. In these cases, the next link's value often contains an unpredictable hash instead of an explicit page number. The commits resource uses iterator-based pagination.\n" }, { "anchor": "partial-response", diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 361608ee37..60ffec37a2 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", - "version": "0.2.26-next.0", + "version": "0.2.27-next.0", "description": "Common functionalities for bitbucket-cloud plugins", "backstage": { "role": "common-library", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index eb91db01fb..c83e9b4713 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,69 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.4.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## 0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.1 + +## 0.4.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-kubernetes-common@0.9.1 + +## 0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + ## 0.4.6-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 992e79658c..a6ec06543d 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", - "version": "0.4.6-next.1", + "version": "0.4.7-next.1", "description": "A Backstage catalog backend module that helps integrate towards AWS", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 01038c112d..1347a527da 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,54 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## 0.3.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 + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.3.0-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 7efb73ea2c..211b036fd9 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", - "version": "0.3.0-next.1", + "version": "0.3.1-next.1", "description": "A Backstage catalog backend module that helps integrate towards Azure", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md index 3eec2220aa..d3104764f4 100644 --- a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md @@ -1,5 +1,53 @@ # @backstage/plugin-catalog-backend-module-backstage-openapi +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.4.1-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + +## 0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.4.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## 0.4.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/backend-openapi-utils@0.4.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + +## 0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + ## 0.4.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-backstage-openapi/package.json b/plugins/catalog-backend-module-backstage-openapi/package.json index d847bb5dca..015ecbf1a8 100644 --- a/plugins/catalog-backend-module-backstage-openapi/package.json +++ b/plugins/catalog-backend-module-backstage-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-backstage-openapi", - "version": "0.4.3-next.1", + "version": "0.4.4-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index f0f57133cf..638036c004 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,65 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.27-next.0 + +## 0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration@1.16.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.4.3 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + - @backstage/plugin-catalog-common@1.1.2 + +## 0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.4.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index e2f2a51e90..e038cf234d 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", - "version": "0.4.3-next.1", + "version": "0.4.4-next.1", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index e82471e694..30cdf81f8b 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,62 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## 0.3.0 + +### Minor Changes + +- 3f34ea9: Throttles Bitbucket Server API calls + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + +## 0.3.0-next.2 + +### Minor Changes + +- 3f34ea9: Throttles Bitbucket Server API calls + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index ac90aaf86a..7edb2b22a6 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.2.5-next.1", + "version": "0.3.1-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", @@ -56,6 +56,7 @@ "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", + "p-throttle": "^4.1.1", "uuid": "^11.0.0" }, "devDependencies": { diff --git a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts index ee2caf7ffd..73373ffff1 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts @@ -19,6 +19,19 @@ import { getBitbucketServerRequestOptions, } from '@backstage/integration'; import { BitbucketServerProject, BitbucketServerRepository } from './types'; +import pThrottle from 'p-throttle'; + +// 1 per second +const throttle = pThrottle({ + limit: 1, + interval: 1000, +}); + +const throttledFetch = throttle( + async (url: RequestInfo, options?: RequestInit) => { + return await fetch(url, options); + }, +); /** * A client for interacting with a Bitbucket Server instance @@ -65,7 +78,7 @@ export class BitbucketServerClient { path: string; }): Promise { const base = new URL(this.config.apiBaseUrl); - return fetch( + return throttledFetch( `${base.protocol}//${base.host}/projects/${options.projectKey}/repos/${options.repo}/raw/${options.path}`, getBitbucketServerRequestOptions(this.config), ); @@ -76,7 +89,7 @@ export class BitbucketServerClient { repo: string; }): Promise { const request = `${this.config.apiBaseUrl}/projects/${options.projectKey}/repos/${options.repo}`; - const response = await fetch( + const response = await throttledFetch( request, getBitbucketServerRequestOptions(this.config), ); @@ -117,16 +130,17 @@ export class BitbucketServerClient { } private async request(req: Request): Promise { - return fetch(req, getBitbucketServerRequestOptions(this.config)).then( - (response: Response) => { - if (!response.ok) { - throw new Error( - `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`, - ); - } - return response; - }, - ); + return throttledFetch( + req, + getBitbucketServerRequestOptions(this.config), + ).then((response: Response) => { + if (!response.ok) { + throw new Error( + `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`, + ); + } + return response; + }); } } diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md index bc59702162..69e69f0ce4 100644 --- a/plugins/catalog-backend-module-gcp/CHANGELOG.md +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-catalog-backend-module-gcp +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.1 + +## 0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-kubernetes-common@0.9.1 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index 5f173b4bb8..83d12b210a 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", - "version": "0.3.3-next.1", + "version": "0.3.4-next.1", "description": "A Backstage catalog backend module that helps integrate towards GCP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 19c7daf10e..dc9bf0b019 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## 0.2.5 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 9fe81d7794..45d5dc4e21 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.2.5-next.1", + "version": "0.2.6-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md index 9affcffb85..a77a6541ad 100644 --- a/plugins/catalog-backend-module-github-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-catalog-backend-module-github-org +## 0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.7.9-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.7.9-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.7.8 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + +## 0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-backend-module-github@0.7.8-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.3.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index a05a95951d..eb68e47e06 100644 --- a/plugins/catalog-backend-module-github-org/package.json +++ b/plugins/catalog-backend-module-github-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github-org", - "version": "0.3.5-next.1", + "version": "0.3.6-next.1", "description": "The github-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index bccafc89a2..6164209635 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,69 @@ # @backstage/plugin-catalog-backend-module-github +## 0.7.9-next.1 + +### Patch Changes + +- 4ab00e4: Fixes an issue in `GithubMultiOrgEntityProvider` that caused an error when processing teams without a parent. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## 0.7.9-next.0 + +### Patch Changes + +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.7.8 + +### Patch Changes + +- 468bbcc: Pass in a default schedule to the `GithubEntityProvider` if none is provided +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + +## 0.7.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.7.8-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index ede3f2b1b5..ce731cd8c9 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github", - "version": "0.7.8-next.1", + "version": "0.7.9-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitHub", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github/report.api.md b/plugins/catalog-backend-module-github/report.api.md index dcc94e47bc..8cd87f646a 100644 --- a/plugins/catalog-backend-module-github/report.api.md +++ b/plugins/catalog-backend-module-github/report.api.md @@ -10,6 +10,7 @@ import { CatalogApi } from '@backstage/catalog-client'; import { CatalogProcessor } from '@backstage/plugin-catalog-node'; import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; +import { DiscoveryService } from '@backstage/backend-plugin-api'; import { Entity } from '@backstage/catalog-model'; import { EntityProvider } from '@backstage/plugin-catalog-node'; import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; @@ -21,7 +22,6 @@ import { GithubIntegrationConfig } from '@backstage/integration'; import { graphql } from '@octokit/graphql'; import { LocationSpec } from '@backstage/plugin-catalog-node'; import { LoggerService } from '@backstage/backend-plugin-api'; -import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { SchedulerService } from '@backstage/backend-plugin-api'; import { SchedulerServiceTaskRunner } from '@backstage/backend-plugin-api'; import { ScmIntegrationRegistry } from '@backstage/integration'; @@ -127,7 +127,7 @@ export class GithubLocationAnalyzer implements ScmLocationAnalyzer { // @public (undocumented) export type GithubLocationAnalyzerOptions = { config: Config; - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; tokenManager?: TokenManager; auth?: AuthService; githubCredentialsProvider?: GithubCredentialsProvider; diff --git a/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.test.ts b/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.test.ts index d3be18f489..25a19ba1ff 100644 --- a/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.test.ts +++ b/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.test.ts @@ -32,7 +32,6 @@ jest.mock('@octokit/rest', () => { return { Octokit }; }); -import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { GithubLocationAnalyzer } from './GithubLocationAnalyzer'; import { registerMswTestHooks, @@ -40,26 +39,21 @@ import { } from '@backstage/backend-test-utils'; import { setupServer } from 'msw/node'; import { http, HttpResponse } from 'msw'; -import { ConfigReader } from '@backstage/config'; const server = setupServer(); describe('GithubLocationAnalyzer', () => { - const mockDiscoveryApi: jest.Mocked = { - getBaseUrl: jest.fn().mockResolvedValue('http://localhost:7007'), - getExternalBaseUrl: jest.fn(), - }; + const mockDiscovery = mockServices.discovery.mock({ + getBaseUrl: async () => 'http://localhost:7007', + }); const mockAuthService = mockServices.auth.mock({ getPluginRequestToken: async () => ({ token: 'abc123' }), }); - const config = new ConfigReader({ - integrations: { - github: [ - { - host: 'h.com', - token: 't', - }, - ], + const config = mockServices.rootConfig({ + data: { + integrations: { + github: [{ host: 'h.com', token: 't' }], + }, }, }); @@ -121,7 +115,7 @@ describe('GithubLocationAnalyzer', () => { }); const analyzer = new GithubLocationAnalyzer({ - discovery: mockDiscoveryApi, + discovery: mockDiscovery, auth: mockAuthService, config, }); @@ -148,7 +142,7 @@ describe('GithubLocationAnalyzer', () => { }); const analyzer = new GithubLocationAnalyzer({ - discovery: mockDiscoveryApi, + discovery: mockDiscovery, auth: mockAuthService, config, }); @@ -174,7 +168,7 @@ describe('GithubLocationAnalyzer', () => { }); const analyzer = new GithubLocationAnalyzer({ - discovery: mockDiscoveryApi, + discovery: mockDiscovery, auth: mockAuthService, config, }); diff --git a/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.ts b/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.ts index b635878f92..cbf43287a3 100644 --- a/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.ts +++ b/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.ts @@ -29,18 +29,17 @@ import { ScmLocationAnalyzer, } from '@backstage/plugin-catalog-node'; import { - PluginEndpointDiscovery, TokenManager, createLegacyAuthAdapters, } from '@backstage/backend-common'; import { Config } from '@backstage/config'; -import { AuthService } from '@backstage/backend-plugin-api'; +import { AuthService, DiscoveryService } from '@backstage/backend-plugin-api'; import { extname } from 'path'; /** @public */ export type GithubLocationAnalyzerOptions = { config: Config; - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; tokenManager?: TokenManager; auth?: AuthService; githubCredentialsProvider?: GithubCredentialsProvider; diff --git a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts index df49ac9803..2186b11f50 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts @@ -1596,6 +1596,62 @@ describe('GithubMultiOrgEntityProvider', () => { }); }); + it('should create a new group from a new team without parent', async () => { + await events.publish({ + topic: 'github.team', + eventPayload: { + action: 'created', + organization: { + login: 'orgB', + }, + team: { + name: 'New Team', + slug: 'new-team', + description: 'description from the new team', + html_url: 'https://github.com/orgs/orgB/teams/new-team', + parent: null, + }, + }, + }); + + expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(1); + expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({ + type: 'delta', + added: [ + { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: 'new-team', + namespace: 'orgb', + description: 'description from the new team', + annotations: { + 'backstage.io/edit-url': + 'https://github.com/orgs/orgB/teams/new-team/edit', + 'backstage.io/managed-by-location': + 'url:https://github.com/orgs/orgB/teams/new-team', + 'backstage.io/managed-by-origin-location': + 'url:https://github.com/orgs/orgB/teams/new-team', + 'github.com/team-slug': 'orgB/new-team', + }, + }, + spec: { + type: 'team', + children: [], + members: [], + profile: { + displayName: 'New Team', + }, + }, + }, + locationKey: 'github-multi-org-provider:my-id', + }, + ], + removed: [], + }); + }); + it('should remove a group from a deleted team', async () => { await events.publish({ topic: 'github.team', @@ -1869,6 +1925,170 @@ describe('GithubMultiOrgEntityProvider', () => { ], }); }); + + it('should update group without parent', async () => { + const mockClient = jest.fn(); + + mockClient + .mockResolvedValueOnce({ + organization: { + team: { + slug: 'team', + combinedSlug: 'orgA/team', + name: 'TeamA', + description: 'The one and only team', + avatarUrl: 'http://example.com/team.jpeg', + editTeamUrl: 'https://example.com', + parentTeam: null, + members: { + pageInfo: { hasNextPage: false }, + nodes: [], + }, + }, + }, + }) + .mockResolvedValueOnce({ + organization: { + membersWithRole: { + pageInfo: { hasNextPage: false }, + nodes: [], + }, + }, + }) + .mockResolvedValueOnce({ + organization: { + teams: { + pageInfo: { hasNextPage: false }, + nodes: [ + { + slug: 'team', + combinedSlug: 'orgA/team', + name: 'TeamA', + description: 'The one and only team', + avatarUrl: 'http://example.com/team.jpeg', + editTeamUrl: 'https://example.com', + parentTeam: null, + members: { + pageInfo: { hasNextPage: false }, + nodes: [], + }, + }, + ], + }, + }, + }) + .mockResolvedValueOnce({ + organization: { + teams: { + pageInfo: { hasNextPage: false }, + nodes: [ + { + slug: 'team', + combinedSlug: 'orgB/team', + name: 'TeamB', + description: 'The one and only team', + avatarUrl: 'http://example.com/team.jpeg', + editTeamUrl: 'https://example.com', + parentTeam: null, + members: { + pageInfo: { hasNextPage: false }, + nodes: [], + }, + }, + ], + }, + }, + }); + + (graphql.defaults as jest.Mock).mockReturnValue(mockClient); + + await events.publish({ + topic: 'github.team', + eventPayload: { + action: 'edited', + changes: { + name: { + from: 'oldName', + }, + description: { + from: 'oldDescription', + }, + }, + team: { + slug: 'team', + parent: null, + }, + organization: { + login: 'orgA', + }, + }, + }); + + expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(1); + expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({ + type: 'delta', + added: [ + { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + annotations: { + 'backstage.io/edit-url': 'https://example.com', + 'backstage.io/managed-by-location': + 'url:https://github.com/orgs/orgA/teams/team', + 'backstage.io/managed-by-origin-location': + 'url:https://github.com/orgs/orgA/teams/team', + 'github.com/team-slug': 'orgA/team', + }, + namespace: 'orga', + name: 'team', + description: 'The one and only team', + }, + spec: { + children: [], + profile: { + displayName: 'TeamA', + picture: 'http://example.com/team.jpeg', + }, + type: 'team', + members: [], + }, + }, + locationKey: 'github-multi-org-provider:my-id', + }, + ], + removed: [ + { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + annotations: { + 'backstage.io/managed-by-location': + 'url:https://github.com/orgs/orgA/teams/oldname', + 'backstage.io/managed-by-origin-location': + 'url:https://github.com/orgs/orgA/teams/oldname', + 'github.com/team-slug': 'orgA/oldname', + }, + namespace: 'orga', + name: 'oldname', + description: 'oldDescription', + }, + spec: { + children: [], + profile: { + displayName: 'oldName', + }, + type: 'team', + members: [], + }, + }, + locationKey: 'github-multi-org-provider:my-id', + }, + ], + }); + }); }); describe('membership', () => { diff --git a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts index 4367383cd2..fbfdc8a20d 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts @@ -602,7 +602,9 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { editTeamUrl: `${url}/edit`, combinedSlug: `${org}/${slug}`, description: description ?? undefined, - parentTeam: { slug: event.team?.parent?.slug || '' } as GithubTeam, + parentTeam: event.team?.parent?.slug + ? ({ slug: event.team.parent.slug } as GithubTeam) + : undefined, // entity will be removed or is new members: [], }, @@ -705,7 +707,9 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { slug: oldSlug, combinedSlug: `${org}/${oldSlug}`, description: event.changes.description?.from, - parentTeam: { slug: event.team?.parent?.slug || '' } as GithubTeam, + parentTeam: event.team?.parent?.slug + ? ({ slug: event.team.parent.slug } as GithubTeam) + : undefined, // entity will be removed members: [], }, diff --git a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md index 0d7a36b32b..f53dc5ad31 100644 --- a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-catalog-backend-module-gitlab-org +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-catalog-backend-module-gitlab@0.6.2-next.1 + +## 0.2.5-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.6.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.6.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-backend-module-gitlab@0.6.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab-org/package.json b/plugins/catalog-backend-module-gitlab-org/package.json index 94daed3905..f0c820ff2c 100644 --- a/plugins/catalog-backend-module-gitlab-org/package.json +++ b/plugins/catalog-backend-module-gitlab-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab-org", - "version": "0.2.4-next.1", + "version": "0.2.5-next.1", "description": "The gitlab-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", @@ -33,7 +33,6 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/plugin-catalog-backend-module-gitlab": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", diff --git a/plugins/catalog-backend-module-gitlab-org/src/catalogModuleGitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab-org/src/catalogModuleGitlabOrgDiscoveryEntityProvider.ts index ffb2cfb629..85c1b65028 100644 --- a/plugins/catalog-backend-module-gitlab-org/src/catalogModuleGitlabOrgDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab-org/src/catalogModuleGitlabOrgDiscoveryEntityProvider.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { loggerToWinstonLogger } from '@backstage/backend-common'; import { coreServices, createBackendModule, @@ -44,7 +43,7 @@ export const catalogModuleGitlabOrgDiscoveryEntityProvider = async init({ config, catalog, logger, scheduler, events }) { const gitlabOrgDiscoveryEntityProvider = GitlabOrgDiscoveryEntityProvider.fromConfig(config, { - logger: loggerToWinstonLogger(logger), + logger, events, scheduler, }); diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 9f97a2d634..007d8d7fbf 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,72 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## 0.6.1-next.0 + +### Patch Changes + +- 575613f: Go back to using `node-fetch` for gitlab +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.6.0 + +### Minor Changes + +- 99dce5c: Implemented discovery for top-level groups defined in config.group or if undefined global top-level group in Gitlab + +### Patch Changes + +- 191e5bf: `restrictUsersToGroup` should use the entire group path when getting members +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + +## 0.6.0-next.2 + +### Minor Changes + +- 99dce5c: Implemented discovery for top-level groups defined in config.group or if undefined global top-level group in Gitlab + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.5.1-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 4649de9304..bc1b924502 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", - "version": "0.5.1-next.1", + "version": "0.6.2-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitLab", "backstage": { "role": "backend-plugin-module", @@ -61,6 +61,7 @@ "@backstage/plugin-events-node": "workspace:^", "@gitbeaker/rest": "^40.0.3", "lodash": "^4.17.21", + "node-fetch": "^2.7.0", "uuid": "^11.0.0" }, "devDependencies": { diff --git a/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts b/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts index 953ade6b7c..041aa5b835 100644 --- a/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts +++ b/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts @@ -83,7 +83,7 @@ const httpHandlers = [ }), rest.get( - `${apiBaseUrlSaas}/groups/subgroup1/members/all`, + `${apiBaseUrlSaas}/groups/group1%2Fsubgroup1/members/all`, (_req, res, ctx) => { return res(ctx.json(subgroup_saas_users_response)); // To-DO change }, @@ -136,6 +136,22 @@ const httpHandlers = [ // dynamic handlers +// https://docs.gitlab.com/ee/api/groups.html#list-group-details supports encoded path and id +const httpGroupFindByEncodedPathDynamic = all_groups_response.flatMap(group => [ + // Handler for apiBaseUrl + rest.get(`${apiBaseUrl}/groups/${group.full_path}`, (_, res, ctx) => { + return res( + ctx.json(all_groups_response.find(g => g.full_path === group.full_path)), + ); + }), + // Handler for apiSaaSBaseUrl + rest.get(`${apiBaseUrlSaas}/groups/${group.full_path}`, (_, res, ctx) => { + return res( + ctx.json(all_groups_response.find(g => g.full_path === group.full_path)), + ); + }), +]); + const httpGroupFindByIdDynamic = all_groups_response.map(group => { return rest.get(`${apiBaseUrl}/groups/${group.id}`, (_, res, ctx) => { return res(ctx.json(all_groups_response.find(g => g.id === group.id))); @@ -618,4 +634,5 @@ export const handlers = [ ...httpGroupListDescendantProjectsById, ...httpGroupListDescendantProjectsByName, ...graphqlHandlers, + ...httpGroupFindByEncodedPathDynamic, ]; diff --git a/plugins/catalog-backend-module-gitlab/src/__testUtils__/mocks.ts b/plugins/catalog-backend-module-gitlab/src/__testUtils__/mocks.ts index 2547015df8..d9914c0d0c 100644 --- a/plugins/catalog-backend-module-gitlab/src/__testUtils__/mocks.ts +++ b/plugins/catalog-backend-module-gitlab/src/__testUtils__/mocks.ts @@ -1041,7 +1041,7 @@ export const all_groups_response: GitLabGroup[] = [ { id: 1, name: 'group1', - description: '', + description: 'description1', full_path: 'group1', }, { @@ -1804,6 +1804,7 @@ export const expected_group_user_entity: MockObject[] = [ 'url:https://example.com/group1', 'example.com/team-path': 'group1', }, + description: 'description1', name: 'group1', }, spec: { @@ -2090,6 +2091,7 @@ export const expected_full_org_scan_entities: MockObject[] = [ 'url:https://example.com/group1', 'example.com/team-path': 'group1', }, + description: 'description1', name: 'group1', }, spec: { @@ -2347,7 +2349,7 @@ export const expected_full_members_group_org_scan_entities: MockObject[] = [ name: 'JohnDoe', }, spec: { - memberOf: ['subgroup1'], + memberOf: ['group1', 'subgroup1'], // since #26554 also config.group needs to be here. profile: { displayName: 'John Doe', email: 'john.doe@company.com', @@ -2431,6 +2433,30 @@ export const expected_full_members_group_org_scan_entities: MockObject[] = [ }, locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', }, + { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + annotations: { + 'backstage.io/managed-by-location': 'url:https://example.com/group1', + 'backstage.io/managed-by-origin-location': + 'url:https://example.com/group1', + 'example.com/team-path': 'group1', + }, + description: 'description1', + name: 'group1', + }, + spec: { + children: [], + profile: { + displayName: 'group1', + }, + type: 'team', + }, + }, + locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', + }, { entity: { apiVersion: 'backstage.io/v1alpha1', @@ -2472,7 +2498,7 @@ export const expected_group_members_group_org_scan_entities: MockObject[] = [ name: 'JohnDoe', }, spec: { - memberOf: ['subgroup1'], + memberOf: ['subgroup1', 'group1'], profile: { displayName: 'John Doe', email: 'john.doe@company.com', @@ -2507,6 +2533,30 @@ export const expected_group_members_group_org_scan_entities: MockObject[] = [ }, locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', }, + { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + annotations: { + 'backstage.io/managed-by-location': 'url:https://example.com/group1', + 'backstage.io/managed-by-origin-location': + 'url:https://example.com/group1', + 'example.com/team-path': 'group1', + }, + name: 'group1', + description: 'description1', + }, + spec: { + children: [], + profile: { + displayName: 'group1', + }, + type: 'team', + }, + }, + locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', + }, ]; export const all_self_hosted_group1_members: MockObject[] = [ diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index 4003ee5ea7..561f38634b 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -14,6 +14,9 @@ * limitations under the License. */ +// NOTE(freben): Intentionally uses node-fetch because of https://github.com/backstage/backstage/issues/28190 +import fetch from 'node-fetch'; + import { getGitLabRequestOptions, GitLabIntegrationConfig, @@ -165,6 +168,15 @@ export class GitLabClient { return this.pagedRequest(`/groups`, options); } + // https://docs.gitlab.com/ee/api/groups.html#list-group-details + // id can either be group id or encoded full path + async getGroupByPath( + groupPath: string, + options?: CommonListOptions, + ): Promise { + return this.nonPagedRequest(`/groups/${groupPath}`, options); + } + async listDescendantGroups( groupPath: string, ): Promise> { diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts index a15894b236..5f62cedb71 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts @@ -435,7 +435,7 @@ describe('GitlabOrgDiscoveryEntityProvider - refresh', () => { }); // This should return all members of the self-hosted instance regardless of the group set -> expected_full_members_group_org_scan_entities - // All instance members, but only the group entities below the config.group + // All instance members, but only the group entities of config.group and below (#26554) it('Self-hosted: should get all instance users when restrictUsersToGroup is not set', async () => { const config = new ConfigReader(mock.config_org_group_selfHosted); const schedule = new PersistingTaskRunner(); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts index 277a5a8c51..1fbd2a2a13 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts @@ -366,6 +366,7 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { if (this.gitLabClient.isSelfManaged() && this.config.restrictUsersToGroup) { groups = (await this.gitLabClient.listDescendantGroups(this.config.group)) .items; + groups.push(await this.gitLabClient.getGroupByPath(this.config.group)); // adds the parent group for #26554 users = paginated( options => this.gitLabClient.listGroupMembers(this.config.group, options), // calls /groups//members @@ -395,14 +396,18 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { else { groups = (await this.gitLabClient.listDescendantGroups(this.config.group)) .items; + + groups.push(await this.gitLabClient.getGroupByPath(this.config.group)); // adds the parent group for #26554 + const rootGroupSplit = this.config.group.split('/'); - const rootGroup = this.config.restrictUsersToGroup - ? rootGroupSplit[rootGroupSplit.length - 1] + const groupPath = this.config.restrictUsersToGroup + ? this.config.group : rootGroupSplit[0]; + users = paginated( options => this.gitLabClient.listSaaSUsers( - rootGroup, + groupPath, options, this.config.includeUsersWithoutSeat, ), @@ -775,7 +780,8 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { return ( this.config.groupPattern.test(group.full_path) && (!this.config.group || - group.full_path.startsWith(`${this.config.group}/`)) + group.full_path.startsWith(`${this.config.group}/`) || + group.full_path === this.config.group) ); } diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index db5a402e0a..166954ed54 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,79 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## 0.6.2-next.0 + +### Patch Changes + +- ec547b8: Remove the error handler middleware, since that is now provided by the framework +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-permission-common@0.8.3 + +## 0.6.1 + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- cce9cae: Deprecate old-backend-system `IncrementalCatalogBuilder` +- fe87fbf: Add task metrics as two gauges that track the last start and end timestamps as epoch seconds. +- 5aa44d2: Wire up the events together in the new backend system +- d42ecb0: Remove backend-common package from incremental-ingestion plugin and update related code +- 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-defaults@0.6.0 + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## 0.6.1-next.2 + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- d42ecb0: Remove backend-common package from incremental-ingestion plugin and update related code +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.6.1-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index f2f58e13e3..073ed2778f 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", - "version": "0.6.1-next.1", + "version": "0.6.2-next.1", "description": "An entity provider for streaming large asset sources into the catalog", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/module/WrapperProviders.ts b/plugins/catalog-backend-module-incremental-ingestion/src/module/WrapperProviders.ts index 2f8a8df3ba..11b9619dc5 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/module/WrapperProviders.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/module/WrapperProviders.ts @@ -79,7 +79,6 @@ export class WrapperProviders { return new IncrementalProviderRouter( new IncrementalIngestionDatabaseManager({ client: this.options.client }), this.options.logger, - this.options.config, ).createRouter(); } diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/router/routes.ts b/plugins/catalog-backend-module-incremental-ingestion/src/router/routes.ts index ad8d6ce103..ca6f600840 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/router/routes.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/router/routes.ts @@ -18,22 +18,17 @@ import express from 'express'; import Router from 'express-promise-router'; import { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager'; import { LoggerService } from '@backstage/backend-plugin-api'; -import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter'; -import { Config } from '@backstage/config'; export class IncrementalProviderRouter { private manager: IncrementalIngestionDatabaseManager; private logger: LoggerService; - private config: Config; constructor( manager: IncrementalIngestionDatabaseManager, logger: LoggerService, - config: Config, ) { this.manager = manager; this.logger = logger; - this.config = config; } createRouter(): express.Router { @@ -253,12 +248,6 @@ export class IncrementalProviderRouter { }, ); - const middleware = MiddlewareFactory.create({ - logger: this.logger, - config: this.config, - }); - router.use(middleware.error()); - return router; } } diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts b/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts index ed4414b68b..6ea2f10a64 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts @@ -66,7 +66,6 @@ export class IncrementalCatalogBuilder { const incrementalAdminRouter = await new IncrementalProviderRouter( this.manager, routerLogger, - this.env.config, ).createRouter(); return { incrementalAdminRouter }; diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 9423a0847c..f39c3a6ad1 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,63 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.11.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## 0.11.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## 0.11.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.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + +## 0.11.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.11.0-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 860c39f8fe..e6c6884be7 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", - "version": "0.11.0-next.1", + "version": "0.11.1-next.1", "description": "A Backstage catalog backend module that helps integrate towards LDAP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-logs/CHANGELOG.md b/plugins/catalog-backend-module-logs/CHANGELOG.md index b835c1cfe6..42ecfecf33 100644 --- a/plugins/catalog-backend-module-logs/CHANGELOG.md +++ b/plugins/catalog-backend-module-logs/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-catalog-backend-module-logs +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-catalog-backend@1.30.0-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.30.0-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-logs/package.json b/plugins/catalog-backend-module-logs/package.json index 276040b7f0..4350d83b4e 100644 --- a/plugins/catalog-backend-module-logs/package.json +++ b/plugins/catalog-backend-module-logs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-logs", - "version": "0.1.5-next.1", + "version": "0.1.6-next.1", "description": "A module that subscribes to catalog releated events and logs them.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index 5c79632259..08231f2651 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,56 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.6.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## 0.6.6-next.1 + +### Patch Changes + +- 29a4aa8: fix(config): add missing parameters in config schema + +## 0.6.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## 0.6.5 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + +## 0.6.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.6.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/config.d.ts b/plugins/catalog-backend-module-msgraph/config.d.ts index b93026e1bb..b04c1cd303 100644 --- a/plugins/catalog-backend-module-msgraph/config.d.ts +++ b/plugins/catalog-backend-module-msgraph/config.d.ts @@ -165,6 +165,12 @@ export interface Config { * This can be useful for huge organizations. */ loadPhotos?: boolean; + /** + * The fields to be fetched on query. + * + * E.g. ["id", "displayName", "description"] + */ + select?: string[]; }; group?: { @@ -257,15 +263,38 @@ export interface Config { */ queryMode?: string; user?: { + /** + * The "expand" argument to apply to users. + * + * E.g. "manager". + */ + expand?: string; /** * The filter to apply to extract users. * * E.g. "accountEnabled eq true and userType eq 'member'" */ filter?: string; + /** + * Set to false to not load user photos. + * This can be useful for huge organizations. + */ + loadPhotos?: boolean; + /** + * The fields to be fetched on query. + * + * E.g. ["id", "displayName", "description"] + */ + select?: string[]; }; group?: { + /** + * The "expand" argument to apply to groups. + * + * E.g. "member". + */ + expand?: string; /** * The filter to apply to extract groups. * @@ -284,6 +313,11 @@ export interface Config { * E.g. ["id", "displayName", "description"] */ select?: string[]; + /** + * Whether to ingest groups that are members of the found/filtered/searched groups. + * Default value is `false`. + */ + includeSubGroups?: boolean; }; userGroupMember?: { diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 40d0a02f24..0e1b77deb9 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", - "version": "0.6.5-next.1", + "version": "0.6.6-next.2", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts index 60e5c3d79b..4f1c9efbe2 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts @@ -296,7 +296,7 @@ export function resolveRelations( groupMember: Map>, groupMemberOf: Map>, ) { - // Build reference lookup tables, we reference them by the id the the graph + // Build reference lookup tables, we reference them by the id of the graph const groupMap: Map = new Map(); // by group-id or tenant-id for (const group of groups) { diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 5b4c8e8321..0c8d4526e3 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,58 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## 0.2.6-next.0 + +### Patch Changes + +- 57e794a: Refactor to no longer use backend-common +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## 0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0 + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 5af307fa3f..a6266a8bf3 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", - "version": "0.2.5-next.1", + "version": "0.2.6-next.1", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", "backstage": { "role": "backend-plugin-module", @@ -38,16 +38,12 @@ }, "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.0.0", - "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-model": "workspace:^", - "@backstage/config": "workspace:^", "@backstage/integration": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", - "winston": "^3.2.1", "yaml": "^2.1.1" }, "devDependencies": { diff --git a/plugins/catalog-backend-module-openapi/report.api.md b/plugins/catalog-backend-module-openapi/report.api.md index d79d852387..5884a486cd 100644 --- a/plugins/catalog-backend-module-openapi/report.api.md +++ b/plugins/catalog-backend-module-openapi/report.api.md @@ -5,12 +5,12 @@ ```ts import { BackendFeature } from '@backstage/backend-plugin-api'; import { CatalogProcessor } from '@backstage/plugin-catalog-node'; -import { Config } from '@backstage/config'; import { Entity } from '@backstage/catalog-model'; import { JsonValue } from '@backstage/types'; import { LocationSpec } from '@backstage/plugin-catalog-common'; -import { Logger } from 'winston'; -import { PlaceholderResolverParams } from '@backstage/plugin-catalog-backend'; +import { LoggerService } from '@backstage/backend-plugin-api'; +import { PlaceholderResolverParams } from '@backstage/plugin-catalog-node'; +import { RootConfigService } from '@backstage/backend-plugin-api'; import { ScmIntegrations } from '@backstage/integration'; import { UrlReaderService } from '@backstage/backend-plugin-api'; @@ -30,14 +30,14 @@ export const openApiPlaceholderResolver: typeof jsonSchemaRefPlaceholderResolver export class OpenApiRefProcessor implements CatalogProcessor { constructor(options: { integrations: ScmIntegrations; - logger: Logger; + logger: LoggerService; reader: UrlReaderService; }); // (undocumented) static fromConfig( - config: Config, + config: RootConfigService, options: { - logger: Logger; + logger: LoggerService; reader: UrlReaderService; }, ): OpenApiRefProcessor; diff --git a/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.test.ts b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.test.ts index ea165b74a7..6e6e476525 100644 --- a/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.test.ts +++ b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.test.ts @@ -13,12 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ConfigReader } from '@backstage/config'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; + +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { OpenApiRefProcessor } from './OpenApiRefProcessor'; import { bundleFileWithRefs } from './lib'; import { mockServices } from '@backstage/backend-test-utils'; -import { loggerToWinstonLogger } from '@backstage/backend-common'; jest.mock('./lib', () => ({ bundleFileWithRefs: jest.fn(), @@ -46,15 +45,10 @@ describe('OpenApiRefProcessor', () => { kind, spec: { definition: '', ...spec }, }; - const config = new ConfigReader({}); - const reader = { - read: jest.fn(), - readUrl: jest.fn(), - readTree: jest.fn(), - search: jest.fn(), - }; + const config = mockServices.rootConfig(); + const reader = mockServices.urlReader.mock(); const processor = OpenApiRefProcessor.fromConfig(config, { - logger: loggerToWinstonLogger(mockServices.logger.mock()), + logger: mockServices.logger.mock(), reader, }); diff --git a/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts index 39de58466e..d666e1d374 100644 --- a/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts +++ b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts @@ -13,14 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { UrlReaderService } from '@backstage/backend-plugin-api'; + +import { + LoggerService, + RootConfigService, + UrlReaderService, +} from '@backstage/backend-plugin-api'; import { Entity } from '@backstage/catalog-model'; -import { Config } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; import { CatalogProcessor } from '@backstage/plugin-catalog-node'; import { LocationSpec } from '@backstage/plugin-catalog-common'; import { bundleFileWithRefs } from './lib'; -import { Logger } from 'winston'; /** * @public @@ -28,12 +31,12 @@ import { Logger } from 'winston'; */ export class OpenApiRefProcessor implements CatalogProcessor { private readonly integrations: ScmIntegrations; - private readonly logger: Logger; + private readonly logger: LoggerService; private readonly reader: UrlReaderService; static fromConfig( - config: Config, - options: { logger: Logger; reader: UrlReaderService }, + config: RootConfigService, + options: { logger: LoggerService; reader: UrlReaderService }, ) { const integrations = ScmIntegrations.fromConfig(config); @@ -45,7 +48,7 @@ export class OpenApiRefProcessor implements CatalogProcessor { constructor(options: { integrations: ScmIntegrations; - logger: Logger; + logger: LoggerService; reader: UrlReaderService; }) { this.integrations = options.integrations; diff --git a/plugins/catalog-backend-module-openapi/src/jsonSchemaRefPlaceholderResolver.test.ts b/plugins/catalog-backend-module-openapi/src/jsonSchemaRefPlaceholderResolver.test.ts index afa523ccf0..280d00c4fa 100644 --- a/plugins/catalog-backend-module-openapi/src/jsonSchemaRefPlaceholderResolver.test.ts +++ b/plugins/catalog-backend-module-openapi/src/jsonSchemaRefPlaceholderResolver.test.ts @@ -13,7 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { PlaceholderResolverParams } from '@backstage/plugin-catalog-backend'; + +import { PlaceholderResolverParams } from '@backstage/plugin-catalog-node'; import { jsonSchemaRefPlaceholderResolver } from './jsonSchemaRefPlaceholderResolver'; import { bundleFileWithRefs } from './lib'; diff --git a/plugins/catalog-backend-module-openapi/src/jsonSchemaRefPlaceholderResolver.ts b/plugins/catalog-backend-module-openapi/src/jsonSchemaRefPlaceholderResolver.ts index befafbde8a..91a01afec1 100644 --- a/plugins/catalog-backend-module-openapi/src/jsonSchemaRefPlaceholderResolver.ts +++ b/plugins/catalog-backend-module-openapi/src/jsonSchemaRefPlaceholderResolver.ts @@ -13,9 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { PlaceholderResolverParams } from '@backstage/plugin-catalog-backend'; + import { JsonValue } from '@backstage/types'; -import { processingResult } from '@backstage/plugin-catalog-node'; +import { + PlaceholderResolverParams, + processingResult, +} from '@backstage/plugin-catalog-node'; import { bundleFileWithRefs } from './lib'; /** @public */ diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index e878c65559..6b7b83bd49 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,54 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + +## 0.2.5 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index 50a1a7d69b..65770f85f2 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", - "version": "0.2.5-next.1", + "version": "0.2.6-next.1", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md index 9509d56d04..225d939243 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md +++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-catalog-backend-module-scaffolder-entity-model +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-scaffolder-common@1.5.8 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-catalog-common@1.1.2 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json index 94ac6c74e9..ab0aa88e2d 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json +++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md index 9c044ccd8a..3abef7be97 100644 --- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-catalog-backend-module-unprocessed +## 0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.7-next.0 + +## 0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/errors@1.2.6 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.6 + - @backstage/plugin-permission-common@0.8.3 + +## 0.5.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.6 + - @backstage/plugin-permission-common@0.8.3 + +## 0.5.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.6-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.5.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index 6a93b27bdc..1ad1c2e7a4 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-unprocessed", - "version": "0.5.3-next.1", + "version": "0.5.4-next.1", "description": "Backstage Catalog module to view unprocessed entities", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 9a61eba8b6..3788471093 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,125 @@ # @backstage/plugin-catalog-backend +## 1.30.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-openapi-utils@0.4.1-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## 1.30.0-next.0 + +### Minor Changes + +- dd515e3: Removed the long-deprecated `DefaultCatalogCollatorFactory` and `DefaultCatalogCollatorFactoryOptions` exports, which now no longer exist in the search plugin's offerings. If you were using these, you want to migrate to [the new backend system](https://backstage.io/docs/backend-system/) and use the [catalog collator](https://backstage.io/docs/features/search/collators#catalog) directly. + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- be0aae7: Improved concurrency of the `entities` endpoint when using the streamed query mode behind the `catalog.disableRelationsCompatibility` flag. +- 3d475a0: Updated condition in `resolveCodeOwner` to fix a bug where `normalizeCodeOwner` could potentially be called with an invalid argument causing an error in `CodeOwnersProcessor` +- Updated dependencies + - @backstage/plugin-search-backend-module-catalog@0.3.0-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/backend-openapi-utils@0.4.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-permission-common@0.8.3 + +## 1.29.0 + +### Minor Changes + +- 02bd2cb: Added a new `catalog.disableRelationsCompatibility` configuration option that avoids JSON deserialization and serialization if possible when reading entities. This significantly reduces the memory usage of the catalog, and slightly increases performance, but it removes the backwards compatibility processing that ensures that both `entity.relation[].target` and `entity.relation[].targetRef` are present in returned entities. +- c1307b4: Implement `/entities` in terms of `queryEntities` to not run into memory and performance problems on large catalogs +- 384e494: Internal updates to generated code. +- 1d0bc11: Fetch all facets in a single database query + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 8013c9c: Perform the by-query count inlined with the main query +- feba9ee: Internal refactor of filter parsing logic. +- 1fdb48e: Use a faster count method on pg when computing some metrics +- e4aab10: Fix a bug where sometimes the `by-query` endpoint could return nulls for entities that were not yet stitched. +- f159b25: Compute deltas more efficiently, which generally leads to less wasted processing cycles +- 0c33465: Implement `/entities/by-name/:kind/:namespace/:name` using `getEntitiesByRefs` +- 56511ba: Be more aggressive in dequeueing entities for stitching +- 71152e3: Correctly report stitching queue length +- 5c9cc05: Use native fetch instead of node-fetch +- d93390d: When parsing filters, do not make redundant `anyOf` and `allOf` nodes when there's only a single entry within them +- 3ab57c6: Support changing location keys on existing entities, in delta mutations +- 24ecea8: Avoid extra ordering in by-query when the user doesn't ask for it +- 2924ffe: Compute some metrics using search table facet aggregations instead of reading the full refresh state +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-module-catalog@0.2.6 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/backend-openapi-utils@0.4.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + +## 1.29.0-next.2 + +### Minor Changes + +- c1307b4: Implement `/entities` in terms of `queryEntities` to not run into memory and performance problems on large catalogs + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 8013c9c: Perform the by-query count inlined with the main query +- feba9ee: Use a join based strategy for filtering, when having small page sizes +- 1fdb48e: Use a faster count method on pg when computing some metrics +- 0c33465: Implement `/entities/by-name/:kind/:namespace/:name` using `getEntitiesByRefs` +- d93390d: When parsing filters, do not make redundant `anyOf` and `allOf` nodes when there's only a single entry within them +- 24ecea8: Avoid extra ordering in by-query when the user doesn't ask for it +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.29.0-next.1 ### Minor Changes diff --git a/plugins/catalog-backend/config.d.ts b/plugins/catalog-backend/config.d.ts index 8dd5e50480..384765f92e 100644 --- a/plugins/catalog-backend/config.d.ts +++ b/plugins/catalog-backend/config.d.ts @@ -138,6 +138,16 @@ export interface Config { }>; }>; + /** + * Disables the compatibility layer for relations in returned entities that + * ensures that all relations objects have both `target` and `targetRef`. + * + * Enabling this option significantly reduces the memory usage of the + * catalog, and slightly increases performance, but may break consumers that + * rely on the existence of `target` in the relations objects. + */ + disableRelationsCompatibility?: boolean; + /** * The strategy to use for entities that are orphaned, i.e. no longer have * any other entities or providers referencing them. The default value is diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index b5c09c8eea..216e720b07 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend", - "version": "1.29.0-next.1", + "version": "1.30.0-next.1", "description": "The Backstage backend plugin that provides the Backstage catalog", "backstage": { "role": "backend-plugin", diff --git a/plugins/catalog-backend/report.api.md b/plugins/catalog-backend/report.api.md index a200057a3a..ea7e11d0d7 100644 --- a/plugins/catalog-backend/report.api.md +++ b/plugins/catalog-backend/report.api.md @@ -28,8 +28,6 @@ import { CatalogProcessorRelationResult as CatalogProcessorRelationResult_2 } fr import { CatalogProcessorResult as CatalogProcessorResult_2 } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; import { DatabaseService } from '@backstage/backend-plugin-api'; -import { DefaultCatalogCollatorFactory as DefaultCatalogCollatorFactory_2 } from '@backstage/plugin-search-backend-module-catalog'; -import { DefaultCatalogCollatorFactoryOptions as DefaultCatalogCollatorFactoryOptions_2 } from '@backstage/plugin-search-backend-module-catalog'; import { DeferredEntity as DeferredEntity_2 } from '@backstage/plugin-catalog-node'; import { DiscoveryService } from '@backstage/backend-plugin-api'; import { EntitiesSearchFilter as EntitiesSearchFilter_2 } from '@backstage/plugin-catalog-node'; @@ -58,7 +56,6 @@ import { PlaceholderResolver as PlaceholderResolver_2 } from '@backstage/plugin- import { PlaceholderResolverParams as PlaceholderResolverParams_2 } from '@backstage/plugin-catalog-node'; import { PlaceholderResolverRead as PlaceholderResolverRead_2 } from '@backstage/plugin-catalog-node'; import { PlaceholderResolverResolveUrl as PlaceholderResolverResolveUrl_2 } from '@backstage/plugin-catalog-node'; -import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { RootConfigService } from '@backstage/backend-plugin-api'; import { Router } from 'express'; import { SchedulerService } from '@backstage/backend-plugin-api'; @@ -285,7 +282,7 @@ export function createRandomProcessingInterval(options: { // @public @deprecated (undocumented) export class DefaultCatalogCollator { constructor(options: { - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; tokenManager: TokenManager; locationTemplate?: string; filter?: GetEntitiesRequest['filter']; @@ -299,7 +296,7 @@ export class DefaultCatalogCollator { // (undocumented) protected readonly catalogClient: CatalogApi; // (undocumented) - protected discovery: PluginEndpointDiscovery; + protected discovery: DiscoveryService; // (undocumented) execute(): Promise; // (undocumented) @@ -308,7 +305,7 @@ export class DefaultCatalogCollator { static fromConfig( _config: Config, options: { - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; tokenManager: TokenManager; filter?: GetEntitiesRequest['filter']; }, @@ -326,13 +323,6 @@ export class DefaultCatalogCollator { // @public @deprecated (undocumented) export const defaultCatalogCollatorEntityTransformer: CatalogCollatorEntityTransformer_2; -// @public @deprecated (undocumented) -export const DefaultCatalogCollatorFactory: typeof DefaultCatalogCollatorFactory_2; - -// @public @deprecated (undocumented) -export type DefaultCatalogCollatorFactoryOptions = - DefaultCatalogCollatorFactoryOptions_2; - // @public @deprecated (undocumented) export type DeferredEntity = DeferredEntity_2; diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index a02c74c0c1..1fbf337986 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -52,8 +52,22 @@ export type EntitiesRequest = { credentials: BackstageCredentials; }; +/** + * Encapsulates either a deserialized or serialized entities to be sent in a response. + * @internal + */ +export type EntitiesResponseItems = + | { + type: 'object'; + entities: (Entity | null)[]; + } + | { + type: 'raw'; + entities: (string | null)[]; + }; + export type EntitiesResponse = { - entities: Entity[]; + entities: EntitiesResponseItems; pageInfo: PageInfo; }; @@ -86,7 +100,7 @@ export interface EntitiesBatchResponse { * The list of entities, in the same order as the refs in the request. Entries * that are null signify that no entity existed with that ref. */ - items: Array; + items: EntitiesResponseItems; } export type EntityAncestryResponse = { @@ -203,6 +217,7 @@ export interface QueryEntitiesInitialRequest { term: string; fields?: string[]; }; + skipTotalItems?: boolean; } /** @@ -223,7 +238,7 @@ export interface QueryEntitiesResponse { /** * The entities for the current pagination request */ - items: Entity[]; + items: EntitiesResponseItems; pageInfo: { /** diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index 37608b1493..e530c30d8b 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -283,7 +283,7 @@ describe('DefaultProcessingDatabase', () => { ); it.each(databases.eachSupportedId())( - 'adds deferred entities to the the refresh_state table to be picked up later, %p', + 'adds deferred entities to the refresh_state table to be picked up later, %p', async databaseId => { const { knex, db } = await createDatabase(databaseId); await insertRefreshStateRow(knex, { diff --git a/plugins/catalog-backend/src/database/metrics.ts b/plugins/catalog-backend/src/database/metrics.ts index d8cd87558f..809405d69f 100644 --- a/plugins/catalog-backend/src/database/metrics.ts +++ b/plugins/catalog-backend/src/database/metrics.ts @@ -98,20 +98,40 @@ export function initDatabaseMetrics(knex: Knex) { description: 'Total amount of registered locations in the catalog', }) .addCallback(async gauge => { - const total = await knex('locations').count({ - count: '*', - }); - gauge.observe(Number(total[0].count)); + if (knex.client.config.client === 'pg') { + // https://stackoverflow.com/questions/7943233/fast-way-to-discover-the-row-count-of-a-table-in-postgresql + const total = await knex.raw(` + SELECT reltuples::bigint AS estimate + FROM pg_class + WHERE oid = 'locations'::regclass; + `); + gauge.observe(Number(total.rows[0].estimate)); + } else { + const total = await knex('locations').count({ + count: '*', + }); + gauge.observe(Number(total[0].count)); + } }), relations: meter .createObservableGauge('catalog_relations_count', { description: 'Total amount of relations between entities', }) .addCallback(async gauge => { - const total = await knex('relations').count({ - count: '*', - }); - gauge.observe(Number(total[0].count)); + if (knex.client.config.client === 'pg') { + // https://stackoverflow.com/questions/7943233/fast-way-to-discover-the-row-count-of-a-table-in-postgresql + const total = await knex.raw(` + SELECT reltuples::bigint AS estimate + FROM pg_class + WHERE oid = 'relations'::regclass; + `); + gauge.observe(Number(total.rows[0].estimate)); + } else { + const total = await knex('relations').count({ + count: '*', + }); + gauge.observe(Number(total[0].count)); + } }), }; } diff --git a/plugins/catalog-backend/src/deprecated.ts b/plugins/catalog-backend/src/deprecated.ts index 2d08d2ce0c..3865852214 100644 --- a/plugins/catalog-backend/src/deprecated.ts +++ b/plugins/catalog-backend/src/deprecated.ts @@ -53,9 +53,7 @@ import { } from '@backstage/plugin-catalog-node'; import { defaultCatalogCollatorEntityTransformer as _defaultCatalogCollatorEntityTransformer, - DefaultCatalogCollatorFactory as _DefaultCatalogCollatorFactory, type CatalogCollatorEntityTransformer as _CatalogCollatorEntityTransformer, - type DefaultCatalogCollatorFactoryOptions as _DefaultCatalogCollatorFactoryOptions, } from '@backstage/plugin-search-backend-module-catalog'; /** @@ -254,12 +252,6 @@ export type AnalyzeLocationGenerateEntity = _AnalyzeLocationGenerateEntity; */ export type AnalyzeLocationEntityField = _AnalyzeLocationEntityField; -/** - * @public - * @deprecated import from `@backstage/plugin-search-backend-module-catalog` instead - */ -export const DefaultCatalogCollatorFactory = _DefaultCatalogCollatorFactory; - /** * @public * @deprecated import from `@backstage/plugin-search-backend-module-catalog` instead @@ -267,13 +259,6 @@ export const DefaultCatalogCollatorFactory = _DefaultCatalogCollatorFactory; export const defaultCatalogCollatorEntityTransformer = _defaultCatalogCollatorEntityTransformer; -/** - * @public - * @deprecated import from `@backstage/plugin-search-backend-module-catalog` instead - */ -export type DefaultCatalogCollatorFactoryOptions = - _DefaultCatalogCollatorFactoryOptions; - /** * @public * @deprecated import from `@backstage/plugin-search-backend-module-catalog` instead diff --git a/plugins/catalog-backend/src/processors/PlaceholderProcessor.test.ts b/plugins/catalog-backend/src/processors/PlaceholderProcessor.test.ts index c2c49ea1cb..9d47877972 100644 --- a/plugins/catalog-backend/src/processors/PlaceholderProcessor.test.ts +++ b/plugins/catalog-backend/src/processors/PlaceholderProcessor.test.ts @@ -28,16 +28,12 @@ import { textPlaceholderResolver, yamlPlaceholderResolver, } from './PlaceholderProcessor'; -import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { mockServices } from '@backstage/backend-test-utils'; const integrations = ScmIntegrations.fromConfig(new ConfigReader({})); describe('PlaceholderProcessor', () => { - const reader: jest.Mocked = { - readTree: jest.fn(), - search: jest.fn(), - readUrl: jest.fn(), - }; + const reader = mockServices.urlReader.mock(); beforeEach(() => { jest.resetAllMocks(); diff --git a/plugins/catalog-backend/src/processors/UrlReaderProcessor.test.ts b/plugins/catalog-backend/src/processors/UrlReaderProcessor.test.ts index 545888e7cb..4a8f982027 100644 --- a/plugins/catalog-backend/src/processors/UrlReaderProcessor.test.ts +++ b/plugins/catalog-backend/src/processors/UrlReaderProcessor.test.ts @@ -31,7 +31,6 @@ import { import { defaultEntityDataParser } from '../util/parse'; import { UrlReaderProcessor } from './UrlReaderProcessor'; import { UrlReaders } from '@backstage/backend-defaults/urlReader'; -import { UrlReaderService } from '@backstage/backend-plugin-api'; describe('UrlReaderProcessor', () => { const mockApiOrigin = 'http://localhost'; @@ -193,11 +192,9 @@ describe('UrlReaderProcessor', () => { it('uses search when there are globs', async () => { const logger = mockServices.logger.mock(); - const reader: jest.Mocked = { - readUrl: jest.fn(), - readTree: jest.fn(), - search: jest.fn().mockImplementation(async () => []), - }; + const reader = mockServices.urlReader.mock({ + search: jest.fn().mockResolvedValue([]), + }); const processor = new UrlReaderProcessor({ reader, logger }); diff --git a/plugins/catalog-backend/src/processors/codeowners/resolve.test.ts b/plugins/catalog-backend/src/processors/codeowners/resolve.test.ts index f9cdf79530..722d27fdb9 100644 --- a/plugins/catalog-backend/src/processors/codeowners/resolve.test.ts +++ b/plugins/catalog-backend/src/processors/codeowners/resolve.test.ts @@ -46,6 +46,14 @@ describe('resolveCodeOwner', () => { ), ).toBe('team-foo'); }); + it('should return undefined if the codeowners file contains no names', () => { + expect( + resolveCodeOwner( + `*`, + 'https://github.com/acme/repo/tree/docs/catalog-info.yaml', + ), + ).toBe(undefined); + }); }); describe('normalizeCodeOwner', () => { diff --git a/plugins/catalog-backend/src/processors/codeowners/resolve.ts b/plugins/catalog-backend/src/processors/codeowners/resolve.ts index 675f6542aa..b0c44a8797 100644 --- a/plugins/catalog-backend/src/processors/codeowners/resolve.ts +++ b/plugins/catalog-backend/src/processors/codeowners/resolve.ts @@ -30,7 +30,9 @@ export function resolveCodeOwner( const { filepath } = parseGitUrl(catalogInfoFileUrl); const match = codeowners.matchFile(filepath, codeOwnerEntries); - return match ? normalizeCodeOwner(match.owners[0]) : undefined; + return match?.owners?.length + ? normalizeCodeOwner(match.owners[0]) + : undefined; } export function normalizeCodeOwner(owner: string) { diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts index aee65bd2e1..9473d45bb6 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts @@ -14,11 +14,11 @@ * limitations under the License. */ +import { TokenManager } from '@backstage/backend-common'; import { - PluginEndpointDiscovery, - TokenManager, -} from '@backstage/backend-common'; -import { registerMswTestHooks } from '@backstage/backend-test-utils'; + mockServices, + registerMswTestHooks, +} from '@backstage/backend-test-utils'; import { Entity } from '@backstage/catalog-model'; import { DefaultCatalogCollator } from './DefaultCatalogCollator'; import { setupServer } from 'msw/node'; @@ -58,22 +58,20 @@ const expectedEntities: Entity[] = [ ]; describe('DefaultCatalogCollator', () => { - let mockDiscoveryApi: jest.Mocked; + const mockDiscovery = mockServices.discovery.mock({ + getBaseUrl: async () => 'http://localhost:7007', + }); let mockTokenManager: jest.Mocked; let collator: DefaultCatalogCollator; registerMswTestHooks(server); beforeAll(() => { - mockDiscoveryApi = { - getBaseUrl: jest.fn().mockResolvedValue('http://localhost:7007'), - getExternalBaseUrl: jest.fn(), - }; mockTokenManager = { getToken: jest.fn().mockResolvedValue({ token: '' }), authenticate: jest.fn(), }; collator = new DefaultCatalogCollator({ - discovery: mockDiscoveryApi, + discovery: mockDiscovery, tokenManager: mockTokenManager, }); }); @@ -98,7 +96,7 @@ describe('DefaultCatalogCollator', () => { it('fetches from the configured catalog service', async () => { const documents = await collator.execute(); - expect(mockDiscoveryApi.getBaseUrl).toHaveBeenCalledWith('catalog'); + expect(mockDiscovery.getBaseUrl).toHaveBeenCalledWith('catalog'); expect(documents).toHaveLength(expectedEntities.length); }); @@ -133,7 +131,7 @@ describe('DefaultCatalogCollator', () => { it('maps a returned entity with a custom locationTemplate', async () => { // Provide an alternate location template. collator = new DefaultCatalogCollator({ - discovery: mockDiscoveryApi, + discovery: mockDiscovery, tokenManager: mockTokenManager, locationTemplate: '/software/:name', }); @@ -147,7 +145,7 @@ describe('DefaultCatalogCollator', () => { it('allows filtering of the retrieved catalog entities', async () => { // Provide an alternate location template. collator = DefaultCatalogCollator.fromConfig(new ConfigReader({}), { - discovery: mockDiscoveryApi, + discovery: mockDiscovery, tokenManager: mockTokenManager, filter: { kind: ['Foo', 'Bar'], diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts index 74aab07fc3..11f6030ce6 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts @@ -14,10 +14,7 @@ * limitations under the License. */ -import { - PluginEndpointDiscovery, - TokenManager, -} from '@backstage/backend-common'; +import { TokenManager } from '@backstage/backend-common'; import { Entity, isUserEntity, @@ -32,6 +29,7 @@ import { import { catalogEntityReadPermission } from '@backstage/plugin-catalog-common/alpha'; import { CatalogEntityDocument } from '@backstage/plugin-catalog-common'; import { Permission } from '@backstage/plugin-permission-common'; +import { DiscoveryService } from '@backstage/backend-plugin-api'; /** * @public @@ -39,7 +37,7 @@ import { Permission } from '@backstage/plugin-permission-common'; * use `DefaultCatalogCollatorFactory` instead. */ export class DefaultCatalogCollator { - protected discovery: PluginEndpointDiscovery; + protected discovery: DiscoveryService; protected locationTemplate: string; protected filter?: GetEntitiesRequest['filter']; protected readonly catalogClient: CatalogApi; @@ -51,7 +49,7 @@ export class DefaultCatalogCollator { static fromConfig( _config: Config, options: { - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; tokenManager: TokenManager; filter?: GetEntitiesRequest['filter']; }, @@ -62,7 +60,7 @@ export class DefaultCatalogCollator { } constructor(options: { - discovery: PluginEndpointDiscovery; + discovery: DiscoveryService; tokenManager: TokenManager; locationTemplate?: string; filter?: GetEntitiesRequest['filter']; diff --git a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts index 3e2dee7ae0..894949a691 100644 --- a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts @@ -64,7 +64,7 @@ describe('AuthorizedEntitiesCatalog', () => { credentials: mockCredentials.none(), }), ).toEqual({ - entities: [], + entities: { type: 'object', entities: [] }, pageInfo: { hasNextPage: false }, }); }); @@ -113,7 +113,7 @@ describe('AuthorizedEntitiesCatalog', () => { credentials: mockCredentials.none(), }), ).resolves.toEqual({ - items: [null], + items: { type: 'object', entities: [null] }, }); expect(fakeCatalog.entitiesBatch).not.toHaveBeenCalled(); @@ -174,7 +174,7 @@ describe('AuthorizedEntitiesCatalog', () => { filter: { key: 'kind', values: ['b'] }, }), ).resolves.toEqual({ - items: [], + items: { type: 'object', entities: [] }, pageInfo: {}, totalItems: 0, }); @@ -226,7 +226,7 @@ describe('AuthorizedEntitiesCatalog', () => { ]; fakeCatalog.queryEntities.mockResolvedValue({ - items: entities, + items: { type: 'object', entities }, pageInfo: { nextCursor: { isPrevious: false, @@ -254,7 +254,7 @@ describe('AuthorizedEntitiesCatalog', () => { }); expect(response).toEqual({ - items: entities, + items: { type: 'object', entities: entities }, totalItems: 4, pageInfo: { nextCursor: { @@ -290,7 +290,7 @@ describe('AuthorizedEntitiesCatalog', () => { }); expect(response).toEqual({ - items: entities, + items: { type: 'object', entities: entities }, totalItems: 4, pageInfo: { nextCursor: { @@ -338,7 +338,9 @@ describe('AuthorizedEntitiesCatalog', () => { conditions: { rule: 'IS_ENTITY_KIND', params: { kinds: ['b'] } }, }, ]); - fakeCatalog.entities.mockResolvedValue({ entities: [] }); + fakeCatalog.entities.mockResolvedValue({ + entities: { type: 'object', entities: [] }, + }); const catalog = new AuthorizedEntitiesCatalog( fakeCatalog, fakePermissionApi, @@ -360,7 +362,10 @@ describe('AuthorizedEntitiesCatalog', () => { }, ]); fakeCatalog.entities.mockResolvedValue({ - entities: [{ kind: 'b', namespace: 'default', name: 'my-component' }], + entities: { + type: 'object', + entities: [{ kind: 'b', namespace: 'default', name: 'my-component' }], + }, }); const catalog = new AuthorizedEntitiesCatalog( fakeCatalog, diff --git a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts index 5358e90825..073e153dcc 100644 --- a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts @@ -60,7 +60,7 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { if (authorizeDecision.result === AuthorizeResult.DENY) { return { - entities: [], + entities: { type: 'object', entities: [] }, pageInfo: { hasNextPage: false }, }; } @@ -92,7 +92,10 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { if (authorizeDecision.result === AuthorizeResult.DENY) { return { - items: new Array(request.entityRefs.length).fill(null), + items: { + type: 'object', + entities: new Array(request.entityRefs.length).fill(null), + }, }; } @@ -123,7 +126,7 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { if (authorizeDecision.result === AuthorizeResult.DENY) { return { - items: [], + items: { type: 'object', entities: [] }, pageInfo: {}, totalItems: 0, }; @@ -208,7 +211,7 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { allOf: [permissionFilter, basicEntityFilter({ 'metadata.uid': uid })], }, }); - if (entities.length === 0) { + if (entities.entities.length === 0) { throw new NotAllowedError(); } } diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 31ec40b887..7ce308e796 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -115,6 +115,7 @@ import { UrlReaderService, SchedulerService, } from '@backstage/backend-plugin-api'; +import { entitiesResponseToObjects } from './response'; /** * This is a duplicate of the alpha `CatalogPermissionRule` type, for use in the stable API. @@ -485,6 +486,10 @@ export class CatalogBuilder { discovery, }); + const disableRelationsCompatibility = config.getOptionalBoolean( + 'catalog.disableRelationsCompatibility', + ); + const policy = this.buildEntityPolicy(); const processors = this.buildProcessors(); const parser = this.parser || defaultEntityDataParser; @@ -521,6 +526,7 @@ export class CatalogBuilder { database: dbClient, logger, stitcher, + disableRelationsCompatibility, }); let permissionsService: PermissionsService; @@ -566,7 +572,10 @@ export class CatalogBuilder { }, }); - const entitiesByRef = keyBy(entities, stringifyEntityRef); + const entitiesByRef = keyBy( + entitiesResponseToObjects(entities), + stringifyEntityRef, + ); return resourceRefs.map( resourceRef => @@ -629,6 +638,7 @@ export class CatalogBuilder { auth, httpAuth, permissionsService, + disableRelationsCompatibility, }); await connectEntityProviders(providerDatabase, entityProviders); diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 418f503739..070b93ab2c 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -38,6 +38,7 @@ import { Stitcher } from '../stitching/types'; import { DefaultEntitiesCatalog } from './DefaultEntitiesCatalog'; import { EntitiesRequest } from '../catalog/types'; import { buildEntitySearch } from '../database/operations/stitcher/buildEntitySearch'; +import { entitiesResponseToObjects } from './response'; jest.setTimeout(60_000); @@ -310,10 +311,11 @@ describe('DefaultEntitiesCatalog', () => { const testFilter = { key: 'spec.test', }; - const { entities } = await catalog.entities({ + const res = await catalog.entities({ filter: testFilter, credentials: mockCredentials.none(), }); + const entities = entitiesResponseToObjects(res.entities); expect(entities.length).toBe(1); expect(entities[0]).toEqual(entity2); @@ -351,10 +353,11 @@ describe('DefaultEntitiesCatalog', () => { key: 'spec.test', }, }; - const { entities } = await catalog.entities({ + const res = await catalog.entities({ filter: testFilter, credentials: mockCredentials.none(), }); + const entities = entitiesResponseToObjects(res.entities); expect(entities.length).toBe(1); expect(entities[0]).toEqual(entity1); @@ -416,7 +419,7 @@ describe('DefaultEntitiesCatalog', () => { values: ['red'], }, }; - const { entities } = await catalog.entities({ + const res = await catalog.entities({ filter: { allOf: [ testFilter1, @@ -427,6 +430,7 @@ describe('DefaultEntitiesCatalog', () => { }, credentials: mockCredentials.none(), }); + const entities = entitiesResponseToObjects(res.entities); expect(entities.length).toBe(2); expect(entities).toContainEqual(entity2); @@ -465,7 +469,7 @@ describe('DefaultEntitiesCatalog', () => { const testFilter2 = { key: 'metadata.desc', }; - const { entities } = await catalog.entities({ + const res = await catalog.entities({ filter: { not: { allOf: [testFilter1, testFilter2], @@ -474,6 +478,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }); + const entities = entitiesResponseToObjects(res.entities); expect(entities.length).toBe(1); expect(entities).toContainEqual(entity1); @@ -509,10 +514,11 @@ describe('DefaultEntitiesCatalog', () => { key: 'kind', values: [], }; - const { entities } = await catalog.entities({ + const res = await catalog.entities({ filter: testFilter, credentials: mockCredentials.none(), }); + const entities = entitiesResponseToObjects(res.entities); expect(entities.length).toBe(0); }, @@ -553,10 +559,11 @@ describe('DefaultEntitiesCatalog', () => { stitcher, }); - const { entities } = await catalog.entities(); + const res = await catalog.entities(); + const entities = entitiesResponseToObjects(res.entities); expect( - entities.find(e => e.metadata.name === 'one')!.relations, + entities.find(e => e?.metadata.name === 'one')!.relations, ).toEqual([ { type: 'r', @@ -565,7 +572,7 @@ describe('DefaultEntitiesCatalog', () => { }, ]); expect( - entities.find(e => e.metadata.name === 'two')!.relations, + entities.find(e => e?.metadata.name === 'two')!.relations, ).toEqual([ { type: 'r', @@ -615,7 +622,9 @@ describe('DefaultEntitiesCatalog', () => { return catalog .entities({ ...request, credentials: mockCredentials.none() }) .then(response => - response.entities.map(e => e.metadata.name).toSorted(), + entitiesResponseToObjects(response.entities) + .map(e => e!.metadata.name) + .toSorted(), ); } @@ -678,7 +687,11 @@ describe('DefaultEntitiesCatalog', () => { ): Promise { return catalog .entities({ ...request, credentials: mockCredentials.none() }) - .then(response => response.entities.map(e => e.metadata.name)); + .then(response => + entitiesResponseToObjects(response.entities).map( + e => e!.metadata.name, + ), + ); } await expect( @@ -764,7 +777,7 @@ describe('DefaultEntitiesCatalog', () => { stitcher, }); - const { items } = await catalog.entitiesBatch({ + const res = await catalog.entitiesBatch({ entityRefs: [ 'k:default/two', 'k:default/one', @@ -775,6 +788,7 @@ describe('DefaultEntitiesCatalog', () => { ], credentials: mockCredentials.none(), }); + const items = entitiesResponseToObjects(res.items); expect(items.map(e => e && stringifyEntityRef(e))).toEqual([ 'k:default/two', @@ -819,11 +833,12 @@ describe('DefaultEntitiesCatalog', () => { stitcher, }); - const { items } = await catalog.entitiesBatch({ + const res = await catalog.entitiesBatch({ entityRefs: ['k:default/two', 'k:default/one'], filter: { key: 'spec.owner', values: ['me'] }, credentials: mockCredentials.none(), }); + const items = entitiesResponseToObjects(res.items); expect(items.map(e => e && stringifyEntityRef(e))).toEqual([ 'k:default/two', @@ -881,7 +896,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response1 = await catalog.queryEntities(request1); - expect(response1.items).toEqual([entityFrom('A'), entityFrom('B')]); + expect(entitiesResponseToObjects(response1.items)).toEqual([ + entityFrom('A'), + entityFrom('B'), + ]); expect(response1.pageInfo.nextCursor).toBeDefined(); expect(response1.pageInfo.prevCursor).toBeUndefined(); expect(response1.totalItems).toBe(names.length); @@ -893,7 +911,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response2 = await catalog.queryEntities(request2); - expect(response2.items).toEqual([entityFrom('C'), entityFrom('D')]); + expect(entitiesResponseToObjects(response2.items)).toEqual([ + entityFrom('C'), + entityFrom('D'), + ]); expect(response2.pageInfo.nextCursor).toBeDefined(); expect(response2.pageInfo.prevCursor).toBeDefined(); expect(response2.totalItems).toBe(names.length); @@ -905,7 +926,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response3 = await catalog.queryEntities(request3); - expect(response3.items).toEqual([entityFrom('E'), entityFrom('F')]); + expect(entitiesResponseToObjects(response3.items)).toEqual([ + entityFrom('E'), + entityFrom('F'), + ]); expect(response3.pageInfo.nextCursor).toBeDefined(); expect(response3.pageInfo.prevCursor).toBeDefined(); expect(response3.totalItems).toBe(names.length); @@ -917,7 +941,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response4 = await catalog.queryEntities(request4); - expect(response4.items).toEqual([entityFrom('C'), entityFrom('D')]); + expect(entitiesResponseToObjects(response4.items)).toEqual([ + entityFrom('C'), + entityFrom('D'), + ]); expect(response4.pageInfo.nextCursor).toBeDefined(); expect(response4.pageInfo.prevCursor).toBeDefined(); expect(response4.totalItems).toBe(names.length); @@ -929,7 +956,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response5 = await catalog.queryEntities(request5); - expect(response5.items).toEqual([entityFrom('A'), entityFrom('B')]); + expect(entitiesResponseToObjects(response5.items)).toEqual([ + entityFrom('A'), + entityFrom('B'), + ]); expect(response5.pageInfo.nextCursor).toBeDefined(); expect(response5.pageInfo.prevCursor).toBeUndefined(); expect(response5.totalItems).toBe(names.length); @@ -941,7 +971,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response6 = await catalog.queryEntities(request6); - expect(response6.items).toEqual([entityFrom('C'), entityFrom('D')]); + expect(entitiesResponseToObjects(response6.items)).toEqual([ + entityFrom('C'), + entityFrom('D'), + ]); expect(response6.pageInfo.nextCursor).toBeDefined(); expect(response6.pageInfo.prevCursor).toBeDefined(); expect(response6.totalItems).toBe(names.length); @@ -953,7 +986,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response7 = await catalog.queryEntities(request7); - expect(response7.items).toEqual([entityFrom('E'), entityFrom('F')]); + expect(entitiesResponseToObjects(response7.items)).toEqual([ + entityFrom('E'), + entityFrom('F'), + ]); expect(response7.pageInfo.nextCursor).toBeDefined(); expect(response7.pageInfo.prevCursor).toBeDefined(); expect(response7.totalItems).toBe(names.length); @@ -965,7 +1001,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response7bis = await catalog.queryEntities(request7bis); - expect(response7bis.items).toEqual([ + expect(entitiesResponseToObjects(response7bis.items)).toEqual([ entityFrom('E'), entityFrom('F'), entityFrom('G'), @@ -981,7 +1017,9 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response8 = await catalog.queryEntities(request8); - expect(response8.items).toEqual([entityFrom('G')]); + expect(entitiesResponseToObjects(response8.items)).toEqual([ + entityFrom('G'), + ]); expect(response8.pageInfo.nextCursor).toBeUndefined(); expect(response8.pageInfo.prevCursor).toBeDefined(); expect(response8.totalItems).toBe(names.length); @@ -1035,7 +1073,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response1 = await catalog.queryEntities(request1); - expect(response1.items).toEqual([entityFrom('G'), entityFrom('F')]); + expect(entitiesResponseToObjects(response1.items)).toEqual([ + entityFrom('G'), + entityFrom('F'), + ]); expect(response1.pageInfo.nextCursor).toBeDefined(); expect(response1.pageInfo.prevCursor).toBeUndefined(); expect(response1.totalItems).toBe(names.length); @@ -1047,7 +1088,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response2 = await catalog.queryEntities(request2); - expect(response2.items).toEqual([entityFrom('E'), entityFrom('D')]); + expect(entitiesResponseToObjects(response2.items)).toEqual([ + entityFrom('E'), + entityFrom('D'), + ]); expect(response2.pageInfo.nextCursor).toBeDefined(); expect(response2.pageInfo.prevCursor).toBeDefined(); expect(response2.totalItems).toBe(names.length); @@ -1059,7 +1103,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response3 = await catalog.queryEntities(request3); - expect(response3.items).toEqual([entityFrom('C'), entityFrom('B')]); + expect(entitiesResponseToObjects(response3.items)).toEqual([ + entityFrom('C'), + entityFrom('B'), + ]); expect(response3.pageInfo.nextCursor).toBeDefined(); expect(response3.pageInfo.prevCursor).toBeDefined(); expect(response3.totalItems).toBe(names.length); @@ -1072,7 +1119,10 @@ describe('DefaultEntitiesCatalog', () => { }; const response4 = await catalog.queryEntities(request4); - expect(response4.items).toEqual([entityFrom('E'), entityFrom('D')]); + expect(entitiesResponseToObjects(response4.items)).toEqual([ + entityFrom('E'), + entityFrom('D'), + ]); expect(response4.pageInfo.nextCursor).toBeDefined(); expect(response4.pageInfo.prevCursor).toBeDefined(); expect(response4.totalItems).toBe(names.length); @@ -1084,7 +1134,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response5 = await catalog.queryEntities(request5); - expect(response5.items).toEqual([entityFrom('G'), entityFrom('F')]); + expect(entitiesResponseToObjects(response5.items)).toEqual([ + entityFrom('G'), + entityFrom('F'), + ]); expect(response5.pageInfo.nextCursor).toBeDefined(); expect(response5.pageInfo.prevCursor).toBeUndefined(); expect(response5.totalItems).toBe(names.length); @@ -1096,7 +1149,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response6 = await catalog.queryEntities(request6); - expect(response6.items).toEqual([entityFrom('E'), entityFrom('D')]); + expect(entitiesResponseToObjects(response6.items)).toEqual([ + entityFrom('E'), + entityFrom('D'), + ]); expect(response6.pageInfo.nextCursor).toBeDefined(); expect(response6.pageInfo.prevCursor).toBeDefined(); expect(response6.totalItems).toBe(names.length); @@ -1108,7 +1164,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response7 = await catalog.queryEntities(request7); - expect(response7.items).toEqual([entityFrom('C'), entityFrom('B')]); + expect(entitiesResponseToObjects(response7.items)).toEqual([ + entityFrom('C'), + entityFrom('B'), + ]); expect(response7.pageInfo.nextCursor).toBeDefined(); expect(response7.pageInfo.prevCursor).toBeDefined(); expect(response7.totalItems).toBe(names.length); @@ -1120,7 +1179,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response7bis = await catalog.queryEntities(request7bis); - expect(response7bis.items).toEqual([ + expect(entitiesResponseToObjects(response7bis.items)).toEqual([ entityFrom('C'), entityFrom('B'), entityFrom('A'), @@ -1136,7 +1195,9 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response8 = await catalog.queryEntities(request8); - expect(response8.items).toEqual([entityFrom('A')]); + expect(entitiesResponseToObjects(response8.items)).toEqual([ + entityFrom('A'), + ]); expect(response8.pageInfo.nextCursor).toBeUndefined(); expect(response8.pageInfo.prevCursor).toBeDefined(); expect(response8.totalItems).toBe(names.length); @@ -1188,7 +1249,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response = await catalog.queryEntities(request); - expect(response.items).toEqual([ + expect(entitiesResponseToObjects(response.items)).toEqual([ entityFrom('atcatss'), entityFrom('cat'), entityFrom('dogcat'), @@ -1246,7 +1307,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response = await catalog.queryEntities(request); - expect(response.items).toEqual(entities); + expect(entitiesResponseToObjects(response.items)).toEqual(entities); expect(response.pageInfo.nextCursor).toBeUndefined(); expect(response.pageInfo.prevCursor).toBeUndefined(); expect(response.totalItems).toBe(1); @@ -1301,7 +1362,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response = await catalog.queryEntities(request); - expect(response.items).toEqual([ + expect(entitiesResponseToObjects(response.items)).toEqual([ entityFrom('1', { uid: 'id1', title: 'cat' }), entityFrom('2', { uid: 'id2', title: 'atcatss' }), entityFrom('4', { uid: 'id4', title: 'dogcat' }), @@ -1314,7 +1375,7 @@ describe('DefaultEntitiesCatalog', () => { ...request, limit: 2, }); - expect(paginatedResponse.items).toEqual([ + expect(entitiesResponseToObjects(paginatedResponse.items)).toEqual([ entityFrom('1', { uid: 'id1', title: 'cat' }), entityFrom('2', { uid: 'id2', title: 'atcatss' }), ]); @@ -1326,7 +1387,7 @@ describe('DefaultEntitiesCatalog', () => { cursor: paginatedResponse.pageInfo.nextCursor!, credentials: mockCredentials.none(), }); - expect(paginatedResponseNext.items).toEqual([ + expect(entitiesResponseToObjects(paginatedResponseNext.items)).toEqual([ entityFrom('4', { uid: 'id4', title: 'dogcat' }), ]); expect(paginatedResponseNext.pageInfo.nextCursor).toBeUndefined(); @@ -1404,7 +1465,7 @@ describe('DefaultEntitiesCatalog', () => { }; const response = await catalog.queryEntities(request); - expect(response.items).toEqual([ + expect(entitiesResponseToObjects(response.items)).toEqual([ entityFrom('KingOfTheJungle', { uid: 'id0', title: 'lion' }), entityFrom('NotKingOfTheJungle', { uid: 'id1', title: 'cat' }), entityFrom('NotACatKing', { uid: 'id2', title: 'atcatss' }), @@ -1418,7 +1479,7 @@ describe('DefaultEntitiesCatalog', () => { ...request, limit: 2, }); - expect(paginatedResponse.items).toEqual([ + expect(entitiesResponseToObjects(paginatedResponse.items)).toEqual([ entityFrom('KingOfTheJungle', { uid: 'id0', title: 'lion' }), entityFrom('NotKingOfTheJungle', { uid: 'id1', title: 'cat' }), ]); @@ -1430,7 +1491,7 @@ describe('DefaultEntitiesCatalog', () => { cursor: paginatedResponse.pageInfo.nextCursor!, credentials: mockCredentials.none(), }); - expect(paginatedResponseNext.items).toEqual([ + expect(entitiesResponseToObjects(paginatedResponseNext.items)).toEqual([ entityFrom('NotACatKing', { uid: 'id2', title: 'atcatss' }), entityFrom('123', { uid: 'id3', title: 'king' }), ]); @@ -1474,7 +1535,63 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response = await catalog.queryEntities(request); - expect(response).toEqual({ totalItems: 20, items: [], pageInfo: {} }); + expect(response).toEqual({ + totalItems: 20, + items: { type: 'raw', entities: [] }, + pageInfo: {}, + }); + }, + ); + + it.each(databases.eachSupportedId())( + 'can skip totalItems, %p', + async databaseId => { + await createDatabase(databaseId); + + await Promise.all( + Array(15) + .fill(0) + .map(() => + addEntityToSearch({ + apiVersion: 'a', + kind: 'k', + metadata: { name: v4() }, + }), + ), + ); + + const catalog = new DefaultEntitiesCatalog({ + database: knex, + logger: mockServices.logger.mock(), + stitcher, + }); + + const request: QueryEntitiesInitialRequest = { + limit: 10, + credentials: mockCredentials.none(), + skipTotalItems: true, + }; + let response = await catalog.queryEntities(request); + expect(response).toEqual({ + totalItems: 0, + items: { + type: 'raw', + entities: expect.objectContaining({ length: 10 }), + }, + pageInfo: { nextCursor: expect.anything() }, + }); + response = await catalog.queryEntities({ + ...request, + cursor: response.pageInfo.nextCursor!, + }); + expect(response).toEqual({ + totalItems: 0, + items: { + type: 'raw', + entities: expect.objectContaining({ length: 5 }), + }, + pageInfo: { prevCursor: expect.anything() }, + }); }, ); @@ -1507,7 +1624,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response1 = await catalog.queryEntities(request1); - expect(response1.items).toMatchObject([ + expect(entitiesResponseToObjects(response1.items)).toMatchObject([ entityFrom('AA'), entityFrom('AA'), ]); @@ -1522,7 +1639,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response2 = await catalog.queryEntities(request2); - expect(response2.items).toMatchObject([ + expect(entitiesResponseToObjects(response2.items)).toMatchObject([ entityFrom('AA'), entityFrom('AA'), ]); @@ -1537,7 +1654,10 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response3 = await catalog.queryEntities(request3); - expect(response3.items).toEqual([entityFrom('CC'), entityFrom('DD')]); + expect(entitiesResponseToObjects(response3.items)).toEqual([ + entityFrom('CC'), + entityFrom('DD'), + ]); expect(response3.pageInfo.nextCursor).toBeUndefined(); expect(response3.pageInfo.prevCursor).toBeDefined(); expect(response3.totalItems).toBe(6); @@ -1549,7 +1669,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response4 = await catalog.queryEntities(request4); - expect(response4.items).toMatchObject([ + expect(entitiesResponseToObjects(response4.items)).toMatchObject([ entityFrom('AA'), entityFrom('AA'), ]); @@ -1564,7 +1684,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response5 = await catalog.queryEntities(request5); - expect(response5.items).toMatchObject([ + expect(entitiesResponseToObjects(response5.items)).toMatchObject([ entityFrom('AA'), entityFrom('AA'), ]); @@ -1632,7 +1752,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response1 = await catalog.queryEntities(request1); - expect(response1.items).toMatchObject([ + expect(entitiesResponseToObjects(response1.items)).toMatchObject([ entityFrom('AA', { uid: '1', kind: 'included' }), entityFrom('AA', { uid: '2', kind: 'included' }), ]); @@ -1647,7 +1767,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response2 = await catalog.queryEntities(request2); - expect(response2.items).toMatchObject([ + expect(entitiesResponseToObjects(response2.items)).toMatchObject([ entityFrom('AA', { uid: '4', kind: 'included' }), entityFrom('AA', { uid: '5', kind: 'included' }), ]); @@ -1691,7 +1811,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response1 = await catalog.queryEntities(request1); - expect(response1.items).toMatchObject([ + expect(entitiesResponseToObjects(response1.items)).toMatchObject([ entityFrom('AA'), entityFrom('CC'), ]); @@ -1706,7 +1826,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response2 = await catalog.queryEntities(request2); - expect(response2.items).toMatchObject([ + expect(entitiesResponseToObjects(response2.items)).toMatchObject([ entityFrom('DD'), entityFrom('AA', { namespace: 'namespace2' }), ]); @@ -1721,7 +1841,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response3 = await catalog.queryEntities(request3); - expect(response3.items).toMatchObject([ + expect(entitiesResponseToObjects(response3.items)).toMatchObject([ entityFrom('AA', { namespace: 'namespace3' }), entityFrom('AA', { namespace: 'namespace4' }), ]); @@ -1736,7 +1856,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response4 = await catalog.queryEntities(request4); - expect(response4.items).toMatchObject([ + expect(entitiesResponseToObjects(response4.items)).toMatchObject([ entityFrom('DD'), entityFrom('AA', { namespace: 'namespace2' }), ]); @@ -1751,7 +1871,7 @@ describe('DefaultEntitiesCatalog', () => { credentials: mockCredentials.none(), }; const response5 = await catalog.queryEntities(request5); - expect(response5.items).toMatchObject([ + expect(entitiesResponseToObjects(response5.items)).toMatchObject([ entityFrom('AA'), entityFrom('CC'), ]); @@ -1784,7 +1904,9 @@ describe('DefaultEntitiesCatalog', () => { orderFields: [{ field: 'metadata.title', order: 'asc' }], credentials: mockCredentials.none(), }) - .then(r => r.items.map(e => e.metadata.name)), + .then(r => + entitiesResponseToObjects(r.items).map(e => e!.metadata.name), + ), ).resolves.toEqual(['CC', 'BB', 'AA']); // 'AA' has no title, ends up last await expect( @@ -1793,7 +1915,9 @@ describe('DefaultEntitiesCatalog', () => { orderFields: [{ field: 'metadata.title', order: 'desc' }], credentials: mockCredentials.none(), }) - .then(r => r.items.map(e => e.metadata.name)), + .then(r => + entitiesResponseToObjects(r.items).map(e => e!.metadata.name), + ), ).resolves.toEqual(['BB', 'CC', 'AA']); // 'AA' has no title, ends up last }, ); @@ -1823,7 +1947,9 @@ describe('DefaultEntitiesCatalog', () => { limit: 10, credentials: mockCredentials.none(), }) - .then(r => r.items.map(e => e.metadata.name)), + .then(r => + entitiesResponseToObjects(r.items).map(e => e!.metadata.name), + ), ).resolves.toEqual(['AA', 'BB']); // simulate a situation where stitching is not yet complete @@ -1838,7 +1964,9 @@ describe('DefaultEntitiesCatalog', () => { limit: 10, credentials: mockCredentials.none(), }) - .then(r => r.items.map(e => e.metadata.name)), + .then(r => + entitiesResponseToObjects(r.items).map(e => e!.metadata.name), + ), ).resolves.toEqual(['BB']); }, ); diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index c8afe8124f..f0e0667bef 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -14,11 +14,7 @@ * limitations under the License. */ -import { - Entity, - parseEntityRef, - stringifyEntityRef, -} from '@backstage/catalog-model'; +import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { InputError, NotFoundError } from '@backstage/errors'; import { Knex } from 'knex'; import { chunk as lodashChunk, isEqual } from 'lodash'; @@ -49,21 +45,16 @@ import { import { Stitcher } from '../stitching/types'; import { + expandLegacyCompoundRelationsInEntity, isQueryEntitiesCursorRequest, isQueryEntitiesInitialRequest, } from './util'; -import { - EntitiesSearchFilter, - EntityFilter, -} from '@backstage/plugin-catalog-node'; +import { EntityFilter } from '@backstage/plugin-catalog-node'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { applyEntityFilterToQuery } from './request/applyEntityFilterToQuery'; +import { processRawEntitiesResult } from './response'; -const defaultSortField: EntityOrder = { - field: 'metadata.uid', - order: 'asc', -}; - -const DEFAULT_LIMIT = 20; +const DEFAULT_LIMIT = 200; function parsePagination(input?: EntityPagination): EntityPagination { if (!input) { @@ -110,101 +101,29 @@ function stringifyPagination( return base64; } -function addCondition( - queryBuilder: Knex.QueryBuilder, - db: Knex, - filter: EntitiesSearchFilter, - negate: boolean = false, - entityIdField = 'entity_id', -): void { - const key = filter.key.toLowerCase(); - const values = filter.values?.map(v => v.toLowerCase()); - - // NOTE(freben): This used to be a set of OUTER JOIN, which may seem to - // make a lot of sense. However, it had abysmal performance on sqlite - // when datasets grew large, so we're using IN instead. - const matchQuery = db('search') - .select('search.entity_id') - .where({ key }) - .andWhere(function keyFilter() { - if (values?.length === 1) { - this.where({ value: values.at(0) }); - } else if (values) { - this.andWhere('value', 'in', values); - } - }); - queryBuilder.andWhere(entityIdField, negate ? 'not in' : 'in', matchQuery); -} - -function isEntitiesSearchFilter( - filter: EntitiesSearchFilter | EntityFilter, -): filter is EntitiesSearchFilter { - return filter.hasOwnProperty('key'); -} - -function isOrEntityFilter( - filter: { anyOf: EntityFilter[] } | EntityFilter, -): filter is { anyOf: EntityFilter[] } { - return filter.hasOwnProperty('anyOf'); -} - -function isNegationEntityFilter( - filter: { not: EntityFilter } | EntityFilter, -): filter is { not: EntityFilter } { - return filter.hasOwnProperty('not'); -} - -function parseFilter( - filter: EntityFilter, - query: Knex.QueryBuilder, - db: Knex, - negate: boolean = false, - entityIdField = 'entity_id', -): Knex.QueryBuilder { - if (isNegationEntityFilter(filter)) { - return parseFilter(filter.not, query, db, !negate, entityIdField); - } - - if (isEntitiesSearchFilter(filter)) { - return query.andWhere(function filterFunction() { - addCondition(this, db, filter, negate, entityIdField); - }); - } - - return query[negate ? 'andWhereNot' : 'andWhere'](function filterFunction() { - if (isOrEntityFilter(filter)) { - for (const subFilter of filter.anyOf ?? []) { - this.orWhere(subQuery => - parseFilter(subFilter, subQuery, db, false, entityIdField), - ); - } - } else { - for (const subFilter of filter.allOf ?? []) { - this.andWhere(subQuery => - parseFilter(subFilter, subQuery, db, false, entityIdField), - ); - } - } - }); -} - export class DefaultEntitiesCatalog implements EntitiesCatalog { private readonly database: Knex; private readonly logger: LoggerService; private readonly stitcher: Stitcher; + private readonly disableRelationsCompatibility: boolean; constructor(options: { database: Knex; logger: LoggerService; stitcher: Stitcher; + disableRelationsCompatibility?: boolean; }) { this.database = options.database; this.logger = options.logger; this.stitcher = options.stitcher; + this.disableRelationsCompatibility = Boolean( + options.disableRelationsCompatibility, + ); } async entities(request?: EntitiesRequest): Promise { const db = this.database; + const { limit, offset } = parsePagination(request?.pagination); let entitiesQuery = db('final_entities').select('final_entities.*'); @@ -224,13 +143,12 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { entitiesQuery = entitiesQuery.whereNotNull('final_entities.final_entity'); if (request?.filter) { - entitiesQuery = parseFilter( - request.filter, - entitiesQuery, - db, - false, - 'final_entities.entity_id', - ); + entitiesQuery = applyEntityFilterToQuery({ + filter: request.filter, + targetQuery: entitiesQuery, + onEntityIdField: 'final_entities.entity_id', + knex: db, + }); } request?.order?.forEach(({ order }, index) => { @@ -256,7 +174,6 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { entitiesQuery.orderBy('final_entities.entity_id', 'asc'); // stable sort } - const { limit, offset } = parsePagination(request?.pagination); if (limit !== undefined) { entitiesQuery = entitiesQuery.limit(limit + 1); } @@ -279,36 +196,19 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { }; } - let entities: Entity[] = rows.map(e => JSON.parse(e.final_entity!)); - - if (request?.fields) { - entities = entities.map(e => request.fields!(e)); - } - - // TODO(freben): This is added as a compatibility guarantee, until we can be - // sure that all adopters have re-stitched their entities so that the new - // targetRef field is present on them, and that they have stopped consuming - // the now-removed old field - // TODO(jhaals): Remove this in April 2022 - for (const entity of entities) { - if (entity.relations) { - for (const relation of entity.relations as any) { - if (!relation.targetRef && relation.target) { - // This is the case where an old-form entity, not yet stitched with - // the updated code, was in the database - relation.targetRef = stringifyEntityRef(relation.target); - } else if (!relation.target && relation.targetRef) { - // This is the case where a new-form entity, stitched with the - // updated code, was in the database but we still want to produce - // the old data shape as well for compatibility reasons - relation.target = parseEntityRef(relation.targetRef); - } - } - } - } - return { - entities, + entities: processRawEntitiesResult( + rows.map(r => r.final_entity!), + this.disableRelationsCompatibility + ? request?.fields + : e => { + expandLegacyCompoundRelationsInEntity(e); + if (request?.fields) { + return request.fields(e); + } + return e; + }, + ), pageInfo, }; } @@ -316,7 +216,7 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { async entitiesBatch( request: EntitiesBatchRequest, ): Promise { - const lookup = new Map(); + const lookup = new Map(); for (const chunk of lodashChunk(request.entityRefs, 200)) { let query = this.database('final_entities') @@ -327,142 +227,194 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { .whereIn('final_entities.entity_ref', chunk); if (request?.filter) { - query = parseFilter( - request.filter, - query, - this.database, - false, - 'final_entities.entity_id', - ); + query = applyEntityFilterToQuery({ + filter: request.filter, + targetQuery: query, + onEntityIdField: 'final_entities.entity_id', + knex: this.database, + }); } for (const row of await query) { - lookup.set(row.entityRef, row.entity ? JSON.parse(row.entity) : null); + lookup.set(row.entityRef, row.entity ? row.entity : null); } } - let items = request.entityRefs.map(ref => lookup.get(ref) ?? null); + const items = request.entityRefs.map(ref => lookup.get(ref) ?? null); - if (request.fields) { - items = items.map(e => e && request.fields!(e)); - } - - return { items }; + return { items: processRawEntitiesResult(items, request.fields) }; } async queryEntities( request: QueryEntitiesRequest, ): Promise { - const db = this.database; - const limit = request.limit ?? DEFAULT_LIMIT; const cursor: Omit & { orderFieldValues?: (string | null)[]; + skipTotalItems: boolean; } = { - orderFields: [defaultSortField], + orderFields: [], isPrevious: false, ...parseCursorFromRequest(request), }; + // For performance reasons we invoke the count query only on the first + // request. The result is then embedded into the cursor for subsequent + // requests. Threfore this can be undefined here, but will then get + // populated further down. + const shouldComputeTotalItems = + cursor.totalItems === undefined && !cursor.skipTotalItems; const isFetchingBackwards = cursor.isPrevious; if (cursor.orderFields.length > 1) { this.logger.warn(`Only one sort field is supported, ignoring the rest`); } - const sortField: EntityOrder = { - ...defaultSortField, - ...cursor.orderFields[0], - }; + const sortField = cursor.orderFields.at(0); - const [prevItemOrderFieldValue, prevItemUid] = - cursor.orderFieldValues || []; + // The first part of the query builder is a subquery that applies all of the + // filtering. + const dbQuery = this.database.with( + 'filtered', + ['entity_id', 'final_entity', ...(sortField ? ['value'] : [])], + inner => { + inner + .from('final_entities') + .whereNotNull('final_entity'); - const dbQuery = db('final_entities') - .leftOuterJoin('search', qb => - qb - .on('search.entity_id', 'final_entities.entity_id') - .andOnVal('search.key', sortField.field), - ) - .whereNotNull('final_entities.final_entity'); + if (sortField) { + inner + .leftOuterJoin('search', qb => + qb + .on('search.entity_id', 'final_entities.entity_id') + .andOnVal('search.key', sortField.field), + ) + .select({ + entity_id: 'final_entities.entity_id', + final_entity: 'final_entities.final_entity', + value: 'search.value', + }); + } else { + inner.select({ + entity_id: 'final_entities.entity_id', + final_entity: 'final_entities.final_entity', + }); + } - if (cursor.filter) { - parseFilter( - cursor.filter, - dbQuery, - db, - false, - 'final_entities.entity_id', - ); - } + // Add regular filters, if given + if (cursor.filter) { + applyEntityFilterToQuery({ + filter: cursor.filter, + targetQuery: inner, + onEntityIdField: 'final_entities.entity_id', + knex: this.database, + }); + } - const normalizedFullTextFilterTerm = cursor.fullTextFilter?.term?.trim(); - const textFilterFields = cursor.fullTextFilter?.fields ?? [sortField.field]; - if (normalizedFullTextFilterTerm) { - if ( - textFilterFields.length === 1 && - textFilterFields[0] === sortField.field - ) { - // If there is one item, apply the like query to the top level query which is already - // filtered based on the singular sortField. - dbQuery.andWhereRaw( - 'value like ?', - `%${normalizedFullTextFilterTerm.toLocaleLowerCase('en-US')}%`, - ); - } else { - const matchQuery = db('search') - .select('search.entity_id') - // textFilterFields must be lowercased to match searchable keys in database, i.e. spec.profile.displayName -> spec.profile.displayname - .whereIn( - 'key', - textFilterFields.map(field => field.toLocaleLowerCase('en-US')), - ) - .andWhere(function keyFilter() { - this.andWhereRaw( - 'value like ?', + // Add full text search filters, if given + const normalizedFullTextFilterTerm = + cursor.fullTextFilter?.term?.trim(); + const textFilterFields = cursor.fullTextFilter?.fields ?? [ + sortField?.field || 'metadata.uid', + ]; + if (normalizedFullTextFilterTerm) { + if ( + textFilterFields.length === 1 && + textFilterFields[0] === sortField?.field + ) { + // If there is one item, apply the like query to the top level query which is already + // filtered based on the singular sortField. + inner.andWhereRaw( + 'search.value like ?', `%${normalizedFullTextFilterTerm.toLocaleLowerCase('en-US')}%`, ); - }); - dbQuery.andWhere('final_entities.entity_id', 'in', matchQuery); + } else { + const matchQuery = this.database('search') + .select('search.entity_id') + // textFilterFields must be lowercased to match searchable keys in database, i.e. spec.profile.displayName -> spec.profile.displayname + .whereIn( + 'search.key', + textFilterFields.map(field => field.toLocaleLowerCase('en-US')), + ) + .andWhere(function keyFilter() { + this.andWhereRaw( + 'search.value like ?', + `%${normalizedFullTextFilterTerm.toLocaleLowerCase( + 'en-US', + )}%`, + ); + }); + inner.andWhere('final_entities.entity_id', 'in', matchQuery); + } + } + }, + ); + + // Only pay the cost of counting the number of items if needed + if (shouldComputeTotalItems) { + // Note the intentional cross join here. The filtered_count dataset is + // always exactly one row, so it won't grow the result unnecessarily. But + // it's also important that there IS at least one row, because even if the + // filtered dataset is empty, we still want to know the total number of + // items. + dbQuery + .with('filtered_count', ['count'], inner => + inner.from('filtered').count('*', { as: 'count' }), + ) + .fromRaw('filtered_count, filtered') + .select('count', 'filtered.*'); + } else { + dbQuery.from('filtered').select('*'); + } + + const isOrderingDescending = sortField?.order === 'desc'; + + // Move forward (or backward) in the set to the correct cursor position + if (cursor.orderFieldValues) { + if (cursor.orderFieldValues.length === 2) { + // The first will be the sortField value, the second the entity_id + const [first, second] = cursor.orderFieldValues; + dbQuery.andWhere(function nested() { + this.where( + 'filtered.value', + isFetchingBackwards !== isOrderingDescending ? '<' : '>', + first, + ) + .orWhere('filtered.value', '=', first) + .andWhere( + 'filtered.entity_id', + isFetchingBackwards !== isOrderingDescending ? '<' : '>', + second, + ); + }); + } else if (cursor.orderFieldValues.length === 1) { + // This will be the entity_id + const [first] = cursor.orderFieldValues; + dbQuery.andWhere('entity_id', isFetchingBackwards ? '<' : '>', first); } } - const countQuery = dbQuery.clone(); - - const isOrderingDescending = sortField.order === 'desc'; - - if (prevItemOrderFieldValue) { - dbQuery.andWhere(function nested() { - this.where( - 'value', - isFetchingBackwards !== isOrderingDescending ? '<' : '>', - prevItemOrderFieldValue, - ) - .orWhere('value', '=', prevItemOrderFieldValue) - .andWhere( - 'final_entities.entity_id', - isFetchingBackwards !== isOrderingDescending ? '<' : '>', - prevItemUid, - ); - }); + // Add the ordering + let order = sortField?.order ?? 'asc'; + if (isFetchingBackwards) { + order = invertOrder(order); } - - if (db.client.config.client === 'pg') { + if (this.database.client.config.client === 'pg') { // pg correctly orders by the column value and handling nulls in one go dbQuery.orderBy([ + ...(sortField + ? [ + { + column: 'filtered.value', + order, + nulls: 'last', + }, + ] + : []), { - column: 'search.value', - order: isFetchingBackwards - ? invertOrder(sortField.order) - : sortField.order, - nulls: 'last', - }, - { - column: 'final_entities.entity_id', - order: isFetchingBackwards - ? invertOrder(sortField.order) - : sortField.order, + column: 'filtered.entity_id', + order, }, ]); } else { @@ -470,26 +422,27 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { // no matter what the order is, for some reason, so we have to manually add back the statement // that translates to "order by value " while avoiding to give an order dbQuery.orderBy([ + ...(sortField + ? [ + { + column: 'filtered.value', + order: undefined, + nulls: 'last', + }, + { + column: 'filtered.value', + order, + }, + ] + : []), { - column: 'search.value', - order: undefined, - nulls: 'last', - }, - { - column: 'search.value', - order: isFetchingBackwards - ? invertOrder(sortField.order) - : sortField.order, - }, - { - column: 'final_entities.entity_id', - order: isFetchingBackwards - ? invertOrder(sortField.order) - : sortField.order, + column: 'filtered.entity_id', + order, }, ]); } + // Apply a manually set initial offset if ( isQueryEntitiesInitialRequest(request) && request.offset !== undefined @@ -499,20 +452,18 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { // fetch an extra item to check if there are more items. dbQuery.limit(isFetchingBackwards ? limit : limit + 1); - countQuery.count('final_entities.entity_id', { as: 'count' }); + const rows = shouldComputeTotalItems || limit > 0 ? await dbQuery : []; - const [rows, [{ count }]] = await Promise.all([ - limit > 0 ? dbQuery : [], - // for performance reasons we invoke the countQuery - // only on the first request. - // The result is then embedded into the cursor - // for subsequent requests. - typeof cursor.totalItems === 'undefined' - ? countQuery - : [{ count: cursor.totalItems }], - ]); - - const totalItems = Number(count); + let totalItems: number; + if (cursor.totalItems !== undefined) { + totalItems = cursor.totalItems; + } else if (cursor.skipTotalItems) { + totalItems = 0; + } else if (rows.length) { + totalItems = Number(rows[0].count); + } else { + totalItems = 0; + } if (isFetchingBackwards) { rows.reverse(); @@ -530,15 +481,13 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { const firstRow = rows[0]; const lastRow = rows[rows.length - 1]; - const firstSortFieldValues = cursor.firstSortFieldValues || [ - firstRow?.value, - firstRow?.entity_id, - ]; + const firstSortFieldValues = + cursor.firstSortFieldValues || sortFieldsFromRow(firstRow, sortField); const nextCursor: Cursor | undefined = hasMoreResults ? { ...cursor, - orderFieldValues: sortFieldsFromRow(lastRow), + orderFieldValues: sortFieldsFromRow(lastRow, sortField), firstSortFieldValues, isPrevious: false, totalItems, @@ -548,22 +497,24 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { const prevCursor: Cursor | undefined = !isInitialRequest && rows.length > 0 && - !isEqual(sortFieldsFromRow(firstRow), cursor.firstSortFieldValues) + !isEqual( + sortFieldsFromRow(firstRow, sortField), + cursor.firstSortFieldValues, + ) ? { ...cursor, - orderFieldValues: sortFieldsFromRow(firstRow), + orderFieldValues: sortFieldsFromRow(firstRow, sortField), firstSortFieldValues: cursor.firstSortFieldValues, isPrevious: true, totalItems, } : undefined; - const items = rows - .map(e => JSON.parse(e.final_entity!)) - .map(e => (request.fields ? request.fields(e) : e)); - return { - items, + items: processRawEntitiesResult( + rows.map(r => r.final_entity!), + request.fields, + ), pageInfo: { ...(!!prevCursor && { prevCursor }), ...(!!nextCursor && { nextCursor }), @@ -736,13 +687,12 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { .groupBy(['search.key', 'search.original_value']); if (request.filter) { - parseFilter( - request.filter, - query, - this.database, - false, - 'search.entity_id', - ); + applyEntityFilterToQuery({ + filter: request.filter, + targetQuery: query, + onEntityIdField: 'search.entity_id', + knex: this.database, + }); } const rows = await query; @@ -787,25 +737,35 @@ export const cursorParser: z.ZodSchema = z.object({ function parseCursorFromRequest( request?: QueryEntitiesRequest, -): Partial { +): Partial & { skipTotalItems: boolean } { if (isQueryEntitiesInitialRequest(request)) { const { filter, - orderFields: sortFields = [defaultSortField], + orderFields: sortFields = [], fullTextFilter, + skipTotalItems = false, } = request; - return { filter, orderFields: sortFields, fullTextFilter }; + return { filter, orderFields: sortFields, fullTextFilter, skipTotalItems }; } if (isQueryEntitiesCursorRequest(request)) { - return request.cursor; + return { + ...request.cursor, + // Doesn't matter here + skipTotalItems: false, + }; } - return {}; + return { + skipTotalItems: false, + }; } function invertOrder(order: EntityOrder['order']) { return order === 'asc' ? 'desc' : 'asc'; } -function sortFieldsFromRow(row: DbSearchRow) { - return [row.value, row.entity_id]; +function sortFieldsFromRow( + row: DbSearchRow & DbFinalEntitiesRow, + sortField?: EntityOrder | undefined, +) { + return sortField ? [row?.value, row?.entity_id] : [row?.entity_id]; } diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index 6654187526..aa068a2122 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -42,7 +42,12 @@ import { wrapServer } from '@backstage/backend-openapi-utils'; import { Server } from 'http'; import { mockCredentials, mockServices } from '@backstage/backend-test-utils'; import { LocationAnalyzer } from '@backstage/plugin-catalog-node'; -import { PermissionsService } from '@backstage/backend-plugin-api'; +import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter'; + +const middleware = MiddlewareFactory.create({ + logger: mockServices.logger.mock(), + config: mockServices.rootConfig(), +}); describe('createRouter readonly disabled', () => { let entitiesCatalog: jest.Mocked; @@ -51,9 +56,9 @@ describe('createRouter readonly disabled', () => { let app: express.Express | Server; let refreshService: RefreshService; let locationAnalyzer: jest.Mocked; - let permissionsService: jest.Mocked; + const permissionsService = mockServices.permissions.mock(); - beforeAll(async () => { + beforeEach(async () => { entitiesCatalog = { entities: jest.fn(), entitiesBatch: jest.fn(), @@ -69,15 +74,9 @@ describe('createRouter readonly disabled', () => { deleteLocation: jest.fn(), getLocationByEntity: jest.fn(), }; - locationAnalyzer = { analyzeLocation: jest.fn(), }; - permissionsService = { - authorize: jest.fn(), - authorizeConditional: jest.fn(), - }; - refreshService = { refresh: jest.fn() }; orchestrator = { process: jest.fn() }; const router = await createRouter({ @@ -91,13 +90,14 @@ describe('createRouter readonly disabled', () => { auth: mockServices.auth(), httpAuth: mockServices.httpAuth(), locationAnalyzer, - permissionsService: permissionsService, + permissionsService, }); + router.use(middleware.error()); app = await wrapServer(express().use(router)); }); beforeEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); }); describe('POST /refresh', () => { @@ -136,7 +136,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.entities.mockResolvedValueOnce({ - entities: [entities[0]], + entities: { type: 'object', entities: [entities[0]] }, pageInfo: { hasNextPage: false }, }); @@ -146,9 +146,42 @@ describe('createRouter readonly disabled', () => { expect(response.body).toEqual(entities); }); + it('happy path: lists entities when by-entities emulation is enabled', async () => { + const router = await createRouter({ + entitiesCatalog, + locationService, + orchestrator, + logger: mockServices.logger.mock(), + refreshService, + config: new ConfigReader(undefined), + permissionIntegrationRouter: express.Router(), + auth: mockServices.auth(), + httpAuth: mockServices.httpAuth(), + locationAnalyzer, + permissionsService, + disableRelationsCompatibility: true, // added + }); + app = await wrapServer(express().use(router)); + + const entities: Entity[] = [ + { apiVersion: 'a', kind: 'b', metadata: { name: 'n' } }, + ]; + + entitiesCatalog.queryEntities.mockResolvedValueOnce({ + items: { type: 'object', entities: [entities[0]] }, + pageInfo: {}, + totalItems: 1, + }); + + const response = await request(app).get('/entities'); + + expect(response.status).toEqual(200); + expect(response.body).toEqual(entities); + }); + it('parses single and multiple request parameters and passes them down', async () => { entitiesCatalog.entities.mockResolvedValueOnce({ - entities: [], + entities: { type: 'object', entities: [] }, pageInfo: { hasNextPage: false }, }); const response = await request(app).get( @@ -166,12 +199,58 @@ describe('createRouter readonly disabled', () => { { key: 'b', values: ['3'] }, ], }, - { allOf: [{ key: 'c', values: ['4'] }] }, + { key: 'c', values: ['4'] }, ], }, credentials: mockCredentials.user(), }); }); + + it('parses single and multiple request parameters and passes them down when by-entities emulation is enabled', async () => { + const router = await createRouter({ + entitiesCatalog, + locationService, + orchestrator, + logger: mockServices.logger.mock(), + refreshService, + config: new ConfigReader(undefined), + permissionIntegrationRouter: express.Router(), + auth: mockServices.auth(), + httpAuth: mockServices.httpAuth(), + locationAnalyzer, + permissionsService, + disableRelationsCompatibility: true, // added + }); + app = await wrapServer(express().use(router)); + + entitiesCatalog.queryEntities.mockResolvedValueOnce({ + items: { type: 'object', entities: [] }, + pageInfo: {}, + totalItems: 0, + }); + const response = await request(app).get( + '/entities?filter=a=1,a=2,b=3&filter=c=4', + ); + + expect(response.status).toEqual(200); + expect(entitiesCatalog.queryEntities).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.queryEntities).toHaveBeenCalledWith({ + filter: { + anyOf: [ + { + allOf: [ + { key: 'a', values: ['1', '2'] }, + { key: 'b', values: ['3'] }, + ], + }, + { key: 'c', values: ['4'] }, + ], + }, + limit: 10000, + credentials: mockCredentials.user(), + skipTotalItems: true, + }); + }); }); describe('GET /entities/by-query', () => { @@ -181,7 +260,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items, + items: { type: 'object', entities: items }, totalItems: 100, pageInfo: { nextCursor: mockCursor() }, }); @@ -199,7 +278,7 @@ describe('createRouter readonly disabled', () => { it('parses initial request', async () => { entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items: [], + items: { type: 'object', entities: [] }, pageInfo: {}, totalItems: 0, }); @@ -218,7 +297,7 @@ describe('createRouter readonly disabled', () => { { key: 'b', values: ['3'] }, ], }, - { allOf: [{ key: 'c', values: ['4'] }] }, + { key: 'c', values: ['4'] }, ], }, orderFields: [ @@ -235,7 +314,7 @@ describe('createRouter readonly disabled', () => { it('parses encoded params request', async () => { entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items: [], + items: { type: 'object', entities: [] }, pageInfo: {}, totalItems: 0, }); @@ -258,7 +337,7 @@ describe('createRouter readonly disabled', () => { { key: 'b', values: ['3'] }, ], }, - { allOf: [{ key: 'c', values: ['4'] }] }, + { key: 'c', values: ['4'] }, ], }, orderFields: [ @@ -279,7 +358,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items, + items: { type: 'object', entities: items }, totalItems: 100, pageInfo: { nextCursor: mockCursor() }, }); @@ -308,7 +387,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items, + items: { type: 'object', entities: items }, totalItems: 100, pageInfo: { nextCursor: mockCursor({ fullTextFilter: { term: 'mySearch' } }), @@ -350,7 +429,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items, + items: { type: 'object', entities: items }, totalItems: 100, pageInfo: { nextCursor: mockCursor() }, }); @@ -375,7 +454,7 @@ describe('createRouter readonly disabled', () => { ]; entitiesCatalog.queryEntities.mockResolvedValueOnce({ - items, + items: { type: 'object', entities: items }, totalItems: 100, pageInfo: { nextCursor: mockCursor() }, }); @@ -398,7 +477,7 @@ describe('createRouter readonly disabled', () => { }, }; entitiesCatalog.entities.mockResolvedValue({ - entities: [entity], + entities: { type: 'object', entities: [entity] }, pageInfo: { hasNextPage: false }, }); @@ -415,7 +494,7 @@ describe('createRouter readonly disabled', () => { it('responds with a 404 for missing entities', async () => { entitiesCatalog.entities.mockResolvedValue({ - entities: [], + entities: { type: 'object', entities: [] }, pageInfo: { hasNextPage: false }, }); @@ -441,20 +520,15 @@ describe('createRouter readonly disabled', () => { namespace: 'ns', }, }; - entitiesCatalog.entities.mockResolvedValue({ - entities: [entity], - pageInfo: { hasNextPage: false }, + entitiesCatalog.entitiesBatch.mockResolvedValue({ + items: { type: 'object', entities: [entity] }, }); const response = await request(app).get('/entities/by-name/k/ns/n'); - expect(entitiesCatalog.entities).toHaveBeenCalledTimes(1); - expect(entitiesCatalog.entities).toHaveBeenCalledWith({ - filter: basicEntityFilter({ - kind: 'k', - 'metadata.namespace': 'ns', - 'metadata.name': 'n', - }), + expect(entitiesCatalog.entitiesBatch).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entitiesBatch).toHaveBeenCalledWith({ + entityRefs: ['k:ns/n'], credentials: mockCredentials.user(), }); expect(response.status).toEqual(200); @@ -462,20 +536,15 @@ describe('createRouter readonly disabled', () => { }); it('responds with a 404 for missing entities', async () => { - entitiesCatalog.entities.mockResolvedValue({ - entities: [], - pageInfo: { hasNextPage: false }, + entitiesCatalog.entitiesBatch.mockResolvedValue({ + items: { type: 'object', entities: [null] }, }); const response = await request(app).get('/entities/by-name/b/d/c'); - expect(entitiesCatalog.entities).toHaveBeenCalledTimes(1); - expect(entitiesCatalog.entities).toHaveBeenCalledWith({ - filter: basicEntityFilter({ - kind: 'b', - 'metadata.namespace': 'd', - 'metadata.name': 'c', - }), + expect(entitiesCatalog.entitiesBatch).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entitiesBatch).toHaveBeenCalledWith({ + entityRefs: ['b:d/c'], credentials: mockCredentials.user(), }); expect(response.status).toEqual(404); @@ -539,7 +608,9 @@ describe('createRouter readonly disabled', () => { }, }; const entityRef = stringifyEntityRef(entity); - entitiesCatalog.entitiesBatch.mockResolvedValue({ items: [entity] }); + entitiesCatalog.entitiesBatch.mockResolvedValue({ + items: { type: 'object', entities: [entity] }, + }); const response = await request(app) .post('/entities/by-refs?filter=kind=Component') .set('Content-Type', 'application/json') @@ -554,13 +625,7 @@ describe('createRouter readonly disabled', () => { entityRefs: [entityRef], fields: expect.any(Function), credentials: mockCredentials.user(), - filter: { - anyOf: [ - { - allOf: [{ key: 'kind', values: ['Component'] }], - }, - ], - }, + filter: { key: 'kind', values: ['Component'] }, }); expect(response.status).toEqual(200); expect(response.body).toEqual({ items: [entity] }); @@ -870,11 +935,11 @@ describe('createRouter readonly disabled', () => { }); }); -describe('createRouter readonly enabled', () => { +describe('createRouter readonly and raw json enabled', () => { let entitiesCatalog: jest.Mocked; let app: express.Express; let locationService: jest.Mocked; - let permissionsService: jest.Mocked; + const permissionsService = mockServices.permissions.mock(); beforeAll(async () => { entitiesCatalog = { @@ -893,6 +958,7 @@ describe('createRouter readonly enabled', () => { getLocationByEntity: jest.fn(), }; const router = await createRouter({ + disableRelationsCompatibility: true, entitiesCatalog, locationService, logger: mockServices.logger.mock(), @@ -904,13 +970,14 @@ describe('createRouter readonly enabled', () => { permissionIntegrationRouter: express.Router(), auth: mockServices.auth(), httpAuth: mockServices.httpAuth(), - permissionsService: permissionsService, + permissionsService, }); + router.use(middleware.error()); app = express().use(router); }); beforeEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); }); describe('GET /entities', () => { @@ -919,9 +986,10 @@ describe('createRouter readonly enabled', () => { { apiVersion: 'a', kind: 'b', metadata: { name: 'n' } }, ]; - entitiesCatalog.entities.mockResolvedValueOnce({ - entities: [entities[0]], - pageInfo: { hasNextPage: false }, + entitiesCatalog.queryEntities.mockResolvedValueOnce({ + items: { type: 'raw', entities: [JSON.stringify(entities[0])] }, + pageInfo: {}, + totalItems: 1, }); const response = await request(app).get('/entities'); @@ -1074,7 +1142,7 @@ describe('NextRouter permissioning', () => { let locationService: jest.Mocked; let app: express.Express; let refreshService: RefreshService; - let permissionsService: jest.Mocked; + const permissionsService = mockServices.permissions.mock(); const fakeRule = createPermissionRule({ name: 'FAKE_RULE', @@ -1121,13 +1189,13 @@ describe('NextRouter permissioning', () => { }), auth: mockServices.auth(), httpAuth: mockServices.httpAuth(), - permissionsService: permissionsService, + permissionsService, }); app = express().use(router); }); afterEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); }); it('accepts and evaluates conditions at the apply-conditions endpoint', async () => { @@ -1139,7 +1207,7 @@ describe('NextRouter permissioning', () => { }, }; entitiesCatalog.entities.mockResolvedValueOnce({ - entities: [spideySense], + entities: { type: 'object', entities: [spideySense] }, pageInfo: { hasNextPage: false }, }); diff --git a/plugins/catalog-backend/src/service/createRouter.ts b/plugins/catalog-backend/src/service/createRouter.ts index 9b62d1318d..be5b650e6a 100644 --- a/plugins/catalog-backend/src/service/createRouter.ts +++ b/plugins/catalog-backend/src/service/createRouter.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { errorHandler } from '@backstage/backend-common'; import { ANNOTATION_LOCATION, ANNOTATION_ORIGIN_LOCATION, @@ -23,11 +22,11 @@ import { stringifyEntityRef, } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; -import { InputError, NotFoundError, serializeError } from '@backstage/errors'; +import { InputError, serializeError } from '@backstage/errors'; import express from 'express'; import yn from 'yn'; import { z } from 'zod'; -import { EntitiesCatalog } from '../catalog/types'; +import { Cursor, EntitiesCatalog } from '../catalog/types'; import { CatalogProcessingOrchestrator } from '../processing/types'; import { validateEntityEnvelope } from '../processing/util'; import { @@ -57,6 +56,11 @@ import { } from '@backstage/backend-plugin-api'; import { LocationAnalyzer } from '@backstage/plugin-catalog-node'; import { AuthorizedValidationService } from './AuthorizedValidationService'; +import { + createEntityArrayJsonStream, + writeEntitiesResponse, + writeSingleEntityResponse, +} from './response'; /** * Options used by {@link createRouter}. @@ -77,6 +81,7 @@ export interface RouterOptions { auth: AuthService; httpAuth: HttpAuthService; permissionsService: PermissionsService; + disableRelationsCompatibility?: boolean; } /** @@ -104,6 +109,7 @@ export async function createRouter( permissionsService, auth, httpAuth, + disableRelationsCompatibility = false, } = options; const readonlyEnabled = @@ -135,24 +141,79 @@ export async function createRouter( if (entitiesCatalog) { router .get('/entities', async (req, res) => { - const { entities, pageInfo } = await entitiesCatalog.entities({ - filter: parseEntityFilterParams(req.query), - fields: parseEntityTransformParams(req.query), - order: parseEntityOrderParams(req.query), - pagination: parseEntityPaginationParams(req.query), - credentials: await httpAuth.credentials(req), - }); + const filter = parseEntityFilterParams(req.query); + const fields = parseEntityTransformParams(req.query); + const order = parseEntityOrderParams(req.query); + const pagination = parseEntityPaginationParams(req.query); + const credentials = await httpAuth.credentials(req); - // Add a Link header to the next page - if (pageInfo.hasNextPage) { - const url = new URL(`http://ignored${req.url}`); - url.searchParams.delete('offset'); - url.searchParams.set('after', pageInfo.endCursor); - res.setHeader('link', `<${url.pathname}${url.search}>; rel="next"`); + // When pagination parameters are passed in, use the legacy slow path + // that loads all entities into memory + + if (pagination || disableRelationsCompatibility !== true) { + const { entities, pageInfo } = await entitiesCatalog.entities({ + filter, + fields, + order, + pagination, + credentials, + }); + + // Add a Link header to the next page + if (pageInfo.hasNextPage) { + const url = new URL(`http://ignored${req.url}`); + url.searchParams.delete('offset'); + url.searchParams.set('after', pageInfo.endCursor); + res.setHeader('link', `<${url.pathname}${url.search}>; rel="next"`); + } + + await writeEntitiesResponse({ + res, + items: entities, + alwaysUseObjectMode: !disableRelationsCompatibility, + }); + return; } - // TODO(freben): encode the pageInfo in the response - res.json(entities); + const responseStream = createEntityArrayJsonStream(res); + const limit = 10000; + let cursor: Cursor | undefined; + + try { + let currentWrite: Promise | undefined = undefined; + do { + const result = await entitiesCatalog.queryEntities( + !cursor + ? { + credentials, + fields, + limit, + filter, + orderFields: order, + skipTotalItems: true, + } + : { credentials, fields, limit, cursor }, + ); + + // Wait for previous write to complete + if (await currentWrite) { + return; // Client closed connection + } + + if (result.items.entities.length) { + currentWrite = responseStream.send(result.items); + } + + cursor = result.pageInfo?.nextCursor; + } while (cursor); + + // Wait for last write to complete + await currentWrite; + + responseStream.complete(); + } finally { + responseStream.close(); + } }) .get('/entities/by-query', async (req, res) => { const { items, pageInfo, totalItems } = @@ -163,17 +224,22 @@ export async function createRouter( credentials: await httpAuth.credentials(req), }); - res.json({ + await writeEntitiesResponse({ + res, items, - totalItems, - pageInfo: { - ...(pageInfo.nextCursor && { - nextCursor: encodeCursor(pageInfo.nextCursor), - }), - ...(pageInfo.prevCursor && { - prevCursor: encodeCursor(pageInfo.prevCursor), - }), - }, + alwaysUseObjectMode: !disableRelationsCompatibility, + responseWrapper: entities => ({ + items: entities, + totalItems, + pageInfo: { + ...(pageInfo.nextCursor && { + nextCursor: encodeCursor(pageInfo.nextCursor), + }), + ...(pageInfo.prevCursor && { + prevCursor: encodeCursor(pageInfo.prevCursor), + }), + }, + }), }); }) .get('/entities/by-uid/:uid', async (req, res) => { @@ -182,10 +248,7 @@ export async function createRouter( filter: basicEntityFilter({ 'metadata.uid': uid }), credentials: await httpAuth.credentials(req), }); - if (!entities.length) { - throw new NotFoundError(`No entity with uid ${uid}`); - } - res.status(200).json(entities[0]); + writeSingleEntityResponse(res, entities, `No entity with uid ${uid}`); }) .delete('/entities/by-uid/:uid', async (req, res) => { const { uid } = req.params; @@ -196,20 +259,15 @@ export async function createRouter( }) .get('/entities/by-name/:kind/:namespace/:name', async (req, res) => { const { kind, namespace, name } = req.params; - const { entities } = await entitiesCatalog.entities({ - filter: basicEntityFilter({ - kind: kind, - 'metadata.namespace': namespace, - 'metadata.name': name, - }), + const { items } = await entitiesCatalog.entitiesBatch({ + entityRefs: [stringifyEntityRef({ kind, namespace, name })], credentials: await httpAuth.credentials(req), }); - if (!entities.length) { - throw new NotFoundError( - `No entity named '${name}' found, with kind '${kind}' in namespace '${namespace}'`, - ); - } - res.status(200).json(entities[0]); + writeSingleEntityResponse( + res, + items, + `No entity named '${name}' found, with kind '${kind}' in namespace '${namespace}'`, + ); }) .get( '/entities/by-name/:kind/:namespace/:name/ancestry', @@ -224,13 +282,20 @@ export async function createRouter( ) .post('/entities/by-refs', async (req, res) => { const request = entitiesBatchRequest(req); - const response = await entitiesCatalog.entitiesBatch({ + const { items } = await entitiesCatalog.entitiesBatch({ entityRefs: request.entityRefs, filter: parseEntityFilterParams(req.query), fields: parseEntityTransformParams(req.query, request.fields), credentials: await httpAuth.credentials(req), }); - res.status(200).json(response); + await writeEntitiesResponse({ + res, + items, + alwaysUseObjectMode: !disableRelationsCompatibility, + responseWrapper: entities => ({ + items: entities, + }), + }); }) .get('/entity-facets', async (req, res) => { const response = await entitiesCatalog.facets({ @@ -380,6 +445,5 @@ export async function createRouter( }); } - router.use(errorHandler()); return router; } diff --git a/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.test.ts b/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.test.ts new file mode 100644 index 0000000000..ea64f5b400 --- /dev/null +++ b/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.test.ts @@ -0,0 +1,196 @@ +/* + * 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 { TestDatabases } from '@backstage/backend-test-utils'; +import { applyEntityFilterToQuery } from './applyEntityFilterToQuery'; +import { + DbFinalEntitiesRow, + DbRefreshStateRow, + DbSearchRow, +} from '../../database/tables'; +import { Knex } from 'knex'; +import { applyDatabaseMigrations } from '../../database/migrations'; +import { EntityFilter } from '@backstage/plugin-catalog-node'; +import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; +import { v4 as uuid } from 'uuid'; +import { buildEntitySearch } from '../../database/operations/stitcher/buildEntitySearch'; + +jest.setTimeout(60_000); + +const databases = TestDatabases.create(); +const strategies = ['in', 'join'] as const; + +describe.each(databases.eachSupportedId())( + 'applyEntityFilterToQuery, %p', + databaseId => { + // #region setup + let knex: Knex; + + beforeAll(async () => { + knex = await databases.init(databaseId); + await applyDatabaseMigrations(knex); + await addEntity({ + apiVersion: 'a', + kind: 'k', + metadata: { name: '1', namespace: 'default' }, + spec: { + foo: 'a', + unique: true, + }, + }); + await addEntity({ + apiVersion: 'a', + kind: 'k', + metadata: { name: '2', namespace: 'default' }, + spec: { + foo: 'a', + }, + }); + await addEntity({ + apiVersion: 'a', + kind: 'k', + metadata: { name: '3', namespace: 'default' }, + spec: { + foo: 'b', + }, + }); + await addEntity({ + apiVersion: 'a', + kind: 'k', + metadata: { name: '4', namespace: 'default' }, + spec: {}, + }); + }); + + afterAll(async () => { + knex.destroy(); + }); + + async function addEntity(entity: Entity) { + const id = uuid(); + const entityRef = stringifyEntityRef(entity); + const entityJson = JSON.stringify(entity); + + await knex('refresh_state').insert({ + entity_id: id, + entity_ref: entityRef, + unprocessed_entity: entityJson, + errors: '[]', + next_update_at: '2031-01-01 23:00:00', + last_discovery_at: '2021-04-01 13:37:00', + }); + + await knex('final_entities').insert({ + entity_id: id, + entity_ref: entityRef, + final_entity: entityJson, + hash: 'h', + stitch_ticket: '', + }); + + const search = await buildEntitySearch(id, entity); + await knex('search').insert(search); + + return id; + } + // #endregion + + describe.each(strategies)('with strategy %p', strategy => { + async function query(filter: EntityFilter): Promise { + const q = + knex('final_entities').whereNotNull( + 'final_entity', + ); + applyEntityFilterToQuery({ + filter: filter, + targetQuery: q, + onEntityIdField: 'final_entities.entity_id', + knex, + strategy, + }); + return await q.then(rows => + rows + .map(row => JSON.parse(row.final_entity!).metadata.name) + .toSorted(), + ); + } + + it('filters correctly', async () => { + await expect(query({ key: 'spec.foo' })).resolves.toEqual([ + '1', + '2', + '3', + ]); + + await expect( + query({ key: 'spec.foo', values: ['a'] }), + ).resolves.toEqual(['1', '2']); + + await expect( + query({ key: 'spec.foo', values: ['b'] }), + ).resolves.toEqual(['3']); + + await expect( + query({ key: 'spec.foo', values: ['a', 'b'] }), + ).resolves.toEqual(['1', '2', '3']); + + await expect( + query({ + anyOf: [ + { key: 'spec.foo', values: ['a'] }, + { key: 'spec.foo', values: ['b'] }, + ], + }), + ).resolves.toEqual(['1', '2', '3']); + + await expect( + query({ not: { key: 'spec.foo', values: ['a'] } }), + ).resolves.toEqual(['3', '4']); + + await expect( + query({ + not: { + anyOf: [ + { key: 'spec.foo', values: ['a'] }, + { key: 'spec.foo', values: ['b'] }, + ], + }, + }), + ).resolves.toEqual(['4']); + + await expect( + query({ + allOf: [ + { key: 'spec.foo' }, + { not: { key: 'spec.foo', values: ['a'] } }, + ], + }), + ).resolves.toEqual(['3']); + + await expect(query({ key: 'spec.unique' })).resolves.toEqual(['1']); + + await expect( + query({ + allOf: [ + { key: 'spec.foo', values: ['a'] }, + { not: { key: 'spec.unique' } }, + ], + }), + ).resolves.toEqual(['2']); + }); + }); + }, +); diff --git a/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.ts new file mode 100644 index 0000000000..b2a7fb6708 --- /dev/null +++ b/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.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 { + EntitiesSearchFilter, + EntityFilter, +} from '@backstage/plugin-catalog-node'; +import { Knex } from 'knex'; +import { DbSearchRow } from '../../database/tables'; + +function isEntitiesSearchFilter( + filter: EntitiesSearchFilter | EntityFilter, +): filter is EntitiesSearchFilter { + return filter.hasOwnProperty('key'); +} + +function isOrEntityFilter( + filter: EntityFilter, +): filter is { anyOf: EntityFilter[] } { + return filter.hasOwnProperty('anyOf'); +} + +function isNegationEntityFilter( + filter: EntityFilter, +): filter is { not: EntityFilter } { + return filter.hasOwnProperty('not'); +} + +/** + * Applies filtering through a number of WHERE IN subqueries. Example: + * + * ``` + * SELECT * FROM final_entities + * WHERE + * entity_id IN ( + * SELECT entity_id FROM search + * WHERE key = 'kind' AND value = 'component' + * ) + * AND entity_id IN ( + * SELECT entity_id FROM search + * WHERE key = 'spec.lifecycle' AND value = 'production' + * ) + * AND final_entities.final_entity IS NOT NULL + * ``` + * + * This strategy is a good all-rounder, in the sense that it has medium-good + * performance on most queries on all database engines. However, it does not + * scale well down to very short runtimes as well as the JOIN strategy. + */ +function applyInStrategy( + filter: EntityFilter, + targetQuery: Knex.QueryBuilder, + onEntityIdField: string, + knex: Knex, + negate: boolean, +): Knex.QueryBuilder { + if (isNegationEntityFilter(filter)) { + return applyInStrategy( + filter.not, + targetQuery, + onEntityIdField, + knex, + !negate, + ); + } + + if (isEntitiesSearchFilter(filter)) { + const key = filter.key.toLowerCase(); + const values = filter.values?.map(v => v.toLowerCase()); + const matchQuery = knex('search') + .select('search.entity_id') + .where({ key }) + .andWhere(function keyFilter() { + if (values?.length === 1) { + this.where({ value: values.at(0) }); + } else if (values) { + this.andWhere('value', 'in', values); + } + }); + return targetQuery.andWhere( + onEntityIdField, + negate ? 'not in' : 'in', + matchQuery, + ); + } + + return targetQuery[negate ? 'andWhereNot' : 'andWhere']( + function filterFunction() { + if (isOrEntityFilter(filter)) { + for (const subFilter of filter.anyOf ?? []) { + this.orWhere(subQuery => + applyInStrategy(subFilter, subQuery, onEntityIdField, knex, false), + ); + } + } else { + for (const subFilter of filter.allOf ?? []) { + this.andWhere(subQuery => + applyInStrategy(subFilter, subQuery, onEntityIdField, knex, false), + ); + } + } + }, + ); +} + +// The actual exported function +export function applyEntityFilterToQuery(options: { + filter: EntityFilter; + targetQuery: Knex.QueryBuilder; + onEntityIdField: string; + knex: Knex; + strategy?: 'in' | 'join'; +}): Knex.QueryBuilder { + const { filter, targetQuery, onEntityIdField, knex } = options; + + return applyInStrategy(filter, targetQuery, onEntityIdField, knex, false); +} diff --git a/plugins/catalog-backend/src/service/request/parseEntityFilterParams.test.ts b/plugins/catalog-backend/src/service/request/parseEntityFilterParams.test.ts index f9fc596cb9..85e0d9caa1 100644 --- a/plugins/catalog-backend/src/service/request/parseEntityFilterParams.test.ts +++ b/plugins/catalog-backend/src/service/request/parseEntityFilterParams.test.ts @@ -27,9 +27,7 @@ describe('parseEntityFilterParams', () => { it('supports single-string format', () => { const result = parseEntityFilterParams({ filter: 'a=1' })!; - expect(result).toEqual({ - anyOf: [{ allOf: [{ key: 'a', values: ['1'] }] }], - }); + expect(result).toEqual({ key: 'a', values: ['1'] }); }); it('supports array-of-strings format', () => { @@ -38,8 +36,8 @@ describe('parseEntityFilterParams', () => { }); expect(result).toEqual({ anyOf: [ - { allOf: [{ key: 'a', values: ['1'] }] }, - { allOf: [{ key: 'b', values: ['2'] }] }, + { key: 'a', values: ['1'] }, + { key: 'b', values: ['2'] }, ], }); }); @@ -50,7 +48,7 @@ describe('parseEntityFilterParams', () => { }); expect(result).toEqual({ anyOf: [ - { allOf: [{ key: 'a', values: ['1'] }] }, + { key: 'a', values: ['1'] }, { allOf: [ { key: 'b', values: ['2', '3'] }, diff --git a/plugins/catalog-backend/src/service/request/parseEntityFilterParams.ts b/plugins/catalog-backend/src/service/request/parseEntityFilterParams.ts index 8666712f80..aabb24ff3f 100644 --- a/plugins/catalog-backend/src/service/request/parseEntityFilterParams.ts +++ b/plugins/catalog-backend/src/service/request/parseEntityFilterParams.ts @@ -36,12 +36,17 @@ export function parseEntityFilterParams( // Outer array: "any of the inner ones" // Inner arrays: "all of these must match" - const filters = filterStrings.map(parseEntityFilterString).filter(Boolean); + const filters = filterStrings + .map(parseEntityFilterString) + .filter((r): r is EntitiesSearchFilter[] => Boolean(r)); if (!filters.length) { return undefined; } - return { anyOf: filters.map(f => ({ allOf: f! })) }; + const outer = filters.map(inner => + inner.length === 1 ? inner[0] : { allOf: inner }, + ); + return outer.length === 1 ? outer[0] : { anyOf: outer }; } /** diff --git a/plugins/catalog-backend/src/service/response/createEntityArrayJsonStream.ts b/plugins/catalog-backend/src/service/response/createEntityArrayJsonStream.ts new file mode 100644 index 0000000000..5bdc9d8994 --- /dev/null +++ b/plugins/catalog-backend/src/service/response/createEntityArrayJsonStream.ts @@ -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 { EntitiesResponseItems } from '../../catalog/types'; +import { Response } from 'express'; +import { writeResponseData } from './write'; + +export interface EntityArrayJsonStream { + send(entities: EntitiesResponseItems): Promise; + complete(): void; + close(): void; +} + +// Helps stream EntitiesResponseItems[] as a JSON response stream to avoid performance issues +export function createEntityArrayJsonStream( + res: Response, +): EntityArrayJsonStream { + // Imitate the httpRouter behavior of pretty-printing in development + const prettyPrint = process.env.NODE_ENV === 'development'; + let firstSend = true; + let completed = false; + + return { + async send(response) { + if (firstSend) { + res.setHeader('Content-Type', 'application/json; charset=utf-8'); + res.status(200); + res.flushHeaders(); + } + + if (response.type === 'raw') { + for (const item of response.entities) { + const prefix = firstSend ? '[' : ','; + firstSend = false; + + if (await writeResponseData(res, prefix + item)) { + return true; + } + } + return false; + } + + let data: string; + if (prettyPrint) { + data = JSON.stringify(response.entities, null, 2); + data = firstSend ? data.slice(0, -2) : `,\n${data.slice(2, -2)}`; + } else { + data = JSON.stringify(response.entities); + data = firstSend ? data.slice(0, -1) : `,${data.slice(1, -1)}`; + } + + firstSend = false; + return writeResponseData(res, data); + }, + complete() { + if (firstSend) { + res.json([]); + } else { + res.end(prettyPrint ? '\n]' : ']', 'utf8'); + } + completed = true; + }, + close() { + if (!completed) { + res.end(); + } + }, + }; +} diff --git a/plugins/catalog-backend/src/service/response/index.ts b/plugins/catalog-backend/src/service/response/index.ts new file mode 100644 index 0000000000..2e01071dbd --- /dev/null +++ b/plugins/catalog-backend/src/service/response/index.ts @@ -0,0 +1,23 @@ +/* + * 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 { + processRawEntitiesResult, + processEntitiesResponseItems, + entitiesResponseToObjects, +} from './process'; +export { writeSingleEntityResponse, writeEntitiesResponse } from './write'; +export { createEntityArrayJsonStream } from './createEntityArrayJsonStream'; diff --git a/plugins/catalog-backend/src/service/response/process.test.ts b/plugins/catalog-backend/src/service/response/process.test.ts new file mode 100644 index 0000000000..60b96608f7 --- /dev/null +++ b/plugins/catalog-backend/src/service/response/process.test.ts @@ -0,0 +1,115 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { + entitiesResponseToObjects, + processEntitiesResponseItems, + processRawEntitiesResult, +} from './process'; + +const mockTransform = (entity: Entity): Entity => ({ + ...entity, + kind: `transformed-${entity.kind}`, +}); + +describe('processRawEntitiesResult', () => { + it('should prefer keeping results in raw form', () => { + expect(processRawEntitiesResult(['{"kind":"test"}', null])).toEqual({ + type: 'raw', + entities: ['{"kind":"test"}', null], + }); + + expect( + processRawEntitiesResult(['{"kind":"test"}', null], mockTransform), + ).toEqual({ + type: 'object', + entities: [{ kind: 'transformed-test' }, null], + }); + }); +}); + +describe('processEntitiesResponseItems', () => { + it('should transform entities in object form', () => { + expect( + processEntitiesResponseItems({ + type: 'object', + entities: [{ kind: 'test' } as Entity, null], + }), + ).toEqual({ + type: 'object', + entities: [{ kind: 'test' }, null], + }); + + expect( + processEntitiesResponseItems( + { + type: 'object', + entities: [{ kind: 'test' } as Entity, null], + }, + mockTransform, + ), + ).toEqual({ + type: 'object', + entities: [{ kind: 'transformed-test' }, null], + }); + }); + + it('should transform entities in raw form', () => { + expect( + processEntitiesResponseItems({ + type: 'raw', + entities: ['{"kind":"test"}', null], + }), + ).toEqual({ + type: 'raw', + entities: ['{"kind":"test"}', null], + }); + + expect( + processEntitiesResponseItems( + { + type: 'raw', + entities: ['{"kind":"test"}', null], + }, + mockTransform, + ), + ).toEqual({ + type: 'object', + entities: [{ kind: 'transformed-test' }, null], + }); + }); +}); + +describe('entitiesResponseToObjects', () => { + it('should convert entities in object form', () => { + expect( + entitiesResponseToObjects({ + type: 'object', + entities: [null, { kind: 'test' } as Entity], + }), + ).toEqual([null, { kind: 'test' }]); + }); + + it('should convert entities in raw form', () => { + expect( + entitiesResponseToObjects({ + type: 'raw', + entities: [null, '{"kind":"test"}'], + }), + ).toEqual([null, { kind: 'test' }]); + }); +}); diff --git a/plugins/catalog-backend/src/service/response/process.ts b/plugins/catalog-backend/src/service/response/process.ts new file mode 100644 index 0000000000..fa07063f5b --- /dev/null +++ b/plugins/catalog-backend/src/service/response/process.ts @@ -0,0 +1,62 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { EntitiesResponseItems } from '../../catalog/types'; + +export function processRawEntitiesResult( + serializedEntities: (string | null)[], + transform?: (entity: Entity) => Entity, +): EntitiesResponseItems { + if (transform) { + return { + type: 'object', + entities: serializedEntities.map(e => + e !== null ? transform(JSON.parse(e)) : e, + ), + }; + } + + return { + type: 'raw', + entities: serializedEntities, + }; +} + +export function processEntitiesResponseItems( + response: EntitiesResponseItems, + transform?: (entity: Entity) => Entity, +): EntitiesResponseItems { + if (!transform) { + return response; + } + if (response.type === 'raw') { + return processRawEntitiesResult(response.entities, transform); + } + return { + type: 'object', + entities: response.entities.map(e => (e !== null ? transform(e) : e)), + }; +} + +export function entitiesResponseToObjects( + response: EntitiesResponseItems, +): (Entity | null)[] { + if (response.type === 'object') { + return response.entities; + } + return response.entities.map(e => (e !== null ? JSON.parse(e) : e)); +} diff --git a/plugins/catalog-backend/src/service/response/write.test.ts b/plugins/catalog-backend/src/service/response/write.test.ts new file mode 100644 index 0000000000..d60d1c3526 --- /dev/null +++ b/plugins/catalog-backend/src/service/response/write.test.ts @@ -0,0 +1,446 @@ +/* + * 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 express from 'express'; +import { mockErrorHandler } from '@backstage/backend-test-utils'; +import request from 'supertest'; +import { writeEntitiesResponse, writeSingleEntityResponse } from './write'; + +describe('writeSingleEntityResponse', () => { + const app = express(); + app.use(express.json()); + app.get('/echo', (req, res) => { + writeSingleEntityResponse(res, req.body, 'not found'); + }); + app.use(mockErrorHandler()); + + describe('in object form', () => { + it('should write a single entity', async () => { + const res = await request(app) + .get('/echo') + .send({ + type: 'object', + entities: [{ kind: 'Component' }, { kind: 'User' }], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual({ kind: 'Component' }); + }); + + it('should write a missing entity', async () => { + const res = await request(app) + .get('/echo') + .send({ type: 'object', entities: [null] }); + + expect(res.status).toBe(404); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toMatchObject({ + error: { name: 'NotFoundError', message: 'not found' }, + }); + }); + + it('should write no entities', async () => { + const res = await request(app) + .get('/echo') + .send({ type: 'object', entities: [] }); + + expect(res.status).toBe(404); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toMatchObject({ + error: { name: 'NotFoundError', message: 'not found' }, + }); + }); + }); + + describe('in raw form', () => { + it('should write a single entity', async () => { + const res = await request(app) + .get('/echo') + .send({ + type: 'raw', + entities: ['{"kind":"Component"}', '{"kind":"User"}'], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toEqual({ kind: 'Component' }); + }); + + it('should write a missing entity', async () => { + const res = await request(app) + .get('/echo') + .send({ type: 'raw', entities: [null] }); + + expect(res.status).toBe(404); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toMatchObject({ + error: { name: 'NotFoundError', message: 'not found' }, + }); + }); + + it('should write no entities', async () => { + const res = await request(app) + .get('/echo') + .send({ type: 'raw', entities: [] }); + + expect(res.status).toBe(404); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.body).toMatchObject({ + error: { name: 'NotFoundError', message: 'not found' }, + }); + }); + }); +}); + +describe('writeEntitiesResponse', () => { + const app = express(); + app.use(express.json()); + app.get('/echo', (req, res) => { + writeEntitiesResponse({ + res, + items: req.body, + alwaysUseObjectMode: Boolean(req.query.object), + }); + }); + app.get('/wrapped', (req, res) => { + writeEntitiesResponse({ + res, + items: req.body, + alwaysUseObjectMode: Boolean(req.query.object), + responseWrapper: entities => ({ + page: 1, + items: entities, + totalItems: 1337, + }), + }); + }); + app.use(mockErrorHandler()); + + describe('in object form', () => { + it('should return empty list', async () => { + const res = await request(app).get('/echo').send({ + type: 'object', + entities: [], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).toBeDefined(); + expect(res.body).toEqual([]); + }); + + it('should return mixed objects', async () => { + const res = await request(app) + .get('/echo') + .send({ + type: 'object', + entities: [{ kind: 'Component' }, null, { kind: 'User' }, null], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).toBeDefined(); + expect(res.body).toEqual([ + { kind: 'Component' }, + null, + { kind: 'User' }, + null, + ]); + }); + + it('should wrap response of empty list', async () => { + const res = await request(app) + .get('/wrapped') + .send({ type: 'object', entities: [] }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).toBeDefined(); + expect(res.body).toEqual({ page: 1, items: [], totalItems: 1337 }); + }); + + it('should wrap response of mixed list', async () => { + const res = await request(app) + .get('/wrapped') + .send({ + type: 'object', + entities: [{ kind: 'Component' }, null, { kind: 'User' }, null], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).toBeDefined(); + expect(res.body).toEqual({ + page: 1, + items: [{ kind: 'Component' }, null, { kind: 'User' }, null], + totalItems: 1337, + }); + }); + }); + + describe('in raw form', () => { + it('should return empty list', async () => { + const res = await request(app).get('/echo').send({ + type: 'raw', + entities: [], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).toBeDefined(); + expect(res.body).toEqual([]); + }); + + it('should return mixed objects', async () => { + const res = await request(app) + .get('/echo') + .send({ + type: 'raw', + entities: ['{"kind":"Component"}', null, '{"kind":"User"}', null], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).not.toBeDefined(); + expect(res.body).toEqual([ + { kind: 'Component' }, + null, + { kind: 'User' }, + null, + ]); + }); + + it('should wrap response of empty list', async () => { + const res = await request(app) + .get('/wrapped') + .send({ type: 'raw', entities: [] }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).not.toBeDefined(); + expect(res.body).toEqual({ page: 1, items: [], totalItems: 1337 }); + }); + + it('should wrap response of mixed list', async () => { + const res = await request(app) + .get('/wrapped') + .send({ + type: 'raw', + entities: ['{"kind":"Component"}', null, '{"kind":"User"}', null], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).not.toBeDefined(); + expect(res.body).toEqual({ + page: 1, + items: [{ kind: 'Component' }, null, { kind: 'User' }, null], + totalItems: 1337, + }); + }); + + it('should write a large wrapped response', async () => { + const entityMock = JSON.stringify({ + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'my-component', + namespace: 'default', + annotations: { + 'backstage.io/managed-by-location': 'url:https://example.com', + }, + }, + spec: { + type: 'service', + owner: 'me', + lifecycle: 'production', + }, + }); + const res = await request(app) + .get('/wrapped') + .send({ + type: 'raw', + entities: Array(300).fill(entityMock), + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).not.toBeDefined(); + expect(res.body).toEqual({ + page: 1, + items: expect.objectContaining({ length: 300 }), + totalItems: 1337, + }); + }); + }); + + describe('in raw form forced to object', () => { + it('should return empty list', async () => { + const res = await request(app).get('/echo?object=true').send({ + type: 'raw', + entities: [], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).toBeDefined(); + expect(res.body).toEqual([]); + }); + + it('should return mixed objects', async () => { + const res = await request(app) + .get('/echo?object=true') + .send({ + type: 'raw', + entities: ['{"kind":"Component"}', null, '{"kind":"User"}', null], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).toBeDefined(); + expect(res.body).toEqual([ + { kind: 'Component' }, + null, + { kind: 'User' }, + null, + ]); + }); + + it('should wrap response of empty list', async () => { + const res = await request(app) + .get('/wrapped?object=true') + .send({ type: 'raw', entities: [] }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).toBeDefined(); + expect(res.body).toEqual({ page: 1, items: [], totalItems: 1337 }); + }); + + it('should wrap response of mixed list', async () => { + const res = await request(app) + .get('/wrapped?object=true') + .send({ + type: 'raw', + entities: ['{"kind":"Component"}', null, '{"kind":"User"}', null], + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).toBeDefined(); + expect(res.body).toEqual({ + page: 1, + items: [{ kind: 'Component' }, null, { kind: 'User' }, null], + totalItems: 1337, + }); + }); + + it('should write a large wrapped response', async () => { + const entityMock = JSON.stringify({ + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'my-component', + namespace: 'default', + annotations: { + 'backstage.io/managed-by-location': 'url:https://example.com', + }, + }, + spec: { + type: 'service', + owner: 'me', + lifecycle: 'production', + }, + }); + const res = await request(app) + .get('/wrapped?object=true') + .send({ + type: 'raw', + entities: Array(300).fill(entityMock), + }); + + expect(res.status).toBe(200); + expect(res.type).toBe('application/json'); + expect(res.header['content-type']).toBe( + 'application/json; charset=utf-8', + ); + expect(res.header['content-length']).toBeDefined(); + expect(res.body).toEqual({ + page: 1, + items: expect.objectContaining({ length: 300 }), + totalItems: 1337, + }); + }); + }); +}); diff --git a/plugins/catalog-backend/src/service/response/write.ts b/plugins/catalog-backend/src/service/response/write.ts new file mode 100644 index 0000000000..b43064a1e4 --- /dev/null +++ b/plugins/catalog-backend/src/service/response/write.ts @@ -0,0 +1,122 @@ +/* + * 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 { Response } from 'express'; +import { EntitiesResponseItems } from '../../catalog/types'; +import { JsonValue } from '@backstage/types'; +import { NotFoundError } from '@backstage/errors'; +import { processEntitiesResponseItems } from './process'; + +const JSON_CONTENT_TYPE = 'application/json; charset=utf-8'; + +export function writeSingleEntityResponse( + res: Response, + response: EntitiesResponseItems, + notFoundMessage: string, +) { + if (response.type === 'object') { + if (!response.entities[0]) { + throw new NotFoundError(notFoundMessage); + } + + res.json(response.entities[0]); + } else { + if (!response.entities[0]) { + throw new NotFoundError(notFoundMessage); + } + + res.setHeader('Content-Type', JSON_CONTENT_TYPE); + res.end(response.entities[0]); + } +} + +export async function writeEntitiesResponse(options: { + res: Response; + items: EntitiesResponseItems; + responseWrapper?: (entities: JsonValue) => JsonValue; + alwaysUseObjectMode?: boolean; +}) { + const { res, responseWrapper, alwaysUseObjectMode } = options; + const items = alwaysUseObjectMode + ? processEntitiesResponseItems(options.items, e => e) + : options.items; + + if (items.type === 'object') { + res.json( + responseWrapper ? responseWrapper?.(items.entities) : items.entities, + ); + return; + } + + res.setHeader('Content-Type', JSON_CONTENT_TYPE); + + // responseWrapper allows the caller to render the entities within an object + let trailing = ''; + if (responseWrapper) { + const marker = `__MARKER_${Math.random().toString(36).slice(2, 10)}__`; + const wrapped = JSON.stringify(responseWrapper(marker)); + const parts = wrapped.split(`"${marker}"`); + if (parts.length !== 2) { + throw new Error( + `Entity items response was incorrectly wrapped into ${parts.length} different parts`, + ); + } + res.write(parts[0], 'utf8'); + trailing = parts[1]; + } + + let first = true; + for (const entity of items.entities) { + const prefix = first ? '[' : ','; + first = false; + + if (await writeResponseData(res, prefix + entity)) { + return; + } + } + res.end(`${first ? '[' : ''}]${trailing}`); +} + +/** + * Writes a data to the response and waits if the response buffer needs draining. + * + * @internal + * @returns true if the response was closed while waiting for the buffer to drain + */ +export async function writeResponseData(res: Response, data: string | Buffer) { + const ok = res.write(data, 'utf8'); + if (!ok) { + if (res.closed) { + return true; + } + const closed = await new Promise(resolve => { + function onContinue() { + res.off('drain', onContinue); + res.off('close', onClose); + resolve(false); + } + function onClose() { + res.off('drain', onContinue); + res.off('close', onClose); + resolve(true); + } + res.on('drain', onContinue); + res.on('close', onClose); + }); + return closed; + } + return false; +} diff --git a/plugins/catalog-backend/src/service/util.ts b/plugins/catalog-backend/src/service/util.ts index 4b041d1a70..9847cb7225 100644 --- a/plugins/catalog-backend/src/service/util.ts +++ b/plugins/catalog-backend/src/service/util.ts @@ -25,6 +25,11 @@ import { QueryEntitiesRequest, } from '../catalog/types'; import { EntityFilter } from '@backstage/plugin-catalog-node'; +import { + Entity, + parseEntityRef, + stringifyEntityRef, +} from '@backstage/catalog-model'; export async function requireRequestBody(req: Request): Promise { const contentType = req.header('content-type'); @@ -138,3 +143,26 @@ export function decodeCursor(encodedCursor: string) { throw new InputError(`Malformed cursor: ${e}`); } } + +// TODO(freben): This is added as a compatibility guarantee, until we can be +// sure that all adopters have re-stitched their entities so that the new +// targetRef field is present on them, and that they have stopped consuming +// the now-removed old field +// TODO(patriko): Remove this in catalog 2.0 +export function expandLegacyCompoundRelationsInEntity(entity: Entity): Entity { + if (entity.relations) { + for (const relation of entity.relations as any) { + if (!relation.targetRef && relation.target) { + // This is the case where an old-form entity, not yet stitched with + // the updated code, was in the database + relation.targetRef = stringifyEntityRef(relation.target); + } else if (!relation.target && relation.targetRef) { + // This is the case where a new-form entity, stitched with the + // updated code, was in the database but we still want to produce + // the old data shape as well for compatibility reasons + relation.target = parseEntityRef(relation.targetRef); + } + } + } + return entity; +} diff --git a/plugins/catalog-backend/src/tests/integration.test.ts b/plugins/catalog-backend/src/tests/integration.test.ts index d278fb4f0a..e85ebe48ce 100644 --- a/plugins/catalog-backend/src/tests/integration.test.ts +++ b/plugins/catalog-backend/src/tests/integration.test.ts @@ -30,7 +30,6 @@ import { processingResult, } from '@backstage/plugin-catalog-node'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; -import { JsonObject } from '@backstage/types'; import { createHash } from 'crypto'; import { Knex } from 'knex'; import { EntitiesCatalog } from '../catalog/types'; @@ -55,6 +54,7 @@ import { DefaultStitcher } from '../stitching/DefaultStitcher'; import { mockServices } from '@backstage/backend-test-utils'; import { LoggerService } from '@backstage/backend-plugin-api'; import { DatabaseManager } from '@backstage/backend-common'; +import { entitiesResponseToObjects } from '../service/response'; const voidLogger = mockServices.logger.mock(); @@ -198,7 +198,7 @@ class TestHarness { readonly #proxyProgressTracker: ProxyProgressTracker; static async create(options?: { - config?: JsonObject; + disableRelationsCompatibility?: boolean; logger?: LoggerService; db?: Knex; permissions?: PermissionEvaluator; @@ -208,21 +208,19 @@ class TestHarness { emit: CatalogProcessorEmit, ): Promise; }) { - const config = new ConfigReader( - options?.config ?? { - backend: { - database: { - client: 'better-sqlite3', - connection: ':memory:', - }, - }, - catalog: { - stitchingStrategy: { - mode: 'immediate', - }, + const config = new ConfigReader({ + backend: { + database: { + client: 'better-sqlite3', + connection: ':memory:', }, }, - ); + catalog: { + stitchingStrategy: { + mode: 'immediate', + }, + }, + }); const logger = options?.logger ?? mockServices.logger.mock(); const db = options?.db ?? @@ -279,6 +277,7 @@ class TestHarness { database: db, logger, stitcher, + disableRelationsCompatibility: options?.disableRelationsCompatibility, }); const proxyProgressTracker = new ProxyProgressTracker( new NoopProgressTracker(), @@ -365,7 +364,12 @@ class TestHarness { async getOutputEntities(): Promise> { const { entities } = await this.#catalog.entities(); - return Object.fromEntries(entities.map(e => [stringifyEntityRef(e), e])); + return Object.fromEntries( + entitiesResponseToObjects(entities).map(e => [ + stringifyEntityRef(e!), + e!, + ]), + ); } async refresh(options: RefreshOptions) { @@ -442,7 +446,6 @@ describe('Catalog Backend Integration', () => { cause: { name: 'Error', message: 'NOPE', - stack: expect.stringMatching(/^Error: NOPE/), }, }, }, @@ -782,4 +785,57 @@ describe('Catalog Backend Integration', () => { ], }); }); + + it('should return valid responses in raw JSON mode', async () => { + const harness = await TestHarness.create({ + disableRelationsCompatibility: true, + }); + + const entityA = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'a', + annotations: { + 'backstage.io/managed-by-location': 'url:.', + 'backstage.io/managed-by-origin-location': 'url:.', + }, + }, + }; + const entityB = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'b', + annotations: { + 'backstage.io/managed-by-location': 'url:.', + 'backstage.io/managed-by-origin-location': 'url:.', + }, + }, + }; + + await harness.setInputEntities([entityA, entityB]); + await expect(harness.process()).resolves.toEqual({}); + + await expect(harness.getOutputEntities()).resolves.toEqual({ + 'component:default/a': { + ...entityA, + metadata: { + ...entityA.metadata, + etag: expect.any(String), + uid: expect.any(String), + }, + relations: [], + }, + 'component:default/b': { + ...entityB, + metadata: { + ...entityB.metadata, + etag: expect.any(String), + uid: expect.any(String), + }, + relations: [], + }, + }); + }); }); diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index 1eca771dd2..6041a6a3a8 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-catalog-common +## 1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + +## 1.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## 1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 1.1.1 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index ecf16611ad..ea8cfbe678 100644 --- a/plugins/catalog-common/package.json +++ b/plugins/catalog-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-common", - "version": "1.1.1", + "version": "1.1.3-next.0", "description": "Common functionalities for the catalog plugin", "backstage": { "role": "common-library", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index fc773877c3..78da59a0e8 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,55 @@ # @backstage/plugin-catalog-graph +## 0.4.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/catalog-client@1.9.1-next.0 + +## 0.4.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## 0.4.14 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + +## 0.4.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + ## 0.4.14-next.1 ### Patch Changes diff --git a/plugins/catalog-graph/README.md b/plugins/catalog-graph/README.md index 0862abbc96..b9400e8e8b 100644 --- a/plugins/catalog-graph/README.md +++ b/plugins/catalog-graph/README.md @@ -137,6 +137,20 @@ return ( ); ``` +Once you have your custom implementation, you can follow these steps to modify the required components: + +- In the `app.tsx` update the `CatalogGraphPage` component to include your custom styles: + +```tsx +} /> +``` + +- In the `Entity.tsx` file, update the `EntityCatalogGraphCard` component to this: + +```tsx + +``` + ## Development Run `yarn` in the root of this plugin to install all dependencies and then `yarn start` to run a [development version](./dev/index.tsx) of this plugin. diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 2f6be0e50d..98cc47269e 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.4.14-next.1", + "version": "0.4.15-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-graph", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index d33d758529..f902c4638d 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,68 @@ # @backstage/plugin-catalog-import +## 0.12.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## 0.12.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/integration-react@1.2.2 + - @backstage/core-compat-api@0.3.4 + +## 0.12.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/integration@1.16.0 + - @backstage/catalog-client@1.9.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-catalog-common@1.1.2 + +## 0.12.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.12.8-next.1 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 65f315a046..0e13e4c931 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-import", - "version": "0.12.8-next.1", + "version": "0.12.9-next.1", "description": "A Backstage plugin the helps you import entities into your catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 42162d4fe5..e82df45202 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,65 @@ # @backstage/plugin-catalog-node +## 1.15.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## 1.15.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + +## 1.15.0 + +### Minor Changes + +- 8edc4cd: Updated the `catalogServiceMock` return type to match both `CatalogService` and `CatalogApi` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + +## 1.15.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.15.0-next.1 ### Minor Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 23acfb724f..fccf7de35a 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-node", - "version": "1.15.0-next.1", + "version": "1.15.1-next.1", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", "backstage": { "role": "node-library", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index dd00d333db..1a05159ead 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,86 @@ # @backstage/plugin-catalog-react +## 1.15.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/frontend-test-utils@0.2.5-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/version-bridge@1.0.10 + +## 1.15.1-next.0 + +### Patch Changes + +- cbfc0a4: Fixed an issue where the `` in `offset` mode would unnecessarily re-fetch data when the filter didn't change, causing a flicker effect. +- Updated dependencies + - @backstage/integration-react@1.2.2 + - @backstage/core-compat-api@0.3.4 + +## 1.15.0 + +### Minor Changes + +- 1ffb9f3: Update `EntityKindFilter` to include a `label` field with the properly capitalized Kind facet string +- ceaf602: Sort EntityTypePicker by default + +### Patch Changes + +- d97a2cd: Fixed an issue causing the `EntityOwnerPicker` to reset scrolling when more elements are loaded. +- c36bd35: Internal refactor to break potential circular imports +- f18c67d: Fix catalog filtering to allow searching entities by display name +- 95092a6: Fixed an issue where `` would re-render its children on page load for smaller screens, potentially leading to unnecessary additional backend requests. +- 4a43398: 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. +- Updated dependencies + - @backstage/catalog-client@1.9.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-test-utils@0.2.4 + - @backstage/integration-react@1.2.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-permission-react@0.4.29 + +## 1.14.3-next.2 + +### Patch Changes + +- 95092a6: Fixed an issue where `` would re-render its children on page load for smaller screens, potentially leading to unnecessary additional backend requests. +- 4a43398: 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. +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/frontend-test-utils@0.2.4-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 1.14.3-next.1 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 8e02010362..65778609ec 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-react", - "version": "1.14.3-next.1", + "version": "1.15.1-next.1", "description": "A frontend library that helps other Backstage plugins interact with the catalog", "backstage": { "role": "web-library", diff --git a/plugins/catalog-react/report.api.md b/plugins/catalog-react/report.api.md index af5102176d..1e637f79a5 100644 --- a/plugins/catalog-react/report.api.md +++ b/plugins/catalog-react/report.api.md @@ -243,10 +243,12 @@ export type EntityFilter = { // @public export class EntityKindFilter implements EntityFilter { - constructor(value: string); + constructor(value: string, label: string); // (undocumented) getCatalogFilters(): Record; // (undocumented) + readonly label: string; + // (undocumented) toQueryValue(): string; // (undocumented) readonly value: string; diff --git a/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx b/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx index ee51020cbb..793d4741ad 100644 --- a/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx +++ b/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx @@ -34,8 +34,10 @@ export const Filters = (props: { drawerAnchor?: 'left' | 'right' | 'top' | 'bottom'; }; }) => { - const isScreenSmallerThanBreakpoint = useMediaQuery((theme: Theme) => - theme.breakpoints.down(props.options?.drawerBreakpoint ?? 'md'), + const isScreenSmallerThanBreakpoint = useMediaQuery( + (theme: Theme) => + theme.breakpoints.down(props.options?.drawerBreakpoint ?? 'md'), + { noSsr: true }, ); const theme = useTheme(); const [filterDrawerOpen, setFilterDrawerOpen] = useState(false); diff --git a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.test.tsx b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.test.tsx index 449a8d434a..f025c14011 100644 --- a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.test.tsx @@ -335,7 +335,7 @@ describe('', () => { ', () => { expect(mockCatalogApi.getEntityFacets).toHaveBeenCalledWith({ facets: ['spec.options'], filter: { - kind: 'Component', + kind: 'component', }, }), ); @@ -367,7 +367,7 @@ describe('', () => { ', () => { expect(mockCatalogApi.getEntityFacets).toHaveBeenCalledWith({ facets: ['spec.options'], filter: { - kind: 'Component', + kind: 'component', 'spec.type': ['service'], }, }), diff --git a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx index eba4cc3a7a..fd88a7a31e 100644 --- a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx +++ b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx @@ -31,7 +31,7 @@ import { useEntityList, } from '../../hooks/useEntityListProvider'; import { EntityFilter } from '../../types'; -import { reduceBackendCatalogFilters } from '../../utils'; +import { reduceBackendCatalogFilters } from '../../utils/filters'; /** @public */ export type AllowedEntityFilters = { diff --git a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx index 4633862f2c..6df4f3fe61 100644 --- a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx @@ -78,7 +78,9 @@ describe('', () => { await renderInTestApp( @@ -106,7 +108,7 @@ describe('', () => { @@ -121,7 +123,7 @@ describe('', () => { fireEvent.click(screen.getByText('Domain')); expect(updateFilters).toHaveBeenLastCalledWith({ - kind: new EntityKindFilter('domain'), + kind: new EntityKindFilter('domain', 'Domain'), }); }); @@ -143,7 +145,7 @@ describe('', () => { ); expect(updateFilters).toHaveBeenLastCalledWith({ - kind: new EntityKindFilter('group'), + kind: new EntityKindFilter('group', 'Group'), }); }); diff --git a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx index 0874252c3a..bdfd3276ef 100644 --- a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx +++ b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx @@ -27,7 +27,7 @@ import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; function useEntityKindFilter(opts: { initialFilter: string }): { loading: boolean; error?: Error; - allKinds: string[]; + allKinds: Map; selectedKind: string; setSelectedKind: (kind: string) => void; } { @@ -62,18 +62,21 @@ function useEntityKindFilter(opts: { initialFilter: string }): { } }, [filters.kind]); + const { allKinds, loading, error } = useAllKinds(); + const selectedKindLabel = allKinds.get(selectedKind) || selectedKind; + useEffect(() => { updateFilters({ - kind: selectedKind ? new EntityKindFilter(selectedKind) : undefined, + kind: selectedKind + ? new EntityKindFilter(selectedKind, selectedKindLabel) + : undefined, }); - }, [selectedKind, updateFilters]); - - const { allKinds, loading, error } = useAllKinds(); + }, [selectedKind, selectedKindLabel, updateFilters]); return { loading, error, - allKinds: allKinds ?? [], + allKinds, selectedKind, setSelectedKind, }; @@ -119,9 +122,9 @@ export const EntityKindPicker = (props: EntityKindPickerProps) => { const options = filterKinds(allKinds, allowedKinds, selectedKind); - const items = Object.keys(options).map(key => ({ + const items = [...options.entries()].map(([key, value]) => ({ + label: value, value: key, - label: options[key], })); return hidden ? null : ( diff --git a/plugins/catalog-react/src/components/EntityKindPicker/kindFilterUtils.ts b/plugins/catalog-react/src/components/EntityKindPicker/kindFilterUtils.ts index b3e27c85d9..6e6d9c134c 100644 --- a/plugins/catalog-react/src/components/EntityKindPicker/kindFilterUtils.ts +++ b/plugins/catalog-react/src/components/EntityKindPicker/kindFilterUtils.ts @@ -19,12 +19,12 @@ import useAsync from 'react-use/esm/useAsync'; import { catalogApiRef } from '../../api'; /** - * Fetch and return all availible kinds. + * Fetch and return all available kinds. */ export function useAllKinds(): { loading: boolean; error?: Error; - allKinds: string[]; + allKinds: Map; } { const catalogApi = useApi(catalogApiRef); @@ -33,50 +33,44 @@ export function useAllKinds(): { loading, value: allKinds, } = useAsync(async () => { - const items = await catalogApi - .getEntityFacets({ facets: ['kind'] }) - .then(response => response.facets.kind?.map(f => f.value).sort() || []); - return items; + const { facets } = await catalogApi.getEntityFacets({ facets: ['kind'] }); + const kindFacets = (facets.kind ?? []).map(f => f.value); + return new Map( + kindFacets.map(kind => [kind.toLocaleLowerCase('en-US'), kind]), + ); }, [catalogApi]); - return { loading, error, allKinds: allKinds ?? [] }; + return { loading, error, allKinds: allKinds ?? new Map() }; } /** * Filter and capitalize accessible kinds. */ export function filterKinds( - allKinds: string[], + allKinds: Map, allowedKinds?: string[], forcedKinds?: string, -): Record { +): Map { // Before allKinds is loaded, or when a kind is entered manually in the URL, selectedKind may not // be present in allKinds. It should still be shown in the dropdown, but may not have the nice // enforced casing from the catalog-backend. This makes a key/value record for the Select options, // including selectedKind if it's unknown - but allows the selectedKind to get clobbered by the // more proper catalog kind if it exists. - let availableKinds = allKinds; + let availableKinds = Array.from(allKinds.keys()); if (allowedKinds) { - availableKinds = availableKinds.filter(k => - allowedKinds.some( - a => a.toLocaleLowerCase('en-US') === k.toLocaleLowerCase('en-US'), - ), - ); - } - if ( - forcedKinds && - !allKinds.some( - a => - a.toLocaleLowerCase('en-US') === forcedKinds.toLocaleLowerCase('en-US'), - ) - ) { - availableKinds = availableKinds.concat([forcedKinds]); + availableKinds = allowedKinds + .map(k => k.toLocaleLowerCase('en-US')) + .filter(k => allKinds.has(k)); } - const kindsMap = availableKinds.sort().reduce((acc, kind) => { - acc[kind.toLocaleLowerCase('en-US')] = kind; - return acc; - }, {} as Record); + const kindsMap = new Map( + availableKinds.map(kind => [kind, allKinds.get(kind) || kind]), + ); + + if (forcedKinds && !kindsMap.has(forcedKinds)) { + // this is the only time we set a label for a kind which is not properly capitalized + kindsMap.set(forcedKinds.toLocaleLowerCase('en-US'), forcedKinds); + } return kindsMap; } diff --git a/plugins/catalog-react/src/components/EntityTypePicker/EntityTypePicker.test.tsx b/plugins/catalog-react/src/components/EntityTypePicker/EntityTypePicker.test.tsx index f7954f2604..75c83e4b86 100644 --- a/plugins/catalog-react/src/components/EntityTypePicker/EntityTypePicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityTypePicker/EntityTypePicker.test.tsx @@ -86,7 +86,9 @@ describe('', () => { await renderInTestApp( @@ -110,7 +112,7 @@ describe('', () => { diff --git a/plugins/catalog-react/src/components/EntityTypePicker/EntityTypePicker.tsx b/plugins/catalog-react/src/components/EntityTypePicker/EntityTypePicker.tsx index 082004f15b..ba39536d1e 100644 --- a/plugins/catalog-react/src/components/EntityTypePicker/EntityTypePicker.tsx +++ b/plugins/catalog-react/src/components/EntityTypePicker/EntityTypePicker.tsx @@ -55,6 +55,10 @@ export const EntityTypePicker = (props: EntityTypePickerProps) => { if (availableTypes.length === 0 || error) return null; + availableTypes.sort((a, b) => + a.toLocaleLowerCase('en-US').localeCompare(b.toLocaleLowerCase('en-US')), + ); + const items = [ { value: 'all', label: t('entityTypePicker.optionAllTitle') }, ...availableTypes.map((type: string) => ({ diff --git a/plugins/catalog-react/src/components/UserListPicker/UserListPicker.test.tsx b/plugins/catalog-react/src/components/UserListPicker/UserListPicker.test.tsx index 3ef5c242a1..92b51786d0 100644 --- a/plugins/catalog-react/src/components/UserListPicker/UserListPicker.test.tsx +++ b/plugins/catalog-react/src/components/UserListPicker/UserListPicker.test.tsx @@ -252,7 +252,7 @@ describe('', () => { value={{ updateFilters, queryParameters, - filters: { kind: new EntityKindFilter('component') }, + filters: { kind: new EntityKindFilter('component', 'Component') }, }} > @@ -293,7 +293,7 @@ describe('', () => { @@ -341,7 +341,7 @@ describe('', () => { updateFilters, queryParameters: { user: ['all'], kind: 'component' }, filters: { - kind: new EntityKindFilter('component'), + kind: new EntityKindFilter('component', 'Component'), user: undefined, }, }} @@ -368,7 +368,7 @@ describe('', () => { updateFilters, queryParameters: { user: ['owned'], kind: 'component' }, filters: { - kind: new EntityKindFilter('component'), + kind: new EntityKindFilter('component', 'Component'), user: undefined, }, }} @@ -394,7 +394,7 @@ describe('', () => { value={{ updateFilters, filters: filters || { - kind: new EntityKindFilter('component'), + kind: new EntityKindFilter('component', 'Component'), }, }} > diff --git a/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.ts b/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.ts index cecd0e4db7..fa564382d8 100644 --- a/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.ts +++ b/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.ts @@ -20,7 +20,7 @@ import { useMemo, useRef } from 'react'; import useAsync from 'react-use/esm/useAsync'; import { catalogApiRef } from '../../api'; import { useEntityList } from '../../hooks'; -import { reduceCatalogFilters } from '../../utils'; +import { reduceCatalogFilters } from '../../utils/filters'; export function useAllEntitiesCount() { const catalogApi = useApi(catalogApiRef); diff --git a/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.ts b/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.ts index 10481e80a8..dbdc040165 100644 --- a/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.ts +++ b/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.ts @@ -21,7 +21,7 @@ import useAsync from 'react-use/esm/useAsync'; import { catalogApiRef } from '../../api'; import { EntityOwnerFilter, EntityUserFilter } from '../../filters'; import { useEntityList } from '../../hooks'; -import { CatalogFilters, reduceCatalogFilters } from '../../utils'; +import { CatalogFilters, reduceCatalogFilters } from '../../utils/filters'; import useAsyncFn from 'react-use/esm/useAsyncFn'; import useDeepCompareEffect from 'react-use/esm/useDeepCompareEffect'; diff --git a/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.ts b/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.ts index 082c683642..70dde024f8 100644 --- a/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.ts +++ b/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.ts @@ -23,7 +23,7 @@ import useAsync from 'react-use/esm/useAsync'; import { catalogApiRef } from '../../api'; import { EntityUserFilter } from '../../filters'; import { useEntityList, useStarredEntities } from '../../hooks'; -import { reduceCatalogFilters } from '../../utils'; +import { reduceCatalogFilters } from '../../utils/filters'; export function useStarredEntitiesCount() { const catalogApi = useApi(catalogApiRef); diff --git a/plugins/catalog-react/src/filters.ts b/plugins/catalog-react/src/filters.ts index 6c68dad9aa..3ac7bda73a 100644 --- a/plugins/catalog-react/src/filters.ts +++ b/plugins/catalog-react/src/filters.ts @@ -22,14 +22,14 @@ import { } from '@backstage/catalog-model'; import { AlphaEntity } from '@backstage/catalog-model/alpha'; import { EntityFilter, UserListFilterKind } from './types'; -import { getEntityRelations } from './utils'; +import { getEntityRelations } from './utils/getEntityRelations'; /** * Filter entities based on Kind. * @public */ export class EntityKindFilter implements EntityFilter { - constructor(readonly value: string) {} + constructor(readonly value: string, readonly label: string) {} getCatalogFilters(): Record { return { kind: this.value }; diff --git a/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx b/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx index 2ed944d339..2a922cf417 100644 --- a/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx +++ b/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx @@ -87,7 +87,7 @@ const createWrapper = const { updateFilters } = useEntityList(); useMountEffect(() => { - updateFilters({ kind: new EntityKindFilter('component') }); + updateFilters({ kind: new EntityKindFilter('component', 'Component') }); }); return <>{children}; @@ -252,7 +252,9 @@ describe('', () => { expect(mockCatalogApi.getEntities).toHaveBeenCalledTimes(1); await act(async () => { - result.current.updateFilters({ kind: new EntityKindFilter('api') }); + result.current.updateFilters({ + kind: new EntityKindFilter('api', 'API'), + }); result.current.updateFilters({ type: new EntityTypeFilter('service') }); }); @@ -277,7 +279,9 @@ describe('', () => { mockCatalogApi.getEntities!.mockRejectedValueOnce('error'); act(() => { - result.current.updateFilters({ kind: new EntityKindFilter('api') }); + result.current.updateFilters({ + kind: new EntityKindFilter('api', 'API'), + }); }); await waitFor(() => { expect(result.current.error).toBeDefined(); @@ -443,7 +447,9 @@ describe('', () => { expect(mockCatalogApi.queryEntities).toHaveBeenCalledTimes(1); await act(async () => { - result.current.updateFilters({ kind: new EntityKindFilter('api') }); + result.current.updateFilters({ + kind: new EntityKindFilter('api', 'API'), + }); result.current.updateFilters({ type: new EntityTypeFilter('service') }); }); @@ -470,7 +476,9 @@ describe('', () => { mockCatalogApi.queryEntities!.mockRejectedValueOnce('error'); act(() => { - result.current.updateFilters({ kind: new EntityKindFilter('api') }); + result.current.updateFilters({ + kind: new EntityKindFilter('api', 'API'), + }); }); await waitFor(() => { expect(result.current.error).toBeDefined(); @@ -547,7 +555,7 @@ describe('', () => { }); }); -describe('', () => { +describe(``, () => { const origReplaceState = window.history.replaceState; const pagination: EntityListPagination = { mode: 'offset' }; const limit = 20; @@ -680,6 +688,18 @@ describe('', () => { await waitFor(() => { expect(mockCatalogApi.queryEntities).toHaveBeenCalledTimes(2); }); + + act(() => + result.current.updateFilters({ + user: EntityUserFilter.owned(ownershipEntityRefs), + }), + ); + + await expect(() => + waitFor(() => { + expect(mockCatalogApi.queryEntities).toHaveBeenCalledTimes(3); + }), + ).rejects.toThrow(); }); it('fetch when limit change', async () => { @@ -715,8 +735,10 @@ describe('', () => { expect(result.current.backendEntities.length).toBe(2); expect(mockCatalogApi.queryEntities).toHaveBeenCalledTimes(1); - await act(async () => { - result.current.updateFilters({ kind: new EntityKindFilter('api') }); + act(() => { + result.current.updateFilters({ + kind: new EntityKindFilter('api', 'API'), + }); result.current.updateFilters({ type: new EntityTypeFilter('service') }); }); @@ -740,7 +762,7 @@ describe('', () => { expect(result.current.backendEntities.length).toBe(2); expect(mockCatalogApi.queryEntities).toHaveBeenCalledTimes(1); - await act(async () => { + act(() => { result.current.setOffset!(5); result.current.setOffset!(10); }); @@ -768,7 +790,9 @@ describe('', () => { mockCatalogApi.queryEntities!.mockRejectedValueOnce('error'); act(() => { - result.current.updateFilters({ kind: new EntityKindFilter('api') }); + result.current.updateFilters({ + kind: new EntityKindFilter('api', 'API'), + }); }); await waitFor(() => { expect(result.current.error).toBeDefined(); diff --git a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx index 274ec52a18..fc2dfe6a73 100644 --- a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx +++ b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx @@ -48,7 +48,7 @@ import { reduceBackendCatalogFilters, reduceCatalogFilters, reduceEntityFilters, -} from '../utils'; +} from '../utils/filters'; import { useApi } from '@backstage/core-plugin-api'; import { QueryEntitiesResponse } from '@backstage/catalog-client'; @@ -173,7 +173,7 @@ export const EntityListProvider = ( : 'none'; }; - const paginationMode: PaginationMode = getPaginationMode(); + const paginationMode = getPaginationMode(); const paginationLimit = typeof props.pagination === 'object' ? props.pagination.limit ?? 20 : 20; @@ -227,7 +227,7 @@ export const EntityListProvider = ( appliedFilters: {} as EntityFilters, entities: [], backendEntities: [], - pageInfo: paginationMode === 'cursor' ? {} : undefined, + pageInfo: {}, offset, limit, }; @@ -279,7 +279,8 @@ export const EntityListProvider = ( ); if ( - paginationMode === 'offset' || + (paginationMode === 'offset' && + (outputState.limit !== limit || outputState.offset !== offset)) || !isEqual(previousBackendFilter, backendFilter) ) { const response = await catalogApi.queryEntities({ diff --git a/plugins/catalog-react/src/utils/index.ts b/plugins/catalog-react/src/utils/index.ts index 5afc32af63..5b2159ae2f 100644 --- a/plugins/catalog-react/src/utils/index.ts +++ b/plugins/catalog-react/src/utils/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './filters'; + export { getEntityRelations } from './getEntityRelations'; export { getEntitySourceLocation } from './getEntitySourceLocation'; export type { EntitySourceLocation } from './getEntitySourceLocation'; diff --git a/plugins/catalog-unprocessed-entities-common/CHANGELOG.md b/plugins/catalog-unprocessed-entities-common/CHANGELOG.md index 10a8d5ad0d..5da2451dbe 100644 --- a/plugins/catalog-unprocessed-entities-common/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities-common/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-unprocessed-entities-common +## 0.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.4-next.0 + +## 0.0.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3 + +## 0.0.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.0.5 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities-common/package.json b/plugins/catalog-unprocessed-entities-common/package.json index c570efd2da..d11cc64131 100644 --- a/plugins/catalog-unprocessed-entities-common/package.json +++ b/plugins/catalog-unprocessed-entities-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities-common", - "version": "0.0.5", + "version": "0.0.7-next.0", "description": "Common functionalities for the catalog-unprocessed-entities plugin", "backstage": { "role": "common-library", diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md index 613954353c..268e860faa 100644 --- a/plugins/catalog-unprocessed-entities/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-catalog-unprocessed-entities +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + +## 0.2.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + +## 0.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + ## 0.2.12-next.1 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index f1606efca7..89cfc75e18 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities", - "version": "0.2.12-next.1", + "version": "0.2.13-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-unprocessed-entities", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 4eb9dfcd09..99fdf53768 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,89 @@ # @backstage/plugin-catalog +## 1.26.1-next.1 + +### Patch Changes + +- 208e53b: Fixing spelling mistake in translation +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## 1.26.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/integration-react@1.2.2 + - @backstage/core-compat-api@0.3.4 + +## 1.26.0 + +### Minor Changes + +- 25beb82: Adds an optional columns attribute to HasSubdomainsCardProps and changes its default columns +- 39f1abc: Consistent title behaviour across CatalogTable, CursorPaginatedCatalogTable, and OffsetPaginatedCatalogTable. +- 1ffb9f3: Update `CatalogTable` title to use properly capitalized Kind facets (e.g. 'Component' instead of 'component') + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/plugin-search-react@1.8.4 + - @backstage/catalog-client@1.9.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search-common@1.2.16 + +## 1.26.0-next.2 + +### Minor Changes + +- 25beb82: Adds an optional columns attribute to HasSubdomainsCardProps and changes its default columns +- 39f1abc: Consistent title behaviour across CatalogTable, CursorPaginatedCatalogTable, and OffsetPaginatedCatalogTable. + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + ## 1.25.2-next.1 ### Patch Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 58106dbb11..ef17de69ce 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog", - "version": "1.25.2-next.1", + "version": "1.26.1-next.1", "description": "The Backstage plugin for browsing the Backstage catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/catalog/report-alpha.api.md b/plugins/catalog/report-alpha.api.md index 3a9f0c6c33..bdd9240d53 100644 --- a/plugins/catalog/report-alpha.api.md +++ b/plugins/catalog/report-alpha.api.md @@ -115,7 +115,7 @@ export const catalogTranslationRef: TranslationRef< readonly 'hasSystemsCard.emptyMessage': 'No system is part of this domain'; readonly 'relatedEntitiesCard.emptyHelpLinkTitle': 'Learn how to change this'; readonly 'systemDiagramCard.title': 'System Diagram'; - readonly 'systemDiagramCard.description': 'Use pinch & zoo to move around the diagram.'; + readonly 'systemDiagramCard.description': 'Use pinch & zoom to move around the diagram.'; readonly 'systemDiagramCard.edgeLabels.dependsOn': 'depends on'; readonly 'systemDiagramCard.edgeLabels.partOf': 'part of'; readonly 'systemDiagramCard.edgeLabels.provides': 'provides'; diff --git a/plugins/catalog/report.api.md b/plugins/catalog/report.api.md index 6b8f246514..3692a919b3 100644 --- a/plugins/catalog/report.api.md +++ b/plugins/catalog/report.api.md @@ -10,6 +10,7 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CatalogApi } from '@backstage/plugin-catalog-react'; import { ComponentEntity } from '@backstage/catalog-model'; import { CompoundEntityRef } from '@backstage/catalog-model'; +import { DomainEntity } from '@backstage/catalog-model'; import { Entity } from '@backstage/catalog-model'; import { EntityListContextProps } from '@backstage/plugin-catalog-react'; import { EntityListPagination } from '@backstage/plugin-catalog-react'; @@ -156,7 +157,7 @@ export interface CatalogSearchResultListItemProps { result?: IndexableDocument; } -// @public (undocumented) +// @public export const CatalogTable: { (props: CatalogTableProps): React_2.JSX.Element; columns: Readonly<{ @@ -214,6 +215,7 @@ export interface CatalogTableProps { subtitle?: string; // (undocumented) tableOptions?: TableProps['options']; + title?: string; } // @public (undocumented) @@ -584,6 +586,8 @@ export interface HasSubcomponentsCardProps { // @public (undocumented) export interface HasSubdomainsCardProps { + // (undocumented) + columns?: TableColumn[]; // (undocumented) tableOptions?: TableOptions; // (undocumented) diff --git a/plugins/catalog/src/alpha/translation.ts b/plugins/catalog/src/alpha/translation.ts index e5e6fa18e2..2dc2f2d34e 100644 --- a/plugins/catalog/src/alpha/translation.ts +++ b/plugins/catalog/src/alpha/translation.ts @@ -156,7 +156,7 @@ export const catalogTranslationRef = createTranslationRef({ }, systemDiagramCard: { title: 'System Diagram', - description: 'Use pinch & zoo to move around the diagram.', + description: 'Use pinch & zoom to move around the diagram.', edgeLabels: { partOf: 'part of', provides: 'provides', diff --git a/plugins/catalog/src/apis/StarredEntitiesApi/DefaultStarredEntitiesApi.ts b/plugins/catalog/src/apis/StarredEntitiesApi/DefaultStarredEntitiesApi.ts index f4b7771d04..5c06dc1ca2 100644 --- a/plugins/catalog/src/apis/StarredEntitiesApi/DefaultStarredEntitiesApi.ts +++ b/plugins/catalog/src/apis/StarredEntitiesApi/DefaultStarredEntitiesApi.ts @@ -69,7 +69,7 @@ export class DefaultStarredEntitiesApi implements StarredEntitiesApi { >(); private readonly observable = new ObservableImpl>(subscriber => { - // forward the the latest value + // forward the latest value subscriber.next(new Set(this.starredEntities)); this.subscribers.add(subscriber); diff --git a/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.test.tsx b/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.test.tsx index a169e9139a..d0e3fa9ace 100644 --- a/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.test.tsx +++ b/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.test.tsx @@ -133,7 +133,7 @@ describe('', () => { fireEvent.click(option); expect(updateFilters).toHaveBeenCalledWith({ - kind: new EntityKindFilter('template'), + kind: new EntityKindFilter('template', 'Template'), }); }); @@ -144,7 +144,7 @@ describe('', () => { @@ -152,7 +152,7 @@ describe('', () => { , ); expect(updateFilters).toHaveBeenLastCalledWith({ - kind: new EntityKindFilter('components'), + kind: new EntityKindFilter('component', 'Component'), }); rendered.rerender( @@ -168,7 +168,7 @@ describe('', () => { ); await waitFor(() => expect(updateFilters).toHaveBeenLastCalledWith({ - kind: new EntityKindFilter('template'), + kind: new EntityKindFilter('template', 'Template'), }), ); }); diff --git a/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx b/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx index 58fd0cfc0f..db4767a82a 100644 --- a/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx +++ b/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx @@ -91,11 +91,16 @@ export function CatalogKindHeader(props: CatalogKindHeaderProps) { } }, [filters.kind]); + const selectedKindLabel = + allKinds.get(selectedKind.toLocaleLowerCase('en-US')) || selectedKind; + useEffect(() => { updateFilters({ - kind: selectedKind ? new EntityKindFilter(selectedKind) : undefined, + kind: selectedKind + ? new EntityKindFilter(selectedKind, selectedKindLabel) + : undefined, }); - }, [selectedKind, updateFilters]); + }, [selectedKind, selectedKindLabel, updateFilters]); const options = filterKinds(allKinds, allowedKinds, selectedKind); @@ -106,9 +111,9 @@ export function CatalogKindHeader(props: CatalogKindHeaderProps) { onChange={e => setSelectedKind(e.target.value as string)} classes={classes} > - {Object.keys(options).map(kind => ( + {[...options.keys()].map(kind => ( - {`${pluralize(options[kind])}`} + {`${pluralize(options.get(kind) || kind)}`} ))} diff --git a/plugins/catalog/src/components/CatalogKindHeader/kindFilterUtils.ts b/plugins/catalog/src/components/CatalogKindHeader/kindFilterUtils.ts index 7ac08ae0c8..4c6fd74609 100644 --- a/plugins/catalog/src/components/CatalogKindHeader/kindFilterUtils.ts +++ b/plugins/catalog/src/components/CatalogKindHeader/kindFilterUtils.ts @@ -19,12 +19,12 @@ import { catalogApiRef } from '@backstage/plugin-catalog-react'; import useAsync from 'react-use/esm/useAsync'; /** - * Fetch and return all availible kinds. + * Fetch and return all available kinds. */ export function useAllKinds(): { loading: boolean; error?: Error; - allKinds: string[]; + allKinds: Map; } { const catalogApi = useApi(catalogApiRef); @@ -33,50 +33,44 @@ export function useAllKinds(): { loading, value: allKinds, } = useAsync(async () => { - const items = await catalogApi - .getEntityFacets({ facets: ['kind'] }) - .then(response => response.facets.kind?.map(f => f.value).sort() || []); - return items; + const { facets } = await catalogApi.getEntityFacets({ facets: ['kind'] }); + const kindFacets = (facets.kind ?? []).map(f => f.value); + return new Map( + kindFacets.map(kind => [kind.toLocaleLowerCase('en-US'), kind]), + ); }, [catalogApi]); - return { loading, error, allKinds: allKinds ?? [] }; + return { loading, error, allKinds: allKinds ?? new Map() }; } /** * Filter and capitalize accessible kinds. */ export function filterKinds( - allKinds: string[], + allKinds: Map, allowedKinds?: string[], forcedKinds?: string, -): Record { +): Map { // Before allKinds is loaded, or when a kind is entered manually in the URL, selectedKind may not // be present in allKinds. It should still be shown in the dropdown, but may not have the nice // enforced casing from the catalog-backend. This makes a key/value record for the Select options, // including selectedKind if it's unknown - but allows the selectedKind to get clobbered by the // more proper catalog kind if it exists. - let availableKinds = allKinds; + let availableKinds = Array.from(allKinds.keys()); if (allowedKinds) { - availableKinds = availableKinds.filter(k => - allowedKinds.some( - a => a.toLocaleLowerCase('en-US') === k.toLocaleLowerCase('en-US'), - ), - ); - } - if ( - forcedKinds && - !allKinds.some( - a => - a.toLocaleLowerCase('en-US') === forcedKinds.toLocaleLowerCase('en-US'), - ) - ) { - availableKinds = availableKinds.concat([forcedKinds]); + availableKinds = allowedKinds + .map(k => k.toLocaleLowerCase('en-US')) + .filter(k => allKinds.has(k)); } - const kindsMap = availableKinds.sort().reduce((acc, kind) => { - acc[kind.toLocaleLowerCase('en-US')] = kind; - return acc; - }, {} as Record); + const kindsMap = new Map( + availableKinds.map(kind => [kind, allKinds.get(kind) || kind]), + ); + + if (forcedKinds && !kindsMap.has(forcedKinds)) { + // this is the only time we set a label for a kind which is not properly capitalized + kindsMap.set(forcedKinds.toLocaleLowerCase('en-US'), forcedKinds); + } return kindsMap; } diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx index 5b7f28e26a..71ddd50b05 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx @@ -84,6 +84,19 @@ describe('CatalogTable component', () => { ).resolves.toBeInTheDocument(); }); + it('should a custom title and subtitle when passed in', async () => { + await renderInTestApp( + + + + + , + ); + + expect(screen.queryByText('My Title')).toBeInTheDocument(); + expect(screen.queryByText('My Subtitle')).toBeInTheDocument(); + }); + it('should display entity names when loading has finished and no error occurred', async () => { await renderInTestApp( @@ -98,6 +111,7 @@ describe('CatalogTable component', () => { ), kind: { value: 'component', + label: 'Component', getCatalogFilters: () => ({ kind: 'component' }), toQueryValue: () => 'component', }, @@ -113,7 +127,7 @@ describe('CatalogTable component', () => { }, }, ); - expect(screen.getByText(/Owned components \(3\)/)).toBeInTheDocument(); + expect(screen.getByText(/Owned Components \(3\)/)).toBeInTheDocument(); expect(screen.getByText(/component1/)).toBeInTheDocument(); expect(screen.getByText(/component2/)).toBeInTheDocument(); expect(screen.getByText(/component3/)).toBeInTheDocument(); @@ -287,7 +301,9 @@ describe('CatalogTable component', () => { value={{ entities, filters: { - kind: kind ? new EntityKindFilter(kind) : undefined, + kind: kind + ? new EntityKindFilter(kind.toLocaleLowerCase('en-US'), kind) + : undefined, }, }} > @@ -407,6 +423,7 @@ describe('CatalogTable component', () => { filters: { kind: { value: 'api', + label: 'API', getCatalogFilters: () => ({ kind: 'api' }), toQueryValue: () => 'api', }, diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx index 2d5e78a0d6..c565cffa93 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx @@ -49,6 +49,7 @@ import { defaultCatalogTableColumnsFunc } from './defaultCatalogTableColumnsFunc import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; import { catalogTranslationRef } from '../../alpha/translation'; import { FavoriteToggleIcon } from '@backstage/core-components'; +import { CatalogTableToolbar } from './CatalogTableToolbar'; /** * Props for {@link CatalogTable}. @@ -60,6 +61,11 @@ export interface CatalogTableProps { actions?: TableProps['actions']; tableOptions?: TableProps['options']; emptyContent?: ReactNode; + /** + * A static title to use for the table. If not provided, a title will be + * generated based on the current Kind and Type filters and total number of items. + */ + title?: string; subtitle?: string; } @@ -73,7 +79,16 @@ const refCompare = (a: Entity, b: Entity) => { return toRef(a).localeCompare(toRef(b)); }; -/** @public */ +/** + * CatalogTable is a wrapper around the Table component that is pre-configured + * to display catalog entities. + * + * @remarks + * + * See {@link https://backstage.io/docs/features/software-catalog/catalog-customization} + * + * @public + */ export const CatalogTable = (props: CatalogTableProps) => { const { columns = defaultCatalogTableColumnsFunc, @@ -168,19 +183,16 @@ export const CatalogTable = (props: CatalogTableProps) => { }, ]; - const currentKind = filters.kind?.value || ''; + const currentKind = filters.kind?.label || ''; const currentType = filters.type?.value || ''; const currentCount = typeof totalItems === 'number' ? `(${totalItems})` : ''; // TODO(timbonicus): remove the title from the CatalogTable once using EntitySearchBar const titlePreamble = capitalize(filters.user?.value ?? 'all'); - const title = [ - titlePreamble, - currentType, - pluralize(currentKind), - currentCount, - ] - .filter(s => s) - .join(' '); + const title = + props.title || + [titlePreamble, currentType, pluralize(currentKind), currentCount] + .filter(s => s) + .join(' '); const actions = props.actions || defaultActions; const options = { @@ -235,6 +247,9 @@ export const CatalogTable = (props: CatalogTableProps) => { pageSizeOptions: [20, 50, 100], ...options, }} + components={{ + Toolbar: CatalogTableToolbar, + }} title={title} data={rows} actions={actions} diff --git a/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.test.tsx b/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.test.tsx index adc69794ae..169c1277b9 100644 --- a/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.test.tsx +++ b/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.test.tsx @@ -63,6 +63,22 @@ describe('CursorPaginatedCatalogTable', () => { ); }; + it('should display the title and subtitle when passed in', async () => { + await renderInTestApp( + wrapInContext( + , + ), + ); + + expect(screen.queryByText('My Title')).toBeInTheDocument(); + expect(screen.queryByText('My Subtitle')).toBeInTheDocument(); + }); + it('should display all the items', async () => { await renderInTestApp( wrapInContext( @@ -146,7 +162,7 @@ describe('CursorPaginatedCatalogTable', () => { entities: data.map(e => e.entity), totalItems: data.length, filters: { - kind: new EntityKindFilter('component'), + kind: new EntityKindFilter('component', 'Component'), }, }} > diff --git a/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.tsx index 7198f8a60c..843d5be2c8 100644 --- a/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.tsx @@ -30,12 +30,10 @@ type PaginatedCatalogTableProps = { */ export function CursorPaginatedCatalogTable(props: PaginatedCatalogTableProps) { - const { columns, data, next, prev, title, isLoading, options, ...restProps } = - props; + const { columns, data, next, prev, options, ...restProps } = props; return ( ); diff --git a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.test.tsx b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.test.tsx index aad9b7cb3d..e2e73c5af8 100644 --- a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.test.tsx +++ b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.test.tsx @@ -62,6 +62,28 @@ describe('OffsetPaginatedCatalogTable', () => { ); }; + it('should display the title and subtitle when passed in', async () => { + await renderInTestApp( + wrapInContext( + , + { + setOffset: jest.fn(), + limit: Number.MAX_SAFE_INTEGER, + offset: 0, + totalItems: data.length, + }, + ), + ); + + expect(screen.queryByText('My Title')).toBeInTheDocument(); + expect(screen.queryByText('My Subtitle')).toBeInTheDocument(); + }); + it('should display all the items', async () => { await renderInTestApp( wrapInContext( diff --git a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx index 7febfc2d32..7ebf791046 100644 --- a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx @@ -27,7 +27,7 @@ import { CatalogTableToolbar } from './CatalogTableToolbar'; export function OffsetPaginatedCatalogTable( props: TableProps, ) { - const { columns, data, isLoading, options } = props; + const { columns, data, options, ...restProps } = props; const { setLimit, setOffset, limit, totalItems, offset } = useEntityList(); const [page, setPage] = React.useState( @@ -65,7 +65,7 @@ export function OffsetPaginatedCatalogTable( }} totalCount={totalItems} localization={{ pagination: { labelDisplayedRows: '' } }} - isLoading={isLoading} + {...restProps} /> ); } diff --git a/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx b/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx index 71705ea90f..b52f5eacf7 100644 --- a/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx +++ b/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx @@ -14,12 +14,17 @@ * limitations under the License. */ -import { RELATION_HAS_PART } from '@backstage/catalog-model'; -import { InfoCardVariants, TableOptions } from '@backstage/core-components'; +import { DomainEntity, RELATION_HAS_PART } from '@backstage/catalog-model'; +import { + InfoCardVariants, + TableColumn, + TableOptions, +} from '@backstage/core-components'; import React from 'react'; import { - asComponentEntities, - componentEntityColumns, + asDomainEntities, + domainEntityColumns, + domainEntityHelpLink, RelatedEntitiesCard, } from '../RelatedEntitiesCard'; import { catalogTranslationRef } from '../../alpha/translation'; @@ -29,6 +34,7 @@ import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; export interface HasSubdomainsCardProps { variant?: InfoCardVariants; tableOptions?: TableOptions; + columns?: TableColumn[]; title?: string; } @@ -36,8 +42,9 @@ export function HasSubdomainsCard(props: HasSubdomainsCardProps) { const { t } = useTranslationRef(catalogTranslationRef); const { variant = 'gridItem', - tableOptions = {}, title = t('hasSubdomainsCard.title'), + columns = domainEntityColumns, + tableOptions = {}, } = props; return ( ); diff --git a/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx b/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx index 5b57cbd80e..40481614e2 100644 --- a/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx +++ b/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx @@ -33,10 +33,13 @@ import { } from '@backstage/core-components'; import { asComponentEntities, + asDomainEntities, asResourceEntities, asSystemEntities, componentEntityColumns, componentEntityHelpLink, + domainEntityColumns, + domainEntityHelpLink, resourceEntityColumns, resourceEntityHelpLink, systemEntityColumns, @@ -137,3 +140,6 @@ RelatedEntitiesCard.asResourceEntities = asResourceEntities; RelatedEntitiesCard.systemEntityColumns = systemEntityColumns; RelatedEntitiesCard.systemEntityHelpLink = systemEntityHelpLink; RelatedEntitiesCard.asSystemEntities = asSystemEntities; +RelatedEntitiesCard.domainEntityColums = domainEntityColumns; +RelatedEntitiesCard.domainEntityHelpLink = domainEntityHelpLink; +RelatedEntitiesCard.asDomainEntities = asDomainEntities; diff --git a/plugins/catalog/src/components/RelatedEntitiesCard/presets.ts b/plugins/catalog/src/components/RelatedEntitiesCard/presets.ts index 8e3040ccf9..68930c578b 100644 --- a/plugins/catalog/src/components/RelatedEntitiesCard/presets.ts +++ b/plugins/catalog/src/components/RelatedEntitiesCard/presets.ts @@ -15,6 +15,7 @@ */ import { ComponentEntity, + DomainEntity, Entity, ResourceEntity, SystemEntity, @@ -55,3 +56,13 @@ export const systemEntityHelpLink: string = 'https://backstage.io/docs/features/software-catalog/descriptor-format#kind-system'; export const asSystemEntities = (entities: Entity[]): SystemEntity[] => entities as SystemEntity[]; + +export const domainEntityColumns: TableColumn[] = [ + EntityTable.columns.createEntityRefColumn({ defaultKind: 'domain' }), + EntityTable.columns.createOwnerColumn(), + EntityTable.columns.createMetadataDescriptionColumn(), +]; +export const domainEntityHelpLink: string = + 'https://backstage.io/docs/features/software-catalog/descriptor-format#kind-domain'; +export const asDomainEntities = (entities: Entity[]): DomainEntity[] => + entities as DomainEntity[]; diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 6612b6aed2..ef400bebb6 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-config-schema +## 0.1.64-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/errors@1.2.7-next.0 + +## 0.1.63 + +### Patch Changes + +- c36bd35: Internal refactor to break potential circular imports +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + +## 0.1.63-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + ## 0.1.63-next.1 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 693534bfde..535833a466 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-config-schema", - "version": "0.1.63-next.1", + "version": "0.1.64-next.0", "description": "A Backstage plugin that lets you browse the configuration schema of your app", "backstage": { "role": "frontend-plugin", diff --git a/plugins/config-schema/src/components/SchemaView/ArrayView.tsx b/plugins/config-schema/src/components/SchemaView/ArrayView.tsx deleted file mode 100644 index abe2cfc327..0000000000 --- a/plugins/config-schema/src/components/SchemaView/ArrayView.tsx +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Box from '@material-ui/core/Box'; -import Typography from '@material-ui/core/Typography'; -import { Schema } from 'jsonschema'; -import React from 'react'; -import { ChildView } from './ChildView'; -import { MetadataView } from './MetadataView'; -import { SchemaViewProps } from './types'; - -export function ArrayView({ path, depth, schema }: SchemaViewProps) { - const itemDepth = depth + 1; - const itemPath = path ? `${path}[]` : '[]'; - const itemSchema = schema.items; - - return ( - <> - - {schema.description && ( - - {schema.description} - - )} - - - Items - - {schema.additionalItems && schema.additionalItems !== true && ( - <> - Additional Items - - - )} - - ); -} diff --git a/plugins/config-schema/src/components/SchemaView/ChildView.tsx b/plugins/config-schema/src/components/SchemaView/ChildView.tsx deleted file mode 100644 index b39e445688..0000000000 --- a/plugins/config-schema/src/components/SchemaView/ChildView.tsx +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { JsonValue } from '@backstage/types'; -import Box from '@material-ui/core/Box'; -import Chip from '@material-ui/core/Chip'; -import Divider from '@material-ui/core/Divider'; -import Typography from '@material-ui/core/Typography'; -import { makeStyles } from '@material-ui/core/styles'; -import { Schema } from 'jsonschema'; -import React, { useEffect, useRef } from 'react'; -import { useScrollTargets } from '../ScrollTargetsContext/ScrollTargetsContext'; -import { SchemaView } from './SchemaView'; - -export interface MetadataViewRowProps { - label: string; - text?: string; - data?: JsonValue; -} - -function titleVariant(depth: number) { - if (depth <= 1) { - return 'h2'; - } else if (depth === 2) { - return 'h3'; - } else if (depth === 3) { - return 'h4'; - } else if (depth === 4) { - return 'h5'; - } - return 'h6'; -} - -const useChildViewStyles = makeStyles(theme => ({ - title: { - marginBottom: 0, - }, - chip: { - marginLeft: theme.spacing(1), - marginRight: 0, - marginBottom: 0, - }, -})); - -export function ChildView({ - path, - depth, - schema, - required, - lastChild, -}: { - path: string; - depth: number; - schema?: Schema; - required?: boolean; - lastChild?: boolean; -}) { - const classes = useChildViewStyles(); - const titleRef = useRef(null); - const scroll = useScrollTargets(); - - useEffect(() => { - return scroll?.setScrollListener(path, () => { - titleRef.current?.scrollIntoView({ behavior: 'smooth' }); - }); - }, [scroll, path]); - - const chips = new Array(); - const chipProps = { size: 'small' as const, classes: { root: classes.chip } }; - - if (required) { - chips.push( - , - ); - } - - const visibility = (schema as { visibility?: string })?.visibility; - if (visibility === 'frontend') { - chips.push( - , - ); - } else if (visibility === 'secret') { - chips.push( - , - ); - } - - return ( - - - - - - {path} - - {chips.length > 0 && } - {chips} - - {schema && ( - - )} - - - ); -} diff --git a/plugins/config-schema/src/components/SchemaView/MatchView.tsx b/plugins/config-schema/src/components/SchemaView/MatchView.tsx deleted file mode 100644 index ba97ff9db5..0000000000 --- a/plugins/config-schema/src/components/SchemaView/MatchView.tsx +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import Typography from '@material-ui/core/Typography'; -import { Schema } from 'jsonschema'; -import React from 'react'; -import { ChildView } from './ChildView'; - -export function MatchView({ - path, - depth, - schema, - label, -}: { - path: string; - depth: number; - schema: Schema[]; - label: string; -}) { - return ( - <> - {label} - {schema.map((optionSchema, index) => ( - - ))} - - ); -} diff --git a/plugins/config-schema/src/components/SchemaView/MetadataView.tsx b/plugins/config-schema/src/components/SchemaView/MetadataView.tsx deleted file mode 100644 index f3de041bed..0000000000 --- a/plugins/config-schema/src/components/SchemaView/MetadataView.tsx +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { JsonValue } from '@backstage/types'; -import Paper from '@material-ui/core/Paper'; -import Table from '@material-ui/core/Table'; -import TableBody from '@material-ui/core/TableBody'; -import TableCell from '@material-ui/core/TableCell'; -import TableRow from '@material-ui/core/TableRow'; -import Typography from '@material-ui/core/Typography'; -import { Schema } from 'jsonschema'; -import React from 'react'; - -export interface MetadataViewRowProps { - label: string; - text?: string; - data?: JsonValue; -} - -export function MetadataViewRow({ label, text, data }: MetadataViewRowProps) { - if (text === undefined && data === undefined) { - return null; - } - return ( - - - - {label} - - - - - {data ? JSON.stringify(data) : text} - - - - ); -} - -export function MetadataView({ schema }: { schema: Schema }) { - return ( - -
- - - - {schema.additionalProperties === true && ( - - )} - {schema.additionalItems === true && ( - - )} - - - - - - - - - - - - - - - -
- - ); -} diff --git a/plugins/config-schema/src/components/SchemaView/ObjectView.tsx b/plugins/config-schema/src/components/SchemaView/ObjectView.tsx deleted file mode 100644 index c7cf000e10..0000000000 --- a/plugins/config-schema/src/components/SchemaView/ObjectView.tsx +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Box from '@material-ui/core/Box'; -import Typography from '@material-ui/core/Typography'; -import React from 'react'; -import { ChildView } from './ChildView'; -import { MetadataView } from './MetadataView'; -import { SchemaViewProps } from './types'; - -function isRequired(name: string, required?: boolean | string[]) { - if (required === true) { - return true; - } - if (Array.isArray(required)) { - return required.includes(name); - } - return false; -} - -export function ObjectView({ path, depth, schema }: SchemaViewProps) { - const properties = Object.entries(schema.properties ?? {}); - const patternProperties = Object.entries(schema.patternProperties ?? {}); - - return ( - <> - {depth > 0 && ( - - {schema.description && ( - - {schema.description} - - )} - - - )} - {properties.length > 0 && ( - <> - {depth > 0 && Properties} - {properties.map(([name, propSchema], index) => ( - - ))} - - )} - {patternProperties.length > 0 && ( - <> - {depth > 0 && ( - Pattern Properties - )} - {patternProperties.map(([name, propSchema], index) => ( - ` : name} - depth={depth + 1} - schema={propSchema} - lastChild={index === patternProperties.length - 1} - required={isRequired(name, schema.required)} - /> - ))} - - )} - {schema.additionalProperties && schema.additionalProperties !== true && ( - <> - Additional Properties - - - )} - - ); -} diff --git a/plugins/config-schema/src/components/SchemaView/ScalarView.tsx b/plugins/config-schema/src/components/SchemaView/ScalarView.tsx deleted file mode 100644 index aeea1c04d7..0000000000 --- a/plugins/config-schema/src/components/SchemaView/ScalarView.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Box from '@material-ui/core/Box'; -import Typography from '@material-ui/core/Typography'; -import React from 'react'; -import { MetadataView } from './MetadataView'; -import { SchemaViewProps } from './types'; - -export function ScalarView({ schema }: SchemaViewProps) { - return ( - <> - {schema.description && ( - - {schema.description} - - )} - - - ); -} diff --git a/plugins/config-schema/src/components/SchemaView/SchemaView.tsx b/plugins/config-schema/src/components/SchemaView/SchemaView.tsx index defb7fc353..d7a8db4f69 100644 --- a/plugins/config-schema/src/components/SchemaView/SchemaView.tsx +++ b/plugins/config-schema/src/components/SchemaView/SchemaView.tsx @@ -14,11 +14,20 @@ * limitations under the License. */ -import React from 'react'; -import { ArrayView } from './ArrayView'; -import { MatchView } from './MatchView'; -import { ObjectView } from './ObjectView'; -import { ScalarView } from './ScalarView'; +import { JsonValue } from '@backstage/types'; +import Box from '@material-ui/core/Box'; +import Chip from '@material-ui/core/Chip'; +import Divider from '@material-ui/core/Divider'; +import Paper from '@material-ui/core/Paper'; +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableRow from '@material-ui/core/TableRow'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; +import { Schema } from 'jsonschema'; +import React, { useEffect, useRef } from 'react'; +import { useScrollTargets } from '../ScrollTargetsContext/ScrollTargetsContext'; import { SchemaViewProps } from './types'; export function SchemaView(props: SchemaViewProps) { @@ -60,3 +69,337 @@ export function SchemaView(props: SchemaViewProps) { return ; } } + +function ArrayView({ path, depth, schema }: SchemaViewProps) { + const itemDepth = depth + 1; + const itemPath = path ? `${path}[]` : '[]'; + const itemSchema = schema.items; + + return ( + <> + + {schema.description && ( + + {schema.description} + + )} + + + Items + + {schema.additionalItems && schema.additionalItems !== true && ( + <> + Additional Items + + + )} + + ); +} + +function isRequired(name: string, required?: boolean | string[]) { + if (required === true) { + return true; + } + if (Array.isArray(required)) { + return required.includes(name); + } + return false; +} + +function ObjectView({ path, depth, schema }: SchemaViewProps) { + const properties = Object.entries(schema.properties ?? {}); + const patternProperties = Object.entries(schema.patternProperties ?? {}); + + return ( + <> + {depth > 0 && ( + + {schema.description && ( + + {schema.description} + + )} + + + )} + {properties.length > 0 && ( + <> + {depth > 0 && Properties} + {properties.map(([name, propSchema], index) => ( + + ))} + + )} + {patternProperties.length > 0 && ( + <> + {depth > 0 && ( + Pattern Properties + )} + {patternProperties.map(([name, propSchema], index) => ( + ` : name} + depth={depth + 1} + schema={propSchema} + lastChild={index === patternProperties.length - 1} + required={isRequired(name, schema.required)} + /> + ))} + + )} + {schema.additionalProperties && schema.additionalProperties !== true && ( + <> + Additional Properties + + + )} + + ); +} + +interface MetadataViewRowProps { + label: string; + text?: string; + data?: JsonValue; +} + +function titleVariant(depth: number) { + if (depth <= 1) { + return 'h2'; + } else if (depth === 2) { + return 'h3'; + } else if (depth === 3) { + return 'h4'; + } else if (depth === 4) { + return 'h5'; + } + return 'h6'; +} + +const useChildViewStyles = makeStyles(theme => ({ + title: { + marginBottom: 0, + }, + chip: { + marginLeft: theme.spacing(1), + marginRight: 0, + marginBottom: 0, + }, +})); + +function ChildView({ + path, + depth, + schema, + required, + lastChild, +}: { + path: string; + depth: number; + schema?: Schema; + required?: boolean; + lastChild?: boolean; +}) { + const classes = useChildViewStyles(); + const titleRef = useRef(null); + const scroll = useScrollTargets(); + + useEffect(() => { + return scroll?.setScrollListener(path, () => { + titleRef.current?.scrollIntoView({ behavior: 'smooth' }); + }); + }, [scroll, path]); + + const chips = new Array(); + const chipProps = { size: 'small' as const, classes: { root: classes.chip } }; + + if (required) { + chips.push( + , + ); + } + + const visibility = (schema as { visibility?: string })?.visibility; + if (visibility === 'frontend') { + chips.push( + , + ); + } else if (visibility === 'secret') { + chips.push( + , + ); + } + + return ( + + + + + + {path} + + {chips.length > 0 && } + {chips} + + {schema && ( + + )} + + + ); +} + +function MatchView({ + path, + depth, + schema, + label, +}: { + path: string; + depth: number; + schema: Schema[]; + label: string; +}) { + return ( + <> + {label} + {schema.map((optionSchema, index) => ( + + ))} + + ); +} + +function ScalarView({ schema }: SchemaViewProps) { + return ( + <> + {schema.description && ( + + {schema.description} + + )} + + + ); +} + +interface MetadataViewRowProps { + label: string; + text?: string; + data?: JsonValue; +} + +function MetadataViewRow({ label, text, data }: MetadataViewRowProps) { + if (text === undefined && data === undefined) { + return null; + } + return ( + + + + {label} + + + + + {data ? JSON.stringify(data) : text} + + + + ); +} + +function MetadataView({ schema }: { schema: Schema }) { + return ( + + + + + + {schema.additionalProperties === true && ( + + )} + {schema.additionalItems === true && ( + + )} + + + + + + + + + + + + + + + +
+
+ ); +} diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md index 26b7e591fa..156a108e6e 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,76 @@ # @backstage/plugin-devtools-backend +## 0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/config-loader@1.9.5-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-devtools-common@0.1.15-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/cli-common@0.1.15 + +## 0.5.1-next.0 + +### Patch Changes + +- ec547b8: Remove the error handler middleware, since that is now provided by the framework +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/config-loader@1.9.5-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-devtools-common@0.1.14 + - @backstage/plugin-permission-common@0.8.3 + +## 0.5.0 + +### Minor Changes + +- c781a9a: **BREAKING** Removed support for what is known as the legacy backend, please use the New Backend System. + +### Patch Changes + +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/config-loader@1.9.3 + - @backstage/errors@1.2.6 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-devtools-common@0.1.14 + - @backstage/plugin-permission-common@0.8.3 + +## 0.5.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/config-loader@1.9.3-next.1 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-devtools-common@0.1.14-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.5.0-next.1 ### Minor Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index 956858b0e6..1ecb6c3d05 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.5.0-next.1", + "version": "0.5.1-next.1", "backstage": { "role": "backend-plugin", "pluginId": "devtools", diff --git a/plugins/devtools-backend/src/service/router.ts b/plugins/devtools-backend/src/service/router.ts index adcb79c4cd..ad77495b36 100644 --- a/plugins/devtools-backend/src/service/router.ts +++ b/plugins/devtools-backend/src/service/router.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { AuthorizeResult } from '@backstage/plugin-permission-common'; import { devToolsConfigReadPermission, @@ -20,7 +21,6 @@ import { devToolsInfoReadPermission, devToolsPermissions, } from '@backstage/plugin-devtools-common'; - import { DevToolsBackendApi } from '../api'; import { NotAllowedError } from '@backstage/errors'; import Router from 'express-promise-router'; @@ -33,7 +33,6 @@ import { PermissionsService, RootConfigService, } from '@backstage/backend-plugin-api'; -import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter'; /** * @internal @@ -121,8 +120,5 @@ export async function createRouter( response.status(200).json(health); }); - const middleware = MiddlewareFactory.create({ logger, config }); - - router.use(middleware.error()); return router; } diff --git a/plugins/devtools-common/CHANGELOG.md b/plugins/devtools-common/CHANGELOG.md index bfbe305c18..29340a093d 100644 --- a/plugins/devtools-common/CHANGELOG.md +++ b/plugins/devtools-common/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-devtools-common +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.1.13 ### Patch Changes diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index cc62fd1d07..07151a2819 100644 --- a/plugins/devtools-common/package.json +++ b/plugins/devtools-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-common", - "version": "0.1.13", + "version": "0.1.15-next.0", "description": "Common functionalities for the devtools plugin", "backstage": { "role": "common-library", diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index 2d6fba2c73..89c111fe17 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/plugin-devtools +## 0.1.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-devtools-common@0.1.15-next.0 + +## 0.1.22 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-devtools-common@0.1.14 + - @backstage/plugin-permission-react@0.4.29 + +## 0.1.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-devtools-common@0.1.14-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + ## 0.1.22-next.1 ### Patch Changes diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index a5530c7eae..fe7b9b4ad8 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.22-next.1", + "version": "0.1.23-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "devtools", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index cf813ac02c..78daf43ea1 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.4.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.4.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.4.6-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 4fa57975a7..f6df586632 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.4.6-next.1", + "version": "0.4.7-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 80c6a9b182..8ad191a016 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-events-backend-module-azure +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index c3cecf42b8..0cba4a8c15 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.2.15-next.1", + "version": "0.2.16-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 0185dd7118..9e6a2ba709 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index 71c38bd05c..7e46e34778 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.2.15-next.1", + "version": "0.2.16-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index 26be191dc7..900e474ad4 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index b78c285780..18943476dd 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.2.15-next.1", + "version": "0.2.16-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index 8a37152557..0d9ca3bd96 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-events-backend-module-github +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 112309cf33..aa591f7a8d 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.2.15-next.1", + "version": "0.2.16-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index 707ee4f953..2d90696d77 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index d20065f195..5ebb4ee13c 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.2.15-next.1", + "version": "0.2.16-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index 6b616e2346..f74a52ed21 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.40-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.7-next.1 + +## 0.1.40-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.1.39 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.6 + +## 0.1.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.6-next.2 + ## 0.1.39-next.1 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 2f3f5e1980..69d53122c9 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-test-utils", - "version": "0.1.39-next.1", + "version": "0.1.40-next.1", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", "backstage": { "role": "node-library", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index dc65db0745..49543a6e0b 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,65 @@ # @backstage/plugin-events-backend +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-openapi-utils@0.4.1-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 0.4.1-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/backend-openapi-utils@0.4.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.4.0 + +### Minor Changes + +- 384e494: Internal updates to generated code. + +### 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.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/backend-openapi-utils@0.4.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.4.0-next.1 ### Minor Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 68f0a0ed62..06bf20ef49 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.4.0-next.1", + "version": "0.4.1-next.1", "backstage": { "role": "backend-plugin", "pluginId": "events", diff --git a/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.test.ts b/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.test.ts index 32a24de169..16f36d6b0a 100644 --- a/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.test.ts +++ b/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.test.ts @@ -21,6 +21,12 @@ import Router from 'express-promise-router'; import request from 'supertest'; import { HttpPostIngressEventPublisher } from './HttpPostIngressEventPublisher'; import { mockServices } from '@backstage/backend-test-utils'; +import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter'; + +const middleware = MiddlewareFactory.create({ + logger: mockServices.logger.mock(), + config: mockServices.rootConfig(), +}); describe('HttpPostIngressEventPublisher', () => { const logger = mockServices.logger.mock(); @@ -110,6 +116,7 @@ describe('HttpPostIngressEventPublisher', () => { logger, }); publisher.bind(router); + router.use(middleware.error()); const response = await request(app) .post('/http/testA') @@ -124,7 +131,7 @@ describe('HttpPostIngressEventPublisher', () => { 'Failed to retrieve raw body from incoming event for topic testA; not a buffer: object', name: 'Error', }, - request: { method: 'POST', url: '/testA' }, + request: { method: 'POST', url: '/http/testA' }, response: { statusCode: 500 }, }), ); @@ -149,6 +156,7 @@ describe('HttpPostIngressEventPublisher', () => { logger, }); publisher.bind(router); + router.use(middleware.error()); const response = await request(app) .post('/http/testA') @@ -163,7 +171,7 @@ describe('HttpPostIngressEventPublisher', () => { name: 'UnsupportedCharsetError', statusCode: 415, }, - request: { method: 'POST', url: '/testA' }, + request: { method: 'POST', url: '/http/testA' }, response: { statusCode: 415 }, }), ); @@ -188,6 +196,7 @@ describe('HttpPostIngressEventPublisher', () => { logger, }); publisher.bind(router); + router.use(middleware.error()); const response = await request(app) .post('/http/testA') @@ -202,7 +211,7 @@ describe('HttpPostIngressEventPublisher', () => { name: 'UnsupportedMediaTypeError', statusCode: 415, }, - request: { method: 'POST', url: '/testA' }, + request: { method: 'POST', url: '/http/testA' }, response: { statusCode: 415 }, }), ); diff --git a/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.ts b/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.ts index fe17186856..806247e870 100644 --- a/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.ts +++ b/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { errorHandler } from '@backstage/backend-common'; import { LoggerService } from '@backstage/backend-plugin-api'; import { Config } from '@backstage/config'; import { CustomErrorBase } from '@backstage/errors'; @@ -97,7 +96,6 @@ export class HttpPostIngressEventPublisher { this.addRouteForTopic(router, topic, ingresses[topic].validator), ); - router.use(errorHandler()); return router; } diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index 4867d7c155..095c2e2e4e 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-events-node +## 0.4.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + +## 0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 0.4.6 + +### 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.1.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/types@1.2.0 + ## 0.4.6-next.1 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index ece517490c..99acc474e0 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-node", - "version": "0.4.6-next.1", + "version": "0.4.7-next.1", "description": "The plugin-events-node module for @backstage/plugin-events-backend", "backstage": { "role": "node-library", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index 9bbed12b56..215919311a 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,41 @@ # @internal/plugin-todo-list-backend +## 1.0.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 1.0.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + +## 1.0.34 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + +## 1.0.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + ## 1.0.34-next.1 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 0c3308584e..5aa5071492 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.34-next.1", + "version": "1.0.35-next.1", "backstage": { "role": "backend-plugin", "pluginId": "todo-list", diff --git a/plugins/example-todo-list-backend/src/service/router.ts b/plugins/example-todo-list-backend/src/service/router.ts index abadbbb4d9..9ff4c6e91b 100644 --- a/plugins/example-todo-list-backend/src/service/router.ts +++ b/plugins/example-todo-list-backend/src/service/router.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { errorHandler } from '@backstage/backend-common'; import express from 'express'; import Router from 'express-promise-router'; import { add, getAll, update } from './todos'; @@ -75,7 +74,6 @@ export async function createRouter( res.json(update(req.body)); }); - router.use(errorHandler()); return router; } diff --git a/plugins/example-todo-list-common/CHANGELOG.md b/plugins/example-todo-list-common/CHANGELOG.md index be5d7d5096..22793e6d9e 100644 --- a/plugins/example-todo-list-common/CHANGELOG.md +++ b/plugins/example-todo-list-common/CHANGELOG.md @@ -1,5 +1,26 @@ # @internal/plugin-todo-list-common +## 1.0.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.4-next.0 + +## 1.0.23 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3 + +## 1.0.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.0.22 ### Patch Changes diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index f9a310ba6c..e2d62d8caf 100644 --- a/plugins/example-todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-common", - "version": "1.0.22", + "version": "1.0.24-next.0", "backstage": { "role": "common-library", "pluginId": "todo-list", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index ba8d7ca11a..8846473b5f 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,29 @@ # @internal/plugin-todo-list +## 1.0.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + +## 1.0.34 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + +## 1.0.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + ## 1.0.34-next.1 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index fda1df0094..d1e467c03c 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.34-next.1", + "version": "1.0.35-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "todo-list", diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md index 044b35eeda..a0919210f9 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-home-react +## 0.1.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + +## 0.1.22-next.0 + +### Patch Changes + +- d8f9079: Updated dependency `@rjsf/utils` to `5.23.2`. + Updated dependency `@rjsf/core` to `5.23.2`. + Updated dependency `@rjsf/material-ui` to `5.23.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.2`. + +## 0.1.21 + +### 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 + - @backstage/core-plugin-api@1.10.2 + +## 0.1.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + ## 0.1.21-next.1 ### Patch Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index c8ae406c91..51679b21c8 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home-react", - "version": "0.1.21-next.1", + "version": "0.1.22-next.1", "description": "A Backstage plugin that contains react components helps you build a home page", "backstage": { "role": "web-library", @@ -46,7 +46,7 @@ "@backstage/core-plugin-api": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@rjsf/utils": "5.23.1" + "@rjsf/utils": "5.23.2" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 5479623747..b20b9e5b77 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,132 @@ # @backstage/plugin-home +## 0.8.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-home-react@0.1.22-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/theme@0.6.3 + +## 0.8.4-next.1 + +### Patch Changes + +- d8f9079: Updated dependency `@rjsf/utils` to `5.23.2`. + Updated dependency `@rjsf/core` to `5.23.2`. + Updated dependency `@rjsf/material-ui` to `5.23.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.2`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-home-react@0.1.22-next.0 + - @backstage/core-compat-api@0.3.4 + +## 0.8.4-next.0 + +### Patch Changes + +- 7932f1e: Exported `QuickStartCard` component. +- Updated dependencies + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-app-api@1.15.3 + - @backstage/core-compat-api@0.3.4 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-home-react@0.1.21 + +## 0.8.3 + +### 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) + +- 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-catalog-react@1.15.0 + - @backstage/core-app-api@1.15.3 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-home-react@0.1.21 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + +## 0.8.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-home-react@0.1.21-next.2 + ## 0.8.3-next.1 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 9b8efd2335..7d3b35d40a 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home", - "version": "0.8.3-next.1", + "version": "0.8.4-next.2", "description": "A Backstage plugin that helps you build a home page", "backstage": { "role": "frontend-plugin", @@ -70,10 +70,10 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", - "@rjsf/core": "5.23.1", - "@rjsf/material-ui": "5.23.1", - "@rjsf/utils": "5.23.1", - "@rjsf/validator-ajv8": "5.23.1", + "@rjsf/core": "5.23.2", + "@rjsf/material-ui": "5.23.2", + "@rjsf/utils": "5.23.2", + "@rjsf/validator-ajv8": "5.23.2", "lodash": "^4.17.21", "luxon": "^3.4.3", "react-grid-layout": "1.3.4", diff --git a/plugins/home/report.api.md b/plugins/home/report.api.md index 878d8ef646..1cff56f50c 100644 --- a/plugins/home/report.api.md +++ b/plugins/home/report.api.md @@ -187,6 +187,11 @@ export type LayoutConfiguration = { // @public export type Operators = '<' | '<=' | '==' | '!=' | '>' | '>=' | 'contains'; +// @public +export const QuickStartCard: ( + props: CardExtensionProps_2, +) => JSX_2.Element; + // @public export type QuickStartCardProps = { modalTitle?: string | React_2.JSX.Element; diff --git a/plugins/home/src/index.ts b/plugins/home/src/index.ts index 154186f169..3a6f152d03 100644 --- a/plugins/home/src/index.ts +++ b/plugins/home/src/index.ts @@ -35,6 +35,7 @@ export { HomePageTopVisited, HomePageRecentlyVisited, FeaturedDocsCard, + QuickStartCard, } from './plugin'; export * from './components'; export * from './assets'; diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 23a4dbc6a3..f18719e721 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,83 @@ # @backstage/plugin-kubernetes-backend +## 0.19.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + - @backstage/plugin-kubernetes-node@0.2.2-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/catalog-client@1.9.1-next.0 + +## 0.19.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.1 + - @backstage/plugin-kubernetes-node@0.2.2-next.0 + - @backstage/plugin-permission-common@0.8.3 + +## 0.19.1 + +### Patch Changes + +- cbfc69e: Create a `dev/index.ts` entrypoint for `yarn start` +- 928db6a: Support fetch pod metrics with custom resources +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/errors@1.2.6 + - @backstage/plugin-kubernetes-node@0.2.1 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1 + - @backstage/plugin-permission-common@0.8.3 + +## 0.19.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-kubernetes-node@0.2.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.19.1-next.1 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 59b9c4c300..42261edf90 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-backend", - "version": "0.19.1-next.1", + "version": "0.19.2-next.1", "description": "A Backstage backend plugin that integrates towards Kubernetes", "backstage": { "role": "backend-plugin", diff --git a/plugins/kubernetes-backend/src/routes/resourceRoutes.test.ts b/plugins/kubernetes-backend/src/routes/resourceRoutes.test.ts index 01da602232..7ace17e805 100644 --- a/plugins/kubernetes-backend/src/routes/resourceRoutes.test.ts +++ b/plugins/kubernetes-backend/src/routes/resourceRoutes.test.ts @@ -169,7 +169,7 @@ describe('resourcesRoutes', () => { error: { name: 'InputError', message: 'entity is a required field' }, request: { method: 'POST', - url: '/api/kubernetes/resources/workloads/query', + url: '/resources/workloads/query', }, response: { statusCode: 400 }, }); @@ -193,7 +193,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/workloads/query', + url: '/resources/workloads/query', }, response: { statusCode: 400 }, }); @@ -216,7 +216,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/workloads/query', + url: '/resources/workloads/query', }, response: { statusCode: 400 }, }); @@ -240,7 +240,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/workloads/query', + url: '/resources/workloads/query', }, response: { statusCode: 401 }, }); @@ -264,7 +264,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/workloads/query', + url: '/resources/workloads/query', }, response: { statusCode: 401 }, }); @@ -287,7 +287,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/workloads/query', + url: '/resources/workloads/query', }, response: { statusCode: 500 }, }); @@ -346,7 +346,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/custom/query', + url: '/resources/custom/query', }, response: { statusCode: 400 }, }); @@ -370,7 +370,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/custom/query', + url: '/resources/custom/query', }, response: { statusCode: 400 }, }); @@ -394,7 +394,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/custom/query', + url: '/resources/custom/query', }, response: { statusCode: 400 }, }); @@ -420,7 +420,7 @@ describe('resourcesRoutes', () => { error: { name: 'InputError', message: 'entity is a required field' }, request: { method: 'POST', - url: '/api/kubernetes/resources/custom/query', + url: '/resources/custom/query', }, response: { statusCode: 400 }, }); @@ -451,7 +451,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/custom/query', + url: '/resources/custom/query', }, response: { statusCode: 400 }, }); @@ -481,7 +481,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/custom/query', + url: '/resources/custom/query', }, response: { statusCode: 400 }, }); @@ -512,7 +512,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/custom/query', + url: '/resources/custom/query', }, response: { statusCode: 401 }, }); @@ -543,7 +543,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/custom/query', + url: '/resources/custom/query', }, response: { statusCode: 401 }, }); @@ -573,7 +573,7 @@ describe('resourcesRoutes', () => { }, request: { method: 'POST', - url: '/api/kubernetes/resources/custom/query', + url: '/resources/custom/query', }, response: { statusCode: 500 }, }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts index 3491268d39..ac6a59a7c4 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts @@ -31,6 +31,7 @@ import { registerMswTestHooks, } from '@backstage/backend-test-utils'; import { + CustomResourceFetchResponse, FetchResponse, KubernetesRequestAuth, ObjectsByEntityResponse, @@ -1428,5 +1429,78 @@ describe('KubernetesFanOutHandler', () => { }), ); }); + it('fetch pod metrics when pods used', async () => { + getClustersByEntity.mockImplementation(() => + Promise.resolve({ + clusters: [ + { + name: 'test-cluster', + title: 'cluster-title', + url: '', + authMetadata: {}, + }, + ], + }), + ); + + sut = getKubernetesFanOutHandler([]); + + const resources: CustomResourceFetchResponse[] = [ + { + type: 'customresources', + resources: [ + { + apiVersion: 'v1', + kind: 'Pod', + metadata: { + namespace: `ns-test-component-test-cluster`, + }, + }, + ], + }, + ]; + + fetchObjectsForService.mockImplementation(async () => ({ + responses: resources, + errors: [], + })); + + const result = await sut.getCustomResourcesByEntity( + { + entity, + auth: {}, + customResources: [ + { + group: '', + apiVersion: 'v1', + plural: 'pods', + }, + ], + }, + { credentials: mockCredentials }, + ); + + expect(fetchObjectsForService).toHaveBeenCalledTimes(1); + expect(fetchPodMetricsByNamespaces).toHaveBeenCalledTimes(1); + expect(fetchPodMetricsByNamespaces).toHaveBeenCalledWith( + expect.anything(), + { type: 'anonymous' }, + new Set(['ns-test-component-test-cluster']), + expect.anything(), + ); + expect(result).toStrictEqual({ + items: [ + { + cluster: { + name: 'test-cluster', + title: 'cluster-title', + }, + errors: [], + podMetrics: [POD_METRICS_FIXTURE], + resources, + }, + ], + }); + }); }); }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 54a038fffd..31c0c91807 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -147,7 +147,11 @@ export interface KubernetesFanOutHandlerOptions export interface KubernetesRequestBody extends ObjectsByEntityRequest {} const isPodFetchResponse = (fr: FetchResponse): fr is PodFetchResponse => - fr.type === 'pods'; + fr.type === 'pods' || + (fr.type === 'customresources' && + fr.resources.length > 0 && + fr.resources[0].apiVersion === 'v1' && + fr.resources[0].kind === 'Pod'); const isString = (str: string | undefined): str is string => str !== undefined; const numberOrBigIntToNumberOrString = ( diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index e7b1d027a0..3ed8b25c56 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -16,17 +16,13 @@ import 'buffer'; import { resolve as resolvePath } from 'path'; -import { errorHandler } from '@backstage/backend-common'; import { createMockDirectory, mockServices, registerMswTestHooks, } from '@backstage/backend-test-utils'; import { NotFoundError } from '@backstage/errors'; -import { - AuthorizeResult, - PermissionEvaluator, -} from '@backstage/plugin-permission-common'; +import { AuthorizeResult } from '@backstage/plugin-permission-common'; import { ANNOTATION_KUBERNETES_AUTH_PROVIDER, KubernetesRequestAuth, @@ -55,10 +51,13 @@ import { } from './KubernetesProxy'; import type { Request } from 'express'; -import { - BackstageCredentials, - DiscoveryService, -} from '@backstage/backend-plugin-api'; +import { BackstageCredentials } from '@backstage/backend-plugin-api'; +import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter'; + +const middleware = MiddlewareFactory.create({ + logger: mockServices.logger.mock(), + config: mockServices.rootConfig(), +}); const mockCertDir = createMockDirectory({ content: { @@ -79,15 +78,8 @@ describe('KubernetesProxy', () => { >(), }; - const permissionApi: jest.Mocked = { - authorize: jest.fn(), - authorizeConditional: jest.fn(), - }; - - const mockDisocveryApi: jest.Mocked = { - getBaseUrl: jest.fn(), - getExternalBaseUrl: jest.fn(), - }; + const permissionApi = mockServices.permissions.mock(); + const mockDisocveryApi = mockServices.discovery.mock(); registerMswTestHooks(worker); @@ -130,7 +122,7 @@ describe('KubernetesProxy', () => { const app = express().use( Router() .use(proxyPath, proxy.createRequestHandler({ permissionApi })) - .use(errorHandler()), + .use(middleware.error()), ); const requestPromise = request(app).get(proxyPath + requestPath); @@ -937,7 +929,7 @@ describe('KubernetesProxy', () => { .use( Router() .use(proxyPath, proxy.createRequestHandler({ permissionApi })) - .use(errorHandler()), + .use(middleware.error()), ) .listen(0, '0.0.0.0', () => { proxyPort = (expressServer.address() as AddressInfo).port; diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index f25cba07f4..e2b03ebe10 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-kubernetes-react@0.5.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + +## 0.0.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + +## 0.0.20 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-kubernetes-common@0.9.1 + - @backstage/plugin-kubernetes-react@0.5.2 + +## 0.0.20-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-kubernetes-react@0.5.2-next.2 + ## 0.0.20-next.1 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index df03ec1321..30a05f16a7 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-cluster", - "version": "0.0.20-next.1", + "version": "0.0.21-next.1", "description": "A Backstage plugin that shows details of Kubernetes clusters", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 8766aa9e6d..20b0861e56 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-kubernetes-common +## 0.9.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## 0.9.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## 0.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.9.0 ### Minor Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index fe1bb5e154..ed7709b66c 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-common", - "version": "0.9.0", + "version": "0.9.2-next.0", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", "backstage": { "role": "common-library", diff --git a/plugins/kubernetes-node/CHANGELOG.md b/plugins/kubernetes-node/CHANGELOG.md index 812fb7218f..a92f835d11 100644 --- a/plugins/kubernetes-node/CHANGELOG.md +++ b/plugins/kubernetes-node/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-kubernetes-node +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1 + +## 0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/catalog-model@1.7.2 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1 + +## 0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + ## 0.2.1-next.1 ### Patch Changes diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index 1a23a35ef2..ed79366ffa 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-node", - "version": "0.2.1-next.1", + "version": "0.2.2-next.1", "description": "Node.js library for the kubernetes plugin", "backstage": { "role": "node-library", diff --git a/plugins/kubernetes-react/CHANGELOG.md b/plugins/kubernetes-react/CHANGELOG.md index a76a42894c..e2fa233c9d 100644 --- a/plugins/kubernetes-react/CHANGELOG.md +++ b/plugins/kubernetes-react/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-kubernetes-react +## 0.5.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + +## 0.5.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1 + +## 0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + ## 0.5.2-next.1 ### Patch Changes diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 101e903e3c..413278930e 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-react", - "version": "0.5.2-next.1", + "version": "0.5.3-next.0", "description": "Web library for the kubernetes-react plugin", "backstage": { "role": "web-library", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 513d5ec768..58a6054d0f 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,55 @@ # @backstage/plugin-kubernetes +## 0.12.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-kubernetes-react@0.5.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-kubernetes-common@0.9.2-next.0 + +## 0.12.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## 0.12.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-kubernetes-common@0.9.1 + - @backstage/plugin-kubernetes-react@0.5.2 + +## 0.12.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-kubernetes-common@0.9.1-next.0 + - @backstage/plugin-kubernetes-react@0.5.2-next.2 + ## 0.12.2-next.1 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 6336ff286d..9a71b5f302 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes", - "version": "0.12.2-next.1", + "version": "0.12.3-next.1", "description": "A Backstage plugin that integrates towards Kubernetes", "backstage": { "role": "frontend-plugin", diff --git a/plugins/notifications-backend-module-email/CHANGELOG.md b/plugins/notifications-backend-module-email/CHANGELOG.md index dab3c8b735..c129b4312c 100644 --- a/plugins/notifications-backend-module-email/CHANGELOG.md +++ b/plugins/notifications-backend-module-email/CHANGELOG.md @@ -1,5 +1,66 @@ # @backstage/plugin-notifications-backend-module-email +## 0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/plugin-notifications-node@0.2.11-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-notifications-common@0.0.8-next.0 + +## 0.3.5-next.0 + +### Patch Changes + +- bed5f35: Added more examples of the plugin configuration +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-notifications-node@0.2.11-next.0 + +## 0.3.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-notifications-node@0.2.10 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7 + +## 0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + ## 0.3.4-next.1 ### Patch Changes diff --git a/plugins/notifications-backend-module-email/README.md b/plugins/notifications-backend-module-email/README.md index 1defad74b4..3ccee8f1e8 100644 --- a/plugins/notifications-backend-module-email/README.md +++ b/plugins/notifications-backend-module-email/README.md @@ -24,13 +24,13 @@ export const notificationsModuleEmailDecorator = createBackendModule({ }, async init({ emailTemplates }) { emailTemplates.setTemplateRenderer({ - getSubject(notification) { + async getSubject(notification) { return `New notification from ${notification.source}`; }, - getText(notification) { + async getText(notification) { return notification.content; }, - getHtml(notification) { + async getHtml(notification) { return `

${notification.content}

`; }, }); @@ -54,19 +54,50 @@ notifications: secure: false username: 'my-username' password: 'my-password' + + # AWS SES + # transportConfig: + # transport: 'ses' + # accessKeyId: 'my-access-key + # region: 'us-west-2' + + # sendmail + # transportConfig: + # transport: 'sendmail' + # path: '/usr/sbin/sendmail' + # newline: 'unix' + # The email sender address sender: 'sender@mycompany.com' replyTo: 'no-reply@mycompany.com' - # Who to get email for broadcast notifications + # Who to send email for broadcast notifications broadcastConfig: receiver: 'users' # How many emails to send concurrently, defaults to 2 concurrencyLimit: 10 + # How much to throttle between emails, defaults to 100ms + throttleInterval: + seconds: 60 # Cache configuration for email addresses # This is to prevent unnecessary calls to the catalog cache: ttl: days: 1 + # Notification filter which this processor will handle + filter: + # Minimum severity of the notification to send email + minSeverity: high + # Maximum severity of the notification to send email + maxSeverity: critical + # Topics that are excluded from sending email + excludedTopics: + - scaffolder + # List of allowed email addresses to get notifications via email + allowlistEmailAddresses: + - john.doe@backstage.io + # List of denied email addresses to get notifications via email + denylistEmailAddresses: + - jane.doe@backstage.io ``` See `config.d.ts` for more options for configuration. diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json index e534053904..1eade8dbe8 100644 --- a/plugins/notifications-backend-module-email/package.json +++ b/plugins/notifications-backend-module-email/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-email", - "version": "0.3.4-next.1", + "version": "0.3.5-next.1", "description": "The email backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/notifications-backend/CHANGELOG.md b/plugins/notifications-backend/CHANGELOG.md index 9613b6c8d2..e4f0f2c359 100644 --- a/plugins/notifications-backend/CHANGELOG.md +++ b/plugins/notifications-backend/CHANGELOG.md @@ -1,5 +1,85 @@ # @backstage/plugin-notifications-backend +## 0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-signals-node@0.1.16-next.1 + - @backstage/plugin-notifications-node@0.2.11-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-notifications-common@0.0.8-next.0 + +## 0.5.1-next.0 + +### Patch Changes + +- cbc0e63: Remove `@backstage/backend-common` dependency +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-notifications-node@0.2.11-next.0 + - @backstage/plugin-signals-node@0.1.16-next.0 + +## 0.5.0 + +### Minor Changes + +- fc15b77: **BREAKING**: Removed redundant `/health` endpoint, switch to using [the built-in endpoint instead](https://backstage.io/docs/backend-system/core-services/root-health). + +### Patch Changes + +- fc15b77: Deprecated root '/' endpoints, moving them under `/notifications` instead. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-notifications-node@0.2.10 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-signals-node@0.1.15 + +## 0.5.0-next.2 + +### Minor Changes + +- fc15b77: **BREAKING**: Removed redundant `/health` endpoint, switch to using [the built-in endpoint instead](https://backstage.io/docs/backend-system/core-services/root-health). + +### Patch Changes + +- fc15b77: Deprecated root '/' endpoints, moving them under `/notifications` instead. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + ## 0.4.4-next.1 ### Patch Changes diff --git a/plugins/notifications-backend/README.md b/plugins/notifications-backend/README.md index a6b6615d9f..080f1e746b 100644 --- a/plugins/notifications-backend/README.md +++ b/plugins/notifications-backend/README.md @@ -29,5 +29,5 @@ To be able to do so, `external access` needs to be enabled as described in the [ Once the API can be accessed, the request can look like: ``` -curl -X POST [YOUR_SERVER_URL]/api/notifications -H "Content-Type: application/json" -H "Authorization: Bearer [BASE64_ENCODED_ACCESS_TOKEN]" -d '{"recipients":{"type":"entity","entityRef":"user:development/guest"},"payload": {"title": "Title of user-targeted external message","description": "The description","link": "http://foo.com/bar","severity": "high","topic": "The topic"}}' +curl -X POST [YOUR_SERVER_URL]/api/notifications/notifications -H "Content-Type: application/json" -H "Authorization: Bearer [BASE64_ENCODED_ACCESS_TOKEN]" -d '{"recipients":{"type":"entity","entityRef":"user:development/guest"},"payload": {"title": "Title of user-targeted external message","description": "The description","link": "http://foo.com/bar","severity": "high","topic": "The topic"}}' ``` diff --git a/plugins/notifications-backend/dev/index.ts b/plugins/notifications-backend/dev/index.ts index cee630d1ad..936c31f211 100644 --- a/plugins/notifications-backend/dev/index.ts +++ b/plugins/notifications-backend/dev/index.ts @@ -20,7 +20,6 @@ import { createBackendPlugin, } from '@backstage/backend-plugin-api'; import { notificationService } from '@backstage/plugin-notifications-node'; -import { errorHandler } from '@backstage/backend-common'; import { notificationSeverities, NotificationSeverity, @@ -96,7 +95,6 @@ const notificationsDebug = createBackendPlugin({ }); res.status(200).send({ status: 'ok' }); }); - router.use(errorHandler()); httpRouter.use(router); httpRouter.addAuthPolicy({ diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index e1e3519418..d0270ba3ff 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend", - "version": "0.4.4-next.1", + "version": "0.5.1-next.1", "backstage": { "role": "backend-plugin", "pluginId": "notifications", @@ -38,7 +38,6 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", diff --git a/plugins/notifications-backend/src/service/router.test.ts b/plugins/notifications-backend/src/service/router.test.ts index 470532b2dc..e557e5818d 100644 --- a/plugins/notifications-backend/src/service/router.test.ts +++ b/plugins/notifications-backend/src/service/router.test.ts @@ -14,33 +14,22 @@ * limitations under the License. */ -import { - DatabaseManager, - PluginDatabaseManager, -} from '@backstage/backend-common'; import express from 'express'; import request from 'supertest'; import { createRouter } from './router'; -import { ConfigReader } from '@backstage/config'; import { SignalsService } from '@backstage/plugin-signals-node'; -import { mockCredentials, mockServices } from '@backstage/backend-test-utils'; +import { + TestDatabases, + mockCredentials, + mockErrorHandler, + mockServices, +} from '@backstage/backend-test-utils'; import { NotificationSendOptions } from '@backstage/plugin-notifications-node'; import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; -function createDatabase(): PluginDatabaseManager { - return DatabaseManager.fromConfig( - new ConfigReader({ - backend: { - database: { - client: 'better-sqlite3', - connection: ':memory:', - }, - }, - }), - ).forPlugin('notifications'); -} - describe('createRouter', () => { + const databases = TestDatabases.create(); + let app: express.Express; const signalService: jest.Mocked = { @@ -58,9 +47,10 @@ describe('createRouter', () => { const catalog = catalogServiceMock(); beforeAll(async () => { + const knex = await databases.init('SQLITE_3'); const router = await createRouter({ logger: mockServices.logger.mock(), - database: createDatabase(), + database: { getClient: async () => knex }, signals: signalService, userInfo, config, @@ -68,26 +58,17 @@ describe('createRouter', () => { auth, catalog, }); - app = express().use(router); + app = express().use(router).use(mockErrorHandler()); }); beforeEach(() => { jest.resetAllMocks(); }); - describe('GET /health', () => { - it('returns ok', async () => { - const response = await request(app).get('/health'); - - expect(response.status).toEqual(200); - expect(response.body).toEqual({ status: 'ok' }); - }); - }); - - describe('POST /', () => { + describe('POST /notifications', () => { const sendNotification = async (data: NotificationSendOptions) => request(app) - .post('/') + .post('/notifications') .send(data) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts index 88cd1fd337..8a12a53be5 100644 --- a/plugins/notifications-backend/src/service/router.ts +++ b/plugins/notifications-backend/src/service/router.ts @@ -14,8 +14,7 @@ * limitations under the License. */ -import { errorHandler, PluginDatabaseManager } from '@backstage/backend-common'; -import express, { Request } from 'express'; +import express, { Request, Response } from 'express'; import Router from 'express-promise-router'; import { DatabaseNotificationsStore, @@ -31,6 +30,7 @@ import { import { InputError, NotFoundError } from '@backstage/errors'; import { AuthService, + DatabaseService, HttpAuthService, LoggerService, UserInfoService, @@ -53,7 +53,7 @@ import { Config } from '@backstage/config'; export interface RouterOptions { logger: LoggerService; config: Config; - database: PluginDatabaseManager; + database: DatabaseService; auth: AuthService; httpAuth: HttpAuthService; userInfo: UserInfoService; @@ -250,12 +250,7 @@ export async function createRouter( const router = Router(); router.use(express.json()); - router.get('/health', (_, response) => { - logger.info('PONG!'); - response.json({ status: 'ok' }); - }); - - router.get('/', async (req, res) => { + const listNotificationsHandler = async (req: Request, res: Response) => { const user = await getUser(req); const opts: NotificationGetOptions = { user: user, @@ -310,7 +305,10 @@ export async function createRouter( totalCount, notifications, }); - }); + }; + + router.get('/', listNotificationsHandler); // Deprecated endpoint + router.get('/notifications', listNotificationsHandler); router.get('/status', async (req: Request, res) => { const user = await getUser(req); @@ -345,8 +343,7 @@ export async function createRouter( }, ); - // Make sure this is the last "GET" handler - router.get('/:id', async (req, res) => { + const getNotificationHandler = async (req: Request, res: Response) => { const user = await getUser(req); const opts: NotificationGetOptions = { user: user, @@ -358,9 +355,13 @@ export async function createRouter( throw new NotFoundError('Not found'); } res.json(notifications[0]); - }); + }; - router.post('/update', async (req, res) => { + // Make sure this is the last "GET" handler + router.get('/:id', getNotificationHandler); // Deprecated endpoint + router.get('/notifications/:id', getNotificationHandler); + + const updateNotificationsHandler = async (req: Request, res: Response) => { const user = await getUser(req); const { ids, read, saved } = req.body; if (!ids || !Array.isArray(ids)) { @@ -397,7 +398,10 @@ export async function createRouter( const notifications = await store.getNotifications({ ids, user: user }); res.json(notifications); - }); + }; + + router.post('/update', updateNotificationsHandler); // Deprecated endpoint + router.post('/notifications/update', updateNotificationsHandler); const sendBroadcastNotification = async ( baseNotification: Omit, @@ -509,77 +513,79 @@ export async function createRouter( return notifications; }; - // Add new notification - router.post( - '/', - async (req: Request, res) => { - const credentials = await httpAuth.credentials(req, { - allow: ['service'], - }); + const createNotificationHandler = async ( + req: Request, + res: Response, + ) => { + const credentials = await httpAuth.credentials(req, { + allow: ['service'], + }); - const origin = credentials.principal.subject; - const opts = await processOptions(req.body, origin); - const { recipients, payload } = opts; - const { title, link } = payload; - const notifications: Notification[] = []; - let users = []; + const origin = credentials.principal.subject; + const opts = await processOptions(req.body, origin); + const { recipients, payload } = opts; + const { title, link } = payload; + const notifications: Notification[] = []; + let users = []; - if (!recipients || !title) { - logger.error(`Invalid notification request received`); - throw new InputError(`Invalid notification request received`); + if (!recipients || !title) { + logger.error(`Invalid notification request received`); + throw new InputError(`Invalid notification request received`); + } + + if (link) { + try { + validateLink(link); + } catch (e) { + throw new InputError('Invalid link provided', e); } + } - if (link) { - try { - validateLink(link); - } catch (e) { - throw new InputError('Invalid link provided', e); - } - } + const baseNotification = { + payload: { + ...payload, + severity: payload.severity ?? 'normal', + }, + origin, + created: new Date(), + }; - const baseNotification = { - payload: { - ...payload, - severity: payload.severity ?? 'normal', - }, + if (recipients.type === 'broadcast') { + const broadcast = await sendBroadcastNotification( + baseNotification, + opts, origin, - created: new Date(), - }; + ); + notifications.push(broadcast); + } else { + const entityRef = recipients.entityRef; - if (recipients.type === 'broadcast') { - const broadcast = await sendBroadcastNotification( - baseNotification, - opts, - origin, + try { + users = await getUsersForEntityRef( + entityRef, + recipients.excludeEntityRef ?? [], + { auth, catalogClient: catalog }, ); - notifications.push(broadcast); - } else { - const entityRef = recipients.entityRef; - - try { - users = await getUsersForEntityRef( - entityRef, - recipients.excludeEntityRef ?? [], - { auth, catalogClient: catalog }, - ); - } catch (e) { - logger.error(`Failed to resolve notification receivers: ${e}`); - throw new InputError('Failed to resolve notification receivers', e); - } - - const userNotifications = await sendUserNotifications( - baseNotification, - users, - opts, - origin, - ); - notifications.push(...userNotifications); + } catch (e) { + logger.error(`Failed to resolve notification receivers: ${e}`); + throw new InputError('Failed to resolve notification receivers', e); } - res.json(notifications); - }, - ); + const userNotifications = await sendUserNotifications( + baseNotification, + users, + opts, + origin, + ); + notifications.push(...userNotifications); + } + + res.json(notifications); + }; + + // Add new notification + router.post('/', createNotificationHandler); + router.post('/notifications', createNotificationHandler); - router.use(errorHandler()); return router; } diff --git a/plugins/notifications-common/CHANGELOG.md b/plugins/notifications-common/CHANGELOG.md index d5efc02e1a..74d6451ba6 100644 --- a/plugins/notifications-common/CHANGELOG.md +++ b/plugins/notifications-common/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-notifications-common +## 0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.2-next.0 + +## 0.0.7 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1 + +## 0.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + ## 0.0.6 ### Patch Changes diff --git a/plugins/notifications-common/package.json b/plugins/notifications-common/package.json index 3044b7fe9b..ade754154e 100644 --- a/plugins/notifications-common/package.json +++ b/plugins/notifications-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-common", - "version": "0.0.6", + "version": "0.0.8-next.0", "description": "Common functionalities for the notifications plugin", "backstage": { "role": "common-library", diff --git a/plugins/notifications-node/CHANGELOG.md b/plugins/notifications-node/CHANGELOG.md index 817dbda543..0615e6d528 100644 --- a/plugins/notifications-node/CHANGELOG.md +++ b/plugins/notifications-node/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-notifications-node +## 0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-signals-node@0.1.16-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-notifications-common@0.0.8-next.0 + +## 0.2.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-signals-node@0.1.16-next.0 + +## 0.2.10 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-signals-node@0.1.15 + +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + ## 0.2.10-next.1 ### Patch Changes diff --git a/plugins/notifications-node/package.json b/plugins/notifications-node/package.json index c330e0db58..0963a87efa 100644 --- a/plugins/notifications-node/package.json +++ b/plugins/notifications-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-node", - "version": "0.2.10-next.1", + "version": "0.2.11-next.1", "description": "Node.js library for the notifications plugin", "backstage": { "role": "node-library", diff --git a/plugins/notifications/CHANGELOG.md b/plugins/notifications/CHANGELOG.md index 111f59eab3..02fbdd3e4d 100644 --- a/plugins/notifications/CHANGELOG.md +++ b/plugins/notifications/CHANGELOG.md @@ -1,5 +1,52 @@ # @backstage/plugin-notifications +## 0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-signals-react@0.0.9-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/theme@0.6.3 + - @backstage/plugin-notifications-common@0.0.8-next.0 + +## 0.5.0 + +### Minor Changes + +- fc15b77: Switched to using the new `/notifications` endpoints. Be sure to update the `notifications` plugin backend before deploying this frontend plugin change. + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-signals-react@0.0.8 + +## 0.5.0-next.2 + +### Minor Changes + +- fc15b77: Switched to using the new `/notifications` endpoints. Be sure to update the `notifications` plugin backend before deploying this frontend plugin change. + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-notifications-common@0.0.7-next.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + ## 0.4.2-next.1 ### Patch Changes diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index 5634b44c0e..dda00762b3 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications", - "version": "0.4.2-next.1", + "version": "0.5.1-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "notifications", diff --git a/plugins/notifications/src/api/NotificationsClient.test.ts b/plugins/notifications/src/api/NotificationsClient.test.ts index f378269e45..8248ea9331 100644 --- a/plugins/notifications/src/api/NotificationsClient.test.ts +++ b/plugins/notifications/src/api/NotificationsClient.test.ts @@ -48,7 +48,7 @@ describe('NotificationsClient', () => { it('should fetch notifications from correct endpoint', async () => { server.use( - rest.get(`${mockBaseUrl}/`, (_, res, ctx) => + rest.get(`${mockBaseUrl}/notifications`, (_, res, ctx) => res(ctx.json(expectedResp)), ), ); @@ -58,7 +58,7 @@ describe('NotificationsClient', () => { it('should fetch notifications with options', async () => { server.use( - rest.get(`${mockBaseUrl}/`, (req, res, ctx) => { + rest.get(`${mockBaseUrl}/notifications`, (req, res, ctx) => { expect(req.url.search).toBe( '?limit=10&offset=0&search=find+me&read=true&createdAfter=1970-01-01T00%3A00%3A00.005Z', ); @@ -77,7 +77,7 @@ describe('NotificationsClient', () => { it('should omit unselected fetch options', async () => { server.use( - rest.get(`${mockBaseUrl}/`, (req, res, ctx) => { + rest.get(`${mockBaseUrl}/notifications`, (req, res, ctx) => { expect(req.url.search).toBe('?limit=10'); return res(ctx.json(expectedResp)); }), @@ -91,7 +91,7 @@ describe('NotificationsClient', () => { it('should fetch single notification', async () => { server.use( - rest.get(`${mockBaseUrl}/:id`, (req, res, ctx) => { + rest.get(`${mockBaseUrl}/notifications/:id`, (req, res, ctx) => { expect(req.params.id).toBe('acdaa8ca-262b-43c1-b74b-de06e5f3b3c7'); return res(ctx.json(testNotification)); }), @@ -115,12 +115,15 @@ describe('NotificationsClient', () => { it('should update notifications', async () => { server.use( - rest.post(`${mockBaseUrl}/update`, async (req, res, ctx) => { - expect(await req.json()).toEqual({ - ids: ['acdaa8ca-262b-43c1-b74b-de06e5f3b3c7'], - }); - return res(ctx.json(expectedResp)); - }), + rest.post( + `${mockBaseUrl}/notifications/update`, + async (req, res, ctx) => { + expect(await req.json()).toEqual({ + ids: ['acdaa8ca-262b-43c1-b74b-de06e5f3b3c7'], + }); + return res(ctx.json(expectedResp)); + }, + ), ); const response = await client.updateNotifications({ ids: ['acdaa8ca-262b-43c1-b74b-de06e5f3b3c7'], diff --git a/plugins/notifications/src/api/NotificationsClient.ts b/plugins/notifications/src/api/NotificationsClient.ts index 983065f96e..5e763ecb8c 100644 --- a/plugins/notifications/src/api/NotificationsClient.ts +++ b/plugins/notifications/src/api/NotificationsClient.ts @@ -71,23 +71,26 @@ export class NotificationsClient implements NotificationsApi { if (options?.minimumSeverity !== undefined) { queryString.append('minimumSeverity', options.minimumSeverity); } - const urlSegment = `?${queryString}`; - return await this.request(urlSegment); + return await this.request( + `/notifications?${queryString}`, + ); } async getNotification(id: string): Promise { - return await this.request(`${id}`); + return await this.request( + `/notifications/${encodeURIComponent(id)}`, + ); } async getStatus(): Promise { - return await this.request('status'); + return await this.request('/status'); } async updateNotifications( options: UpdateNotificationsOptions, ): Promise { - return await this.request('update', { + return await this.request('/notifications/update', { method: 'POST', body: JSON.stringify(options), headers: { 'Content-Type': 'application/json' }, @@ -95,29 +98,27 @@ export class NotificationsClient implements NotificationsApi { } async getNotificationSettings(): Promise { - return await this.request('settings'); + return await this.request('/settings'); } async updateNotificationSettings( settings: NotificationSettings, ): Promise { - return await this.request('settings', { + return await this.request('/settings', { method: 'POST', body: JSON.stringify(settings), headers: { 'Content-Type': 'application/json' }, }); } - private async request(path: string, init?: any): Promise { - const baseUrl = `${await this.discoveryApi.getBaseUrl('notifications')}/`; - const url = new URL(path, baseUrl); + private async request(path: string, init?: RequestInit): Promise { + const baseUrl = await this.discoveryApi.getBaseUrl('notifications'); + const res = await this.fetchApi.fetch(`${baseUrl}${path}`, init); - const response = await this.fetchApi.fetch(url.toString(), init); - - if (!response.ok) { - throw await ResponseError.fromResponse(response); + if (!res.ok) { + throw await ResponseError.fromResponse(res); } - return response.json() as Promise; + return res.json() as Promise; } } diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index 2527cdfd83..68f7c6e50e 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-org-react +## 0.1.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/catalog-client@1.9.1-next.0 + +## 0.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + +## 0.1.33 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + +## 0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + ## 0.1.33-next.1 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 2e2091aa6c..1049e635c0 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.33-next.1", + "version": "0.1.34-next.1", "backstage": { "role": "web-library", "pluginId": "org", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 0cf9b74c8f..5c387c7b1a 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,52 @@ # @backstage/plugin-org +## 0.6.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## 0.6.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## 0.6.34 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-catalog-common@1.1.2 + +## 0.6.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + ## 0.6.34-next.1 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 605d766ab8..c2aa1b0fc0 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org", - "version": "0.6.34-next.1", + "version": "0.6.35-next.1", "description": "A Backstage plugin that helps you create entity pages for your organization", "backstage": { "role": "frontend-plugin", diff --git a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md index 83b2218ee5..1f71ec8f12 100644 --- a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md +++ b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-permission-backend-module-allow-all-policy +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-permission-common@0.8.3 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/plugin-permission-common@0.8.3 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/permission-backend-module-policy-allow-all/package.json b/plugins/permission-backend-module-policy-allow-all/package.json index 0970bd05a1..10ff45f8a3 100644 --- a/plugins/permission-backend-module-policy-allow-all/package.json +++ b/plugins/permission-backend-module-policy-allow-all/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend-module-allow-all-policy", - "version": "0.2.3-next.1", + "version": "0.2.4-next.1", "description": "Allow all policy backend module for the permission plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 57d7750698..777bf4c507 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,56 @@ # @backstage/plugin-permission-backend +## 0.5.53-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + +## 0.5.53-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-permission-common@0.8.3 + +## 0.5.52 + +### Patch Changes + +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/plugin-permission-common@0.8.3 + +## 0.5.52-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.5.52-next.1 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 605cb35dfc..1ebdf866f0 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.5.52-next.1", + "version": "0.5.53-next.1", "backstage": { "role": "backend-plugin", "pluginId": "permission", @@ -67,6 +67,7 @@ "zod": "^3.22.4" }, "devDependencies": { + "@backstage/backend-defaults": "workspace:^", "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@types/lodash": "^4.14.151", diff --git a/plugins/permission-backend/src/service/router.test.ts b/plugins/permission-backend/src/service/router.test.ts index f12bacc61d..e3fb5418cf 100644 --- a/plugins/permission-backend/src/service/router.test.ts +++ b/plugins/permission-backend/src/service/router.test.ts @@ -27,6 +27,7 @@ import { createRouter } from './router'; import { ConfigReader } from '@backstage/config'; import { BackstageCredentials } from '@backstage/backend-plugin-api'; import { mockCredentials, mockServices } from '@backstage/backend-test-utils'; +import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter'; const mockApplyConditions: jest.MockedFunction< InstanceType['applyConditions'] @@ -60,6 +61,11 @@ const policy = { }), }; +const middleware = MiddlewareFactory.create({ + logger: mockServices.logger.mock(), + config: mockServices.rootConfig(), +}); + describe('createRouter', () => { let app: express.Express; @@ -75,7 +81,7 @@ describe('createRouter', () => { userInfo: mockServices.userInfo(), policy, }); - + router.use(middleware.error()); app = express().use(router); }); diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts index db2b72f95c..c624947375 100644 --- a/plugins/permission-backend/src/service/router.ts +++ b/plugins/permission-backend/src/service/router.ts @@ -17,10 +17,7 @@ import { z } from 'zod'; import express, { Request, Response } from 'express'; import Router from 'express-promise-router'; -import { - createLegacyAuthAdapters, - errorHandler, -} from '@backstage/backend-common'; +import { createLegacyAuthAdapters } from '@backstage/backend-common'; import { InputError } from '@backstage/errors'; import { IdentityApi } from '@backstage/plugin-auth-node'; import { @@ -251,7 +248,5 @@ export async function createRouter( }, ); - router.use(errorHandler()); - return router; } diff --git a/plugins/permission-common/CHANGELOG.md b/plugins/permission-common/CHANGELOG.md index 6314d92b02..3fac4d2b9e 100644 --- a/plugins/permission-common/CHANGELOG.md +++ b/plugins/permission-common/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-permission-common +## 0.8.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + +## 0.8.3 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.8.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.8.2 ### Patch Changes diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index a384550bcd..833110d1d7 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-common", - "version": "0.8.2", + "version": "0.8.4-next.0", "description": "Isomorphic types and client for Backstage permissions and authorization", "backstage": { "role": "common-library", diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 01cfa00d9a..1e5bd1dd0e 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,52 @@ # @backstage/plugin-permission-node +## 0.8.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## 0.8.7-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-permission-common@0.8.3 + +## 0.8.6 + +### Patch Changes + +- b149e2a: The `createPermissionIntegrationRouter` function now detects and prevents the exposure of duplicate permissions. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/plugin-permission-common@0.8.3 + +## 0.8.6-next.2 + +### Patch Changes + +- b149e2a: The `createPermissionIntegrationRouter` function now detects and prevents the exposure of duplicate permissions. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.8.6-next.1 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 94bf4e0ac5..f002af3445 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-node", - "version": "0.8.6-next.1", + "version": "0.8.7-next.1", "description": "Common permission and authorization utilities for backend plugins", "backstage": { "role": "node-library", @@ -69,6 +69,7 @@ "zod-to-json-schema": "^3.20.4" }, "devDependencies": { + "@backstage/backend-defaults": "workspace:^", "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@types/supertest": "^2.0.8", diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts index 24e1b91065..0062ef03b6 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts @@ -29,6 +29,8 @@ import { PermissionIntegrationRouterOptions, } from './createPermissionIntegrationRouter'; import { createPermissionRule } from './createPermissionRule'; +import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter'; +import { mockServices } from '@backstage/backend-test-utils'; const testPermission: Permission = createPermission({ name: 'test.permission', @@ -109,6 +111,11 @@ const mockedOptionResources: PermissionIntegrationRouterOptions = { ], }; +const middleware = MiddlewareFactory.create({ + logger: mockServices.logger.mock(), + config: mockServices.rootConfig(), +}); + const createApp = ( mockedGetResources: | typeof defaultMockedGetResources1 = defaultMockedGetResources1, @@ -122,7 +129,7 @@ const createApp = ( }) : createPermissionIntegrationRouter({ permissions: [testPermission] }); - return express().use(router); + return express().use(router.use(middleware.error())); }; describe('createPermissionIntegrationRouter', () => { @@ -453,7 +460,9 @@ describe('createPermissionIntegrationRouter', () => { beforeEach(async () => { const app = express().use( - createPermissionIntegrationRouter(mockedOptionResources), + createPermissionIntegrationRouter(mockedOptionResources).use( + middleware.error(), + ), ); response = await request(app) @@ -765,7 +774,7 @@ describe('createPermissionIntegrationRouter', () => { resourceType: 'test-resource', permissions: [testPermission], rules: [testRule1, testRule2], - }), + }).use(middleware.error()), ), ) .post('/.well-known/backstage/permissions/apply-conditions') @@ -904,7 +913,7 @@ describe('createPermissionIntegrationRouter', () => { const response = await request( express().use( createPermissionIntegrationRouter({ - permissions: [aPermission], + permissions: [aPermission, testPermission], resources: [ { resourceType: 'test-resource', diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts index 40d215d515..de1e32169a 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts @@ -19,7 +19,6 @@ import Router from 'express-promise-router'; import { z } from 'zod'; import zodToJsonSchema from 'zod-to-json-schema'; import { InputError } from '@backstage/errors'; -import { errorHandler } from '@backstage/backend-common'; import { AuthorizeResult, DefinitivePolicyDecision, @@ -328,11 +327,16 @@ export function createPermissionIntegrationRouter< > ).rules || [], ); - const allPermissions = [ - ...((options as { permissions: Permission[] }).permissions || []), - ...(optionsWithResources.resources?.flatMap(o => o.permissions || []) || - []), - ]; + + const allPermissions = Array.from( + new Map( + [ + ...((options as { permissions: Permission[] }).permissions || []), + ...(optionsWithResources.resources?.flatMap(o => o.permissions || []) || + []), + ].map(i => [i.name, i]), + ).values(), + ); const allResourceTypes = allOptions.reduce((acc, option) => { if ( @@ -478,9 +482,6 @@ export function createPermissionIntegrationRouter< }, ); - // TODO(belugas): Remove this when dropping support to the legacy backend system because setting the error handler manually is no logger required in the new system. - router.use(errorHandler()); - return router; } diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index fa87a388f8..2338370873 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-permission-react +## 0.4.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## 0.4.29 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/plugin-permission-common@0.8.3 + +## 0.4.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 0.4.28 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index a6765949b2..2af6fd9508 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-react", - "version": "0.4.28", + "version": "0.4.30-next.0", "backstage": { "role": "web-library", "pluginId": "permission", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index 9adc093541..7a30f80a80 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-proxy-backend +## 0.5.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + +## 0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.5.9 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.5.9-next.1 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 3c23b95c3e..8f3de355bf 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-proxy-backend", - "version": "0.5.9-next.1", + "version": "0.5.10-next.1", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", "backstage": { "role": "backend-plugin", diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md index e4e9315dc4..80a095b8d5 100644 --- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-scaffolder-backend-module-azure +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index 15d78a9102..5fa09afda6 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-azure", - "version": "0.2.4-next.1", + "version": "0.2.5-next.1", "description": "The azure module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md index 092eb08124..a1415099c1 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,55 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-cloud +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.27-next.0 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + +## 0.2.4 + +### Patch Changes + +- c4ffd13: Added the autocomplete feature to GitlabRepoUrlPicker +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json index 970b0d6abd..9703ab0c86 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud", - "version": "0.2.4-next.1", + "version": "0.2.5-next.1", "description": "The Bitbucket Cloud module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md index d6ff8431a3..7a3e06af53 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-server +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## 0.2.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-server/package.json b/plugins/scaffolder-backend-module-bitbucket-server/package.json index 0d0a89c521..b262004950 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-server", - "version": "0.2.4-next.1", + "version": "0.2.5-next.1", "description": "The Bitbucket Server module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md index dc440b7510..9cce359738 100644 --- a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,59 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket +## 0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.5-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.5-next.0 + +## 0.3.5 + +### Patch Changes + +- 5f04976: Fixed a bug that caused missing code in published packages. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.3.5-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json index b8d4d25cff..b8d13a765e 100644 --- a/plugins/scaffolder-backend-module-bitbucket/package.json +++ b/plugins/scaffolder-backend-module-bitbucket/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket", - "version": "0.3.5-next.1", + "version": "0.3.6-next.1", "description": "The bitbucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index a593356ba2..3380e36131 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## 0.3.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.3.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 0a0f81610e..29f7bc11eb 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", - "version": "0.3.4-next.1", + "version": "0.3.5-next.1", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 352198452a..925c042844 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + +## 0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + ## 0.3.5-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 43c78111f8..41ecc9b958 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", - "version": "0.3.5-next.1", + "version": "0.3.6-next.1", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md index fc9c71d097..a39d9e5f9a 100644 --- a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-scaffolder-backend-module-gcp +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gcp/package.json b/plugins/scaffolder-backend-module-gcp/package.json index 1bb792fe59..b1ca3dc384 100644 --- a/plugins/scaffolder-backend-module-gcp/package.json +++ b/plugins/scaffolder-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gcp", - "version": "0.2.4-next.1", + "version": "0.2.5-next.1", "description": "The GCP Bucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md index 1914c68fb1..2098ef4ec0 100644 --- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-scaffolder-backend-module-gerrit +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## 0.2.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json index 1f0385538f..0a0a35acad 100644 --- a/plugins/scaffolder-backend-module-gerrit/package.json +++ b/plugins/scaffolder-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gerrit", - "version": "0.2.4-next.1", + "version": "0.2.5-next.1", "description": "The gerrit module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md index 9cca747af6..6edfa1cfac 100644 --- a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-scaffolder-backend-module-gitea +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## 0.2.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitea/package.json b/plugins/scaffolder-backend-module-gitea/package.json index 7a7d959e47..6ab4ae6e13 100644 --- a/plugins/scaffolder-backend-module-gitea/package.json +++ b/plugins/scaffolder-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitea", - "version": "0.2.4-next.1", + "version": "0.2.5-next.1", "description": "The gitea module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-github/CHANGELOG.md b/plugins/scaffolder-backend-module-github/CHANGELOG.md index 098cf48194..c4e4b92102 100644 --- a/plugins/scaffolder-backend-module-github/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md @@ -1,5 +1,68 @@ # @backstage/plugin-scaffolder-backend-module-github +## 0.5.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/integration@1.16.1-next.0 + +## 0.5.5-next.1 + +### Patch Changes + +- edaf925: Updates to allow users to subscribe to the newly created repository within GitHub to mimic similar functionality found within the GitHub UI. + +## 0.5.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## 0.5.4 + +### Patch Changes + +- 7df6179: adding requiredLinearHistory property for branch protection settings +- b5e002b: Change `github:environment:create` action to request and use a token when resolving reviewer entity refs from the Backstage catalog. +- e913fdf: Add github backend module to create-app and improve error messages +- 973dd6f: Minor spell fix in action parameters +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/catalog-client@1.9.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + +## 0.5.4-next.2 + +### Patch Changes + +- e913fdf: Add github backend module to create-app and improve error messages +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.5.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index 5ecdf0ceec..4a1dffaf08 100644 --- a/plugins/scaffolder-backend-module-github/package.json +++ b/plugins/scaffolder-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-github", - "version": "0.5.4-next.1", + "version": "0.5.5-next.2", "description": "The github module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-github/report.api.md b/plugins/scaffolder-backend-module-github/report.api.md index 547c61768f..935886bf14 100644 --- a/plugins/scaffolder-backend-module-github/report.api.md +++ b/plugins/scaffolder-backend-module-github/report.api.md @@ -3,6 +3,7 @@ > 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 { BackendFeature } from '@backstage/backend-plugin-api'; import { CatalogApi } from '@backstage/catalog-client'; import { Config } from '@backstage/config'; @@ -79,6 +80,7 @@ export function createGithubBranchProtectionAction(options: { requiredConversationResolution?: boolean | undefined; requireLastPushApproval?: boolean | undefined; requiredCommitSigning?: boolean | undefined; + requiredLinearHistory?: boolean | undefined; token?: string | undefined; }, JsonObject @@ -103,6 +105,7 @@ export function createGithubDeployKeyAction(options: { export function createGithubEnvironmentAction(options: { integrations: ScmIntegrationRegistry; catalogClient?: CatalogApi; + auth?: AuthService; }): TemplateAction< { repoUrl: string; @@ -270,11 +273,13 @@ export function createGithubRepoCreateAction(options: { } | undefined; requireCommitSigning?: boolean | undefined; + requiredLinearHistory?: boolean | undefined; customProperties?: | { [key: string]: string; } | undefined; + subscribe?: boolean | undefined; }, JsonObject >; @@ -317,6 +322,7 @@ export function createGithubRepoPushAction(options: { sourcePath?: string | undefined; token?: string | undefined; requiredCommitSigning?: boolean | undefined; + requiredLinearHistory?: boolean | undefined; requireLastPushApproval?: boolean | undefined; }, JsonObject @@ -430,11 +436,13 @@ export function createPublishGithubAction(options: { } | undefined; requiredCommitSigning?: boolean | undefined; + requiredLinearHistory?: boolean | undefined; customProperties?: | { [key: string]: string; } | undefined; + subscribe?: boolean | undefined; }, JsonObject >; diff --git a/plugins/scaffolder-backend-module-github/src/actions/gitHelpers.ts b/plugins/scaffolder-backend-module-github/src/actions/gitHelpers.ts index 9989a80724..c720690ee6 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/gitHelpers.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/gitHelpers.ts @@ -43,6 +43,7 @@ type BranchProtectionOptions = { enforceAdmins?: boolean; dismissStaleReviews?: boolean; requiredCommitSigning?: boolean; + requiredLinearHistory?: boolean; }; export const enableBranchProtectionOnDefaultRepoBranch = async ({ @@ -62,6 +63,7 @@ export const enableBranchProtectionOnDefaultRepoBranch = async ({ enforceAdmins = true, dismissStaleReviews = false, requiredCommitSigning = false, + requiredLinearHistory = false, }: BranchProtectionOptions): Promise => { const tryOnce = async () => { try { @@ -93,6 +95,7 @@ export const enableBranchProtectionOnDefaultRepoBranch = async ({ require_last_push_approval: requireLastPushApproval, }, required_conversation_resolution: requiredConversationResolution, + required_linear_history: requiredLinearHistory, }); if (requiredCommitSigning) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/github.test.ts b/plugins/scaffolder-backend-module-github/src/actions/github.test.ts index 3af922eb4f..2f629622d0 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/github.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/github.test.ts @@ -74,6 +74,9 @@ const mockOctokit = { createOrUpdateRepoSecret: jest.fn(), getRepoPublicKey: jest.fn(), }, + activity: { + setRepoSubscription: jest.fn(), + }, }, request: jest.fn(), }; @@ -1097,6 +1100,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1126,6 +1130,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1154,6 +1159,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1181,6 +1187,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); }); @@ -1269,6 +1276,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1302,6 +1310,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1335,6 +1344,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1370,6 +1380,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1405,6 +1416,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1440,6 +1452,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); }); it('should call enableBranchProtectionOnDefaultRepoBranch with the correct values of bypassPullRequestAllowances', async () => { @@ -1472,6 +1485,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1503,6 +1517,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1534,6 +1549,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1565,6 +1581,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1600,6 +1617,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); await action.handler({ @@ -1635,6 +1653,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, }); }); @@ -1664,6 +1683,11 @@ describe('publish:github', () => { defaultValue: false, overrideValue: true, }, + { + inputProperty: 'requiredLinearHistory', + defaultValue: false, + overrideValue: true, + }, { inputProperty: 'protectEnforceAdmins', defaultValue: true, @@ -1712,6 +1736,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, [octokitParameter || inputProperty]: defaultValue, }); @@ -1740,6 +1765,7 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, [octokitParameter || inputProperty]: overrideValue, }); @@ -1768,8 +1794,31 @@ describe('publish:github', () => { enforceAdmins: true, dismissStaleReviews: false, requiredCommitSigning: false, + requiredLinearHistory: false, [octokitParameter || inputProperty]: defaultValue, }); }, ); + + it('should add user subscription', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'Organization' }, + }); + mockOctokit.rest.repos.createInOrg.mockResolvedValue({ data: {} }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + subscribe: true, + }, + }); + + expect(mockOctokit.rest.activity.setRepoSubscription).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repo', + subscribed: true, + ignored: false, + }); + }); }); diff --git a/plugins/scaffolder-backend-module-github/src/actions/github.ts b/plugins/scaffolder-backend-module-github/src/actions/github.ts index 982c68d80f..e3a9ff3352 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/github.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/github.ts @@ -115,7 +115,9 @@ export function createPublishGithubAction(options: { includeClaimKeys?: string[]; }; requiredCommitSigning?: boolean; + requiredLinearHistory?: boolean; customProperties?: { [key: string]: string }; + subscribe?: boolean; }>({ id: 'publish:github', description: @@ -165,7 +167,9 @@ export function createPublishGithubAction(options: { secrets: inputProps.secrets, oidcCustomization: inputProps.oidcCustomization, requiredCommitSigning: inputProps.requiredCommitSigning, + requiredLinearHistory: inputProps.requiredLinearHistory, customProperties: inputProps.customProperties, + subscribe: inputProps.subscribe, }, }, output: { @@ -216,7 +220,9 @@ export function createPublishGithubAction(options: { oidcCustomization, token: providedToken, customProperties, + subscribe = false, requiredCommitSigning = false, + requiredLinearHistory = false, } = ctx.input; const octokitOptions = await getOctokitOptions({ @@ -257,6 +263,7 @@ export function createPublishGithubAction(options: { secrets, oidcCustomization, customProperties, + subscribe, ctx.logger, ); @@ -289,6 +296,7 @@ export function createPublishGithubAction(options: { gitAuthorEmail, dismissStaleReviews, requiredCommitSigning, + requiredLinearHistory, ); ctx.output('commitHash', commitResult?.commitHash); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.test.ts index 5443d7304c..14ebc9a1cd 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.test.ts @@ -98,6 +98,7 @@ describe('github:branch-protection:create', () => { require_last_push_approval: false, }, required_conversation_resolution: false, + required_linear_history: false, }); expect( mockOctokit.rest.repos.createCommitSignatureProtection, @@ -130,6 +131,7 @@ describe('github:branch-protection:create', () => { require_last_push_approval: false, }, required_conversation_resolution: false, + required_linear_history: false, }); expect( mockOctokit.rest.repos.createCommitSignatureProtection, @@ -162,6 +164,44 @@ describe('github:branch-protection:create', () => { require_last_push_approval: true, }, required_conversation_resolution: true, + required_linear_history: false, + }); + expect( + mockOctokit.rest.repos.createCommitSignatureProtection, + ).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repo', + branch: 'master', + }); + }); + + it('should create branch protection with params and require linear history', async () => { + const input = yaml.parse(examples[3].example).steps[0].input; + const ctx = Object.assign({}, mockContext, { input }); + await action.handler(ctx); + + expect(mockOctokit.rest.repos.updateBranchProtection).toHaveBeenCalledWith({ + mediaType: { + previews: ['luke-cage-preview'], + }, + owner: 'owner', + repo: 'repo', + branch: 'master', + required_status_checks: { + strict: true, + contexts: ['test'], + }, + restrictions: null, + enforce_admins: true, + required_pull_request_reviews: { + required_approving_review_count: 1, + require_code_owner_reviews: true, + bypass_pull_request_allowances: undefined, + dismiss_stale_reviews: true, + require_last_push_approval: true, + }, + required_conversation_resolution: true, + required_linear_history: true, }); expect( mockOctokit.rest.repos.createCommitSignatureProtection, diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.ts b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.ts index 4d0eb253ef..12761a2b70 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.ts @@ -67,4 +67,25 @@ export const examples: TemplateExample[] = [ ], }), }, + { + description: `GitHub Branch Protection and required linear history on default branch.`, + example: yaml.stringify({ + steps: [ + { + action: 'github:branch-protection:create', + name: 'Setup Branch Protection', + input: { + repoUrl: 'github.com?repo=repo&owner=owner', + requireCodeOwnerReviews: true, + requiredStatusCheckContexts: ['test'], + dismissStaleReviews: true, + requireLastPushApproval: true, + requiredConversationResolution: true, + requiredCommitSigning: true, + requiredLinearHistory: true, + }, + }, + ], + }), + }, ]; diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.test.ts index d4eac30b81..8e672af725 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.test.ts @@ -96,6 +96,7 @@ describe('github:branch-protection:create', () => { require_last_push_approval: false, }, required_conversation_resolution: false, + required_linear_history: false, }); expect( mockOctokit.rest.repos.createCommitSignatureProtection, @@ -132,6 +133,7 @@ describe('github:branch-protection:create', () => { require_last_push_approval: false, }, required_conversation_resolution: false, + required_linear_history: false, }); expect( mockOctokit.rest.repos.createCommitSignatureProtection, @@ -167,6 +169,7 @@ describe('github:branch-protection:create', () => { requiredConversationResolution: true, requireLastPushApproval: true, requiredCommitSigning: true, + requiredLinearHistory: true, }, }); @@ -199,6 +202,7 @@ describe('github:branch-protection:create', () => { require_last_push_approval: true, }, required_conversation_resolution: true, + required_linear_history: true, }); expect( mockOctokit.rest.repos.createCommitSignatureProtection, diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts index 4ab847c98e..a7555d3af1 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts @@ -62,6 +62,7 @@ export function createGithubBranchProtectionAction(options: { requiredConversationResolution?: boolean; requireLastPushApproval?: boolean; requiredCommitSigning?: boolean; + requiredLinearHistory?: boolean; token?: string; }>({ id: 'github:branch-protection:create', @@ -90,6 +91,7 @@ export function createGithubBranchProtectionAction(options: { inputProps.requiredConversationResolution, requireLastPushApproval: inputProps.requireLastPushApproval, requiredCommitSigning: inputProps.requiredCommitSigning, + requiredLinearHistory: inputProps.requiredLinearHistory, token: inputProps.token, }, }, @@ -109,6 +111,7 @@ export function createGithubBranchProtectionAction(options: { requiredConversationResolution = false, requireLastPushApproval = false, requiredCommitSigning = false, + requiredLinearHistory = false, token: providedToken, } = ctx.input; @@ -147,6 +150,7 @@ export function createGithubBranchProtectionAction(options: { enforceAdmins, dismissStaleReviews, requiredCommitSigning, + requiredLinearHistory, }); }, }); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts index 1397942a7c..898e1842f7 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts @@ -20,6 +20,7 @@ import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; import { CatalogApi } from '@backstage/catalog-client'; +import { mockCredentials, mockServices } from '@backstage/backend-test-utils'; const mockOctokit = { rest: { @@ -71,6 +72,14 @@ describe('github:environment:create', () => { }); const integrations = ScmIntegrations.fromConfig(config); + + const credentials = mockCredentials.user(); + + const token = mockCredentials.service.token({ + onBehalfOf: credentials, + targetPluginId: 'catalog', + }); + let action: TemplateAction; const mockContext = createMockActionContext({ @@ -78,6 +87,7 @@ describe('github:environment:create', () => { repoUrl: 'github.com?repo=repository&owner=owner', name: 'envname', }, + secrets: { backstageToken: token }, }); beforeEach(() => { @@ -122,6 +132,7 @@ describe('github:environment:create', () => { action = createGithubEnvironmentAction({ integrations, catalogClient: mockCatalogClient as CatalogApi, + auth: mockServices.auth(), }); }); @@ -453,6 +464,13 @@ describe('github:environment:create', () => { }, }); + expect(mockCatalogClient.getEntitiesByRefs).toHaveBeenCalledWith( + { + entityRefs: ['group:default/team-a', 'user:default/johndoe'], + }, + { token }, + ); + expect( mockOctokit.rest.repos.createOrUpdateEnvironment, ).toHaveBeenCalledWith({ diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts index 29c0a3ce38..ef59b611fe 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts @@ -26,6 +26,7 @@ import Sodium from 'libsodium-wrappers'; import { examples } from './gitHubEnvironment.examples'; import { CatalogApi } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; +import { AuthService } from '@backstage/backend-plugin-api'; /** * Creates an `github:environment:create` Scaffolder action that creates a Github Environment. @@ -35,8 +36,9 @@ import { Entity } from '@backstage/catalog-model'; export function createGithubEnvironmentAction(options: { integrations: ScmIntegrationRegistry; catalogClient?: CatalogApi; + auth?: AuthService; }) { - const { integrations, catalogClient } = options; + const { integrations, catalogClient, auth } = options; // For more information on how to define custom actions, see // https://backstage.io/docs/features/software-templates/writing-custom-actions return createTemplateAction<{ @@ -140,7 +142,8 @@ export function createGithubEnvironmentAction(options: { reviewers: { title: 'Reviewers', type: 'array', - description: 'Reviewers for this environment', + description: + 'Reviewers for this environment. Must be a list of Backstage entity references.', items: { type: 'string', }, @@ -163,6 +166,11 @@ export function createGithubEnvironmentAction(options: { reviewers, } = ctx.input; + const { token } = (await auth?.getPluginRequestToken({ + onBehalfOf: await ctx.getInitiatorCredentials(), + targetPluginId: 'catalog', + })) ?? { token: ctx.secrets?.backstageToken }; + // When environment creation step is executed right after a repo publish step, the repository might not be available immediately. // Add a 2-second delay before initiating the steps in this action. await new Promise(resolve => setTimeout(resolve, 2000)); @@ -190,9 +198,14 @@ export function createGithubEnvironmentAction(options: { if (reviewers) { let reviewersEntityRefs: Array = []; // Fetch reviewers from Catalog - const catalogResponse = await catalogClient?.getEntitiesByRefs({ - entityRefs: reviewers, - }); + const catalogResponse = await catalogClient?.getEntitiesByRefs( + { + entityRefs: reviewers, + }, + { + token, + }, + ); if (catalogResponse?.items?.length) { reviewersEntityRefs = catalogResponse.items; } diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts index 044005961e..42b9c47030 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts @@ -67,14 +67,13 @@ export function createGithubPagesEnableAction(options: { sourceBranch: { title: 'Source Branch', type: 'string', - description: - 'The the GitHub Pages source branch. Default is "main"', + description: 'The GitHub Pages source branch. Default is "main"', }, sourcePath: { title: 'Source Path', type: 'string', description: - 'The the GitHub Pages source path - "/" or "/docs". Default is "/"', + 'The GitHub Pages source path - "/" or "/docs". Default is "/"', }, token: { title: 'Authorization Token', diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts index 66d54366c5..864c5b729f 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts @@ -55,6 +55,9 @@ const mockOctokit = { createOrUpdateRepoSecret: jest.fn(), getRepoPublicKey: jest.fn(), }, + activity: { + setRepoSubscription: jest.fn(), + }, }, request: jest.fn(), }; @@ -754,4 +757,26 @@ describe('github:repo:create', () => { 'https://github.com/clone/url.git', ); }); + + it('should subscribe user to repository', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'Organization' }, + }); + mockOctokit.rest.repos.createInOrg.mockResolvedValue({ data: {} }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + subscribe: true, + }, + }); + + expect(mockOctokit.rest.activity.setRepoSubscription).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repo', + subscribed: true, + ignored: false, + }); + }); }); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts index 1c3d035ee3..b4608e57de 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts @@ -100,7 +100,9 @@ export function createGithubRepoCreateAction(options: { includeClaimKeys?: string[]; }; requireCommitSigning?: boolean; + requiredLinearHistory?: boolean; customProperties?: { [key: string]: string }; + subscribe?: boolean; }>({ id: 'github:repo:create', description: 'Creates a GitHub repository.', @@ -140,7 +142,9 @@ export function createGithubRepoCreateAction(options: { secrets: inputProps.secrets, oidcCustomization: inputProps.oidcCustomization, requiredCommitSigning: inputProps.requiredCommitSigning, + requiredLinearHistory: inputProps.requiredLinearHistory, customProperties: inputProps.customProperties, + subscribe: inputProps.subscribe, }, }, output: { @@ -174,6 +178,7 @@ export function createGithubRepoCreateAction(options: { secrets, oidcCustomization, customProperties, + subscribe, token: providedToken, } = ctx.input; @@ -215,6 +220,7 @@ export function createGithubRepoCreateAction(options: { secrets, oidcCustomization, customProperties, + subscribe, ctx.logger, ); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts index d0ee4bfa12..9ff8cd123c 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts @@ -331,6 +331,7 @@ describe('github:repo:push', () => { bypassPullRequestAllowances: undefined, requiredApprovingReviewCount: 1, requiredCommitSigning: false, + requiredLinearHistory: false, restrictions: undefined, }); @@ -359,6 +360,7 @@ describe('github:repo:push', () => { bypassPullRequestAllowances: undefined, requiredApprovingReviewCount: 1, requiredCommitSigning: false, + requiredLinearHistory: false, restrictions: undefined, }); @@ -387,6 +389,7 @@ describe('github:repo:push', () => { bypassPullRequestAllowances: undefined, requiredApprovingReviewCount: 1, requiredCommitSigning: false, + requiredLinearHistory: false, restrictions: undefined, }); @@ -415,6 +418,7 @@ describe('github:repo:push', () => { bypassPullRequestAllowances: undefined, requiredApprovingReviewCount: 1, requiredCommitSigning: false, + requiredLinearHistory: false, restrictions: undefined, }); }); @@ -464,6 +468,11 @@ describe('github:repo:push', () => { defaultValue: false, overrideValue: true, }, + { + inputProperty: 'requiredLinearHistory', + defaultValue: false, + overrideValue: true, + }, { inputProperty: 'protectEnforceAdmins', defaultValue: true, @@ -508,6 +517,7 @@ describe('github:repo:push', () => { bypassPullRequestAllowances: undefined, requiredApprovingReviewCount: 1, requiredCommitSigning: false, + requiredLinearHistory: false, restrictions: undefined, [octokitParameter || inputProperty]: defaultValue, }); @@ -536,6 +546,7 @@ describe('github:repo:push', () => { bypassPullRequestAllowances: undefined, requiredApprovingReviewCount: 1, requiredCommitSigning: false, + requiredLinearHistory: false, restrictions: undefined, [octokitParameter || inputProperty]: overrideValue, }); @@ -564,6 +575,7 @@ describe('github:repo:push', () => { bypassPullRequestAllowances: undefined, requiredApprovingReviewCount: 1, requiredCommitSigning: false, + requiredLinearHistory: false, restrictions: undefined, [octokitParameter || inputProperty]: defaultValue, }); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts index a4fa7673c6..62624057c8 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts @@ -75,6 +75,7 @@ export function createGithubRepoPushAction(options: { sourcePath?: string; token?: string; requiredCommitSigning?: boolean; + requiredLinearHistory?: boolean; requireLastPushApproval?: boolean; }>({ id: 'github:repo:push', @@ -106,6 +107,7 @@ export function createGithubRepoPushAction(options: { sourcePath: inputProps.sourcePath, token: inputProps.token, requiredCommitSigning: inputProps.requiredCommitSigning, + requiredLinearHistory: inputProps.requiredLinearHistory, }, }, output: { @@ -137,6 +139,7 @@ export function createGithubRepoPushAction(options: { requireLastPushApproval = false, token: providedToken, requiredCommitSigning = false, + requiredLinearHistory = false, } = ctx.input; const { owner, repo } = parseRepoUrl(repoUrl, integrations); @@ -185,6 +188,7 @@ export function createGithubRepoPushAction(options: { gitAuthorEmail, dismissStaleReviews, requiredCommitSigning, + requiredLinearHistory, ); ctx.output('remoteUrl', remoteUrl); diff --git a/plugins/scaffolder-backend-module-github/src/actions/helpers.ts b/plugins/scaffolder-backend-module-github/src/actions/helpers.ts index 0ae1cad3fb..242f95ce34 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/helpers.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/helpers.ts @@ -93,7 +93,7 @@ export async function getOctokitOptions(options: { if (!credentialProviderToken) { throw new InputError( - `No token available for host: ${host}, with owner ${owner}, and repo ${repo}`, + `No token available for host: ${host}, with owner ${owner}, and repo ${repo}. Make sure GitHub auth is configured correctly. See https://backstage.io/docs/auth/github/provider for more details.`, ); } @@ -149,6 +149,7 @@ export async function createGithubRepoWithCollaboratorsAndTopics( } | undefined, customProperties: { [key: string]: string } | undefined, + subscribe: boolean | undefined, logger: LoggerService, ) { // eslint-disable-next-line testing-library/no-await-sync-queries @@ -330,6 +331,15 @@ export async function createGithubRepoWithCollaboratorsAndTopics( ); } + if (subscribe) { + await client.rest.activity.setRepoSubscription({ + subscribed: true, + ignored: false, + owner, + repo, + }); + } + return newRepo; } @@ -371,6 +381,7 @@ export async function initRepoPushAndProtect( gitAuthorEmail?: string, dismissStaleReviews?: boolean, requiredCommitSigning?: boolean, + requiredLinearHistory?: boolean, ): Promise<{ commitHash: string }> { const gitAuthorInfo = { name: gitAuthorName @@ -416,6 +427,7 @@ export async function initRepoPushAndProtect( enforceAdmins: protectEnforceAdmins, dismissStaleReviews: dismissStaleReviews, requiredCommitSigning: requiredCommitSigning, + requiredLinearHistory: requiredLinearHistory, }); } catch (e) { assertError(e); diff --git a/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts b/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts index 4a52c1d69f..8b30168225 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts @@ -270,6 +270,12 @@ const requiredCommitSigning = { description: `Require commit signing so that you must sign commits on this branch.`, }; +const requiredLinearHistory = { + title: 'Require linear history', + type: 'boolean', + description: `Prevent merge commits from being pushed to matching branches.`, +}; + const repoVariables = { title: 'Repository Variables', description: `Variables attached to the repository`, @@ -311,6 +317,12 @@ const customProperties = { type: 'object', }; +const subscribe = { + title: 'Subscribe to repository', + description: `Subscribe to the repository. The default value is 'false'`, + type: 'boolean', +}; + export { access }; export { allowMergeCommit }; export { allowRebaseMerge }; @@ -346,7 +358,9 @@ export { sourcePath }; export { token }; export { topics }; export { requiredCommitSigning }; +export { requiredLinearHistory }; export { repoVariables }; export { secrets }; export { oidcCustomization }; export { customProperties }; +export { subscribe }; diff --git a/plugins/scaffolder-backend-module-github/src/module.ts b/plugins/scaffolder-backend-module-github/src/module.ts index f837ad0456..0387473fdb 100644 --- a/plugins/scaffolder-backend-module-github/src/module.ts +++ b/plugins/scaffolder-backend-module-github/src/module.ts @@ -51,8 +51,9 @@ export const githubModule = createBackendModule({ scaffolder: scaffolderActionsExtensionPoint, config: coreServices.rootConfig, discovery: coreServices.discovery, + auth: coreServices.auth, }, - async init({ scaffolder, config, discovery }) { + async init({ scaffolder, config, discovery, auth }) { const integrations = ScmIntegrations.fromConfig(config); const githubCredentialsProvider = DefaultGithubCredentialsProvider.fromIntegrations(integrations); @@ -75,6 +76,7 @@ export const githubModule = createBackendModule({ createGithubEnvironmentAction({ integrations, catalogClient, + auth, }), createGithubIssuesLabelAction({ integrations, diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index bf7f88f11e..2397ba9ee6 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,54 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.7.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.7.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + +## 0.7.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 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.7.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + ## 0.7.0-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index ced90b0dfa..4967d7606f 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.7.0-next.1", + "version": "0.7.1-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md index de06f2a966..104302138e 100644 --- a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-scaffolder-backend-module-notifications +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/plugin-notifications-node@0.2.11-next.1 + - @backstage/plugin-notifications-common@0.0.8-next.0 + +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/plugin-notifications-common@0.0.7 + - @backstage/plugin-notifications-node@0.2.11-next.0 + +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/plugin-notifications-node@0.2.10 + - @backstage/plugin-notifications-common@0.0.7 + +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-notifications-node@0.2.10-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/plugin-notifications-common@0.0.7-next.0 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json index 678a77b561..14be0abed4 100644 --- a/plugins/scaffolder-backend-module-notifications/package.json +++ b/plugins/scaffolder-backend-module-notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-notifications", - "version": "0.1.5-next.1", + "version": "0.1.6-next.1", "description": "The notifications backend module for the scaffolder plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index c92428f2f5..8ecc627d3a 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,53 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.5.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/integration@1.16.1-next.0 + +## 0.5.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + +## 0.5.4 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.5.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + ## 0.5.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index e0c85ebdbf..1bf60d8f5b 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", - "version": "0.5.4-next.1", + "version": "0.5.5-next.1", "description": "A module for the scaffolder backend that lets you template projects using Rails", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index 39992498bf..0c585cf8d5 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + +## 0.2.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/config@1.3.1-next.0 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 54ba3f504a..85000f1390 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.2.4-next.1", + "version": "0.2.5-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index 94ba8564f3..6d76fb6cb1 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.4.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/plugin-scaffolder-node-test-utils@0.1.18-next.1 + +## 0.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-scaffolder-node-test-utils@0.1.18-next.0 + +## 0.4.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/types@1.2.0 + - @backstage/plugin-scaffolder-node-test-utils@0.1.17 + +## 0.4.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/plugin-scaffolder-node-test-utils@0.1.17-next.2 + - @backstage/types@1.2.0 + ## 0.4.5-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 5781e0bbcf..c154cb9a4d 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.4.5-next.1", + "version": "0.4.6-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 964bfdcf5f..72cae8f5af 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,155 @@ # @backstage/plugin-scaffolder-backend +## 1.29.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.1-next.1 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.1 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.6-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.5-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.2 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/integration@1.16.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.27-next.0 + +## 1.29.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.1 + +## 1.29.0-next.0 + +### Minor Changes + +- 5d9e5c8: Added the ability to use `${{ context.task.id }}` in nunjucks templating, as well as `ctx.task.id` in actions to get the current task ID. + +### Patch Changes + +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.4-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.6-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.5-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.1-next.0 + - @backstage/plugin-scaffolder-common@1.5.8 + +## 1.28.0 + +### Minor Changes + +- c05a343: Emit scaffolder events using the optional `EventsService` + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 3c62a50: Experimental support for `formDecorators` to enable secret collection and mutations to the parameters for scaffolder tasks +- 6c326cf: The --no-node-snapshot check needs to be done against process.execArgv instead of process.argv +- e913fdf: Add github backend module to create-app and improve error messages +- 8f59dc5: Add fs:readdir to scaffolder startup +- 0851834: Resolved an issue where the `templateManagementPermission` was not being exposed through the `/permissions/metadata` endpoint. +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4 + - @backstage/integration@1.16.0 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.5 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.4 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.4 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.4 + +## 1.28.0-next.2 + +### Patch Changes + +- dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`. +- 6c326cf: The --no-node-snapshot check needs to be done against process.execArgv instead of process.argv +- e913fdf: Add github backend module to create-app and improve error messages +- 0851834: Resolved an issue where the `templateManagementPermission` was not being exposed through the `/permissions/metadata` endpoint. +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.5-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.4-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + ## 1.28.0-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 98c5c61694..7d5a9c201b 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend", - "version": "1.28.0-next.1", + "version": "1.29.0-next.2", "description": "The Backstage backend plugin that helps you create new things", "backstage": { "role": "backend-plugin", diff --git a/plugins/scaffolder-backend/report.api.md b/plugins/scaffolder-backend/report.api.md index c2e6c18ad8..20273697d3 100644 --- a/plugins/scaffolder-backend/report.api.md +++ b/plugins/scaffolder-backend/report.api.md @@ -39,7 +39,6 @@ import { PermissionEvaluator } from '@backstage/plugin-permission-common'; import { PermissionRule } from '@backstage/plugin-permission-node'; import { PermissionRuleParams } from '@backstage/plugin-permission-common'; import { PermissionsService } from '@backstage/backend-plugin-api'; -import { PluginDatabaseManager } from '@backstage/backend-common'; import { RESOURCE_TYPE_SCAFFOLDER_ACTION } from '@backstage/plugin-scaffolder-common/alpha'; import { RESOURCE_TYPE_SCAFFOLDER_TEMPLATE } from '@backstage/plugin-scaffolder-common/alpha'; import { ScaffolderEntitiesProcessor as ScaffolderEntitiesProcessor_2 } from '@backstage/plugin-catalog-backend-module-scaffolder-entity-model'; @@ -520,7 +519,7 @@ export class DatabaseTaskStore implements TaskStore { // @public export type DatabaseTaskStoreOptions = { - database: PluginDatabaseManager | Knex; + database: DatabaseService | Knex; events?: EventsService; }; diff --git a/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile b/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile index 0c8b305de5..fb6f3a1f50 100644 --- a/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile +++ b/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.20 +FROM alpine:3.21 RUN apk add --update \ git \ diff --git a/plugins/scaffolder-backend/src/lib/templating/helpers.ts b/plugins/scaffolder-backend/src/lib/templating/helpers.ts index 3dfa4589bf..6c117543ff 100644 --- a/plugins/scaffolder-backend/src/lib/templating/helpers.ts +++ b/plugins/scaffolder-backend/src/lib/templating/helpers.ts @@ -17,7 +17,7 @@ export function isNoNodeSnapshotOptionProvided(): boolean { return ( process.env.NODE_OPTIONS?.includes('--no-node-snapshot') || - process.argv.includes('--no-node-snapshot') + process.execArgv.includes('--no-node-snapshot') ); } diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts index 3868380919..f00d7afad1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts @@ -37,7 +37,7 @@ export class TemplateActionRegistry { const action = this.actions.get(actionId); if (!action) { throw new NotFoundError( - `Template action with ID '${actionId}' is not registered.`, + `Template action with ID '${actionId}' is not registered. See https://backstage.io/docs/features/software-templates/builtin-actions/ on how to add a new action module.`, ); } return action; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 8114532566..4dbe938679 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -15,8 +15,10 @@ */ import { JsonObject } from '@backstage/types'; -import { PluginDatabaseManager } from '@backstage/backend-common'; -import { resolvePackagePath } from '@backstage/backend-plugin-api'; +import { + DatabaseService, + resolvePackagePath, +} from '@backstage/backend-plugin-api'; import { ConflictError, NotFoundError } from '@backstage/errors'; import { Knex } from 'knex'; import { v4 as uuid } from 'uuid'; @@ -78,19 +80,19 @@ export type RawDbTaskEventRow = { * @public */ export type DatabaseTaskStoreOptions = { - database: PluginDatabaseManager | Knex; + database: DatabaseService | Knex; events?: EventsService; }; /** - * Type guard to help DatabaseTaskStore understand when database is PluginDatabaseManager vs. when database is a Knex instance. + * Type guard to help DatabaseTaskStore understand when database is DatabaseService vs. when database is a Knex instance. * * * @public */ -function isPluginDatabaseManager( - opt: PluginDatabaseManager | Knex, -): opt is PluginDatabaseManager { - return (opt as PluginDatabaseManager).getClient !== undefined; +function isDatabaseService( + opt: DatabaseService | Knex, +): opt is DatabaseService { + return (opt as DatabaseService).getClient !== undefined; } const parseSqlDateToIsoString = (input: T): T | string => { @@ -152,9 +154,9 @@ export class DatabaseTaskStore implements TaskStore { } private static async getClient( - database: PluginDatabaseManager | Knex, + database: DatabaseService | Knex, ): Promise { - if (isPluginDatabaseManager(database)) { + if (isDatabaseService(database)) { return database.getClient(); } @@ -162,10 +164,10 @@ export class DatabaseTaskStore implements TaskStore { } private static async runMigrations( - database: PluginDatabaseManager | Knex, + database: DatabaseService | Knex, client: Knex, ): Promise { - if (!isPluginDatabaseManager(database)) { + if (!isDatabaseService(database)) { await client.migrate.latest({ directory: migrationsDir, }); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 9bef42b26a..7e204d35df 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -208,7 +208,7 @@ describe('NunjucksWorkflowRunner', () => { }); await expect(runner.execute(task)).rejects.toThrow( - "Template action with ID 'does-not-exist' is not registered.", + /Template action with ID 'does-not-exist' is not registered/, ); }); @@ -707,6 +707,34 @@ describe('NunjucksWorkflowRunner', () => { expect(output.foo).toEqual('BACKSTAGE'); }); + + it('should include task ID in the templated context', async () => { + const task = createMockTaskWithSpec({ + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [ + { + id: 'test', + name: 'name', + action: 'jest-mock-action', + input: { + values: { + taskId: '${{context.task.id}}', + }, + }, + }, + ], + output: {}, + parameters: {}, + }); + + await runner.execute(task); + + expect(fakeActionHandler).toHaveBeenCalledWith( + expect.objectContaining({ + input: { values: { taskId: 'test-workspace' } }, + }), + ); + }); }); describe('redactions', () => { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index c5413a08e0..ad9d85cb2d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -80,6 +80,11 @@ type TemplateContext = { ref?: string; }; each?: JsonValue; + context: { + task: { + id: string; + }; + }; }; type CheckpointState = @@ -367,6 +372,9 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { await action.handler({ input: iteration.input, + task: { + id: await task.getWorkspaceName(), + }, secrets: task.secrets ?? {}, // TODO(blam): move to LoggerService and away from Winston logger: loggerToWinstonLogger(taskLogger), @@ -490,6 +498,11 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { parameters: task.spec.parameters, steps: {}, user: task.spec.user, + context: { + task: { + id: taskId, + }, + }, }; const [decision]: PolicyDecision[] = diff --git a/plugins/scaffolder-backend/src/service/router.test.ts b/plugins/scaffolder-backend/src/service/router.test.ts index 55d8b91293..42a89cc7f3 100644 --- a/plugins/scaffolder-backend/src/service/router.test.ts +++ b/plugins/scaffolder-backend/src/service/router.test.ts @@ -17,7 +17,6 @@ import { DatabaseManager, loggerToWinstonLogger, - PluginDatabaseManager, } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; @@ -52,6 +51,7 @@ import { AutocompleteHandler } from '@backstage/plugin-scaffolder-node/alpha'; import { UrlReaders } from '@backstage/backend-defaults/urlReader'; import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; import { EventsService } from '@backstage/plugin-events-node'; +import { DatabaseService } from '@backstage/backend-plugin-api'; const mockAccess = jest.fn(); @@ -68,7 +68,7 @@ jest.mock('fs-extra', () => ({ remove: jest.fn(), })); -function createDatabase(): PluginDatabaseManager { +function createDatabase(): DatabaseService { return DatabaseManager.fromConfig( new ConfigReader({ backend: { diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index d8888058e8..1758eb3fba 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -41,7 +41,7 @@ import { RESOURCE_TYPE_SCAFFOLDER_ACTION, RESOURCE_TYPE_SCAFFOLDER_TEMPLATE, scaffolderActionPermissions, - scaffolderTaskPermissions, + scaffolderPermissions, scaffolderTemplatePermissions, taskCancelPermission, taskCreatePermission, @@ -445,7 +445,7 @@ export async function createRouter( rules: actionRules, }, ], - permissions: scaffolderTaskPermissions, + permissions: scaffolderPermissions, }); router.use(permissionIntegrationRouter); diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 7f763a710b..b46354fee1 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-scaffolder-common +## 1.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## 1.5.8 + +### 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.2 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## 1.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.5.8-next.0 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index eecadc853f..b54d25937e 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-common", - "version": "1.5.8-next.0", + "version": "1.5.9-next.0", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", "backstage": { "role": "common-library", diff --git a/plugins/scaffolder-node-test-utils/CHANGELOG.md b/plugins/scaffolder-node-test-utils/CHANGELOG.md index 4b567eaeaa..ef36bb993a 100644 --- a/plugins/scaffolder-node-test-utils/CHANGELOG.md +++ b/plugins/scaffolder-node-test-utils/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-scaffolder-node-test-utils +## 0.1.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-test-utils@1.2.1-next.1 + - @backstage/plugin-scaffolder-node@0.6.3-next.1 + +## 0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.6.3-next.0 + - @backstage/backend-test-utils@1.2.1-next.0 + - @backstage/types@1.2.0 + +## 0.1.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@1.2.0 + - @backstage/plugin-scaffolder-node@0.6.2 + - @backstage/types@1.2.0 + +## 0.1.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@1.2.0-next.2 + - @backstage/plugin-scaffolder-node@0.6.2-next.2 + - @backstage/types@1.2.0 + ## 0.1.17-next.1 ### Patch Changes diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index e0348a5e68..a64aa4b411 100644 --- a/plugins/scaffolder-node-test-utils/package.json +++ b/plugins/scaffolder-node-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node-test-utils", - "version": "0.1.17-next.1", + "version": "0.1.18-next.1", "backstage": { "role": "node-library", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts b/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts index b178a1d51d..1d45051753 100644 --- a/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts +++ b/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts @@ -45,6 +45,9 @@ export const createMockActionContext = < input: {} as TActionInput, checkpoint: jest.fn(), getInitiatorCredentials: () => Promise.resolve(credentials), + task: { + id: 'mock-task-id', + }, }; const createDefaultWorkspace = () => ({ @@ -58,8 +61,15 @@ export const createMockActionContext = < }; } - const { input, logger, logStream, secrets, templateInfo, workspacePath } = - options; + const { + input, + logger, + logStream, + secrets, + templateInfo, + workspacePath, + task, + } = options; return { ...defaultContext, @@ -71,6 +81,7 @@ export const createMockActionContext = < ...(logStream && { logStream }), ...(input && { input }), ...(secrets && { secrets }), + ...(task && { task }), templateInfo, }; }; diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index f5ef6683ce..dd6f4aaa10 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-scaffolder-node +## 0.6.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/integration@1.16.1-next.0 + +## 0.6.3-next.0 + +### Patch Changes + +- 5d9e5c8: Added the ability to use `${{ context.task.id }}` in nunjucks templating, as well as `ctx.task.id` in actions to get the current task ID. +- 7dd0013: Deprecate the `logStream` option in `executeShellCommand`, replacing it with a logger instance. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/types@1.2.0 + - @backstage/plugin-scaffolder-common@1.5.8 + +## 0.6.2 + +### Patch Changes + +- c4ffd13: Added the autocomplete feature to GitlabRepoUrlPicker +- 1a23421: Make sure that isomorphic git push commands are not proxied. +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/types@1.2.0 + +## 0.6.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + ## 0.6.2-next.1 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 83eeb51836..97cf63dc4f 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node", - "version": "0.6.2-next.1", + "version": "0.6.3-next.1", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "node-library", diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index c14a689d1a..0afd6dc202 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -9,6 +9,7 @@ import { BackstageCredentials } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { Logger } from 'winston'; +import { LoggerService } from '@backstage/backend-plugin-api'; import { Observable } from '@backstage/types'; import { Schema } from 'jsonschema'; import { ScmIntegrationRegistry } from '@backstage/integration'; @@ -41,6 +42,9 @@ export type ActionContext< ): void; createTemporaryDirectory(): Promise; getInitiatorCredentials(): Promise; + task: { + id: string; + }; templateInfo?: TemplateInfo; isDryRun?: boolean; user?: { @@ -191,6 +195,7 @@ export type ExecuteShellCommandOptions = { command: string; args: string[]; options?: SpawnOptionsWithoutStdio; + logger?: LoggerService; logStream?: Writable; }; diff --git a/plugins/scaffolder-node/src/actions/executeShellCommand.test.ts b/plugins/scaffolder-node/src/actions/executeShellCommand.test.ts new file mode 100644 index 0000000000..67951f915c --- /dev/null +++ b/plugins/scaffolder-node/src/actions/executeShellCommand.test.ts @@ -0,0 +1,141 @@ +/* + * 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 { LoggerService } from '@backstage/backend-plugin-api'; +import { spawn } from 'child_process'; +import { PassThrough, Writable } from 'stream'; +import { executeShellCommand } from './executeShellCommand'; + +jest.mock('child_process', () => ({ + spawn: jest.fn(), +})); + +describe('executeShellCommand', () => { + let mockSpawn: jest.Mock; + let mockProcess: any; + let mockLogger: jest.Mocked; + let mockLogStream: Writable; + + beforeEach(() => { + mockSpawn = spawn as jest.Mock; + mockProcess = { + stdout: new PassThrough(), + stderr: new PassThrough(), + on: jest.fn((event: string, callback: (code: number) => void) => { + if (event === 'close') { + callback(0); + } + }), + }; + mockSpawn.mockReturnValue(mockProcess); + + mockLogStream = new PassThrough(); + + mockLogger = { + info: jest.fn(), + error: jest.fn(), + } as unknown as jest.Mocked; + jest.clearAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should execute without logger or logStream', async () => { + await executeShellCommand({ + command: 'echo', + args: ['Hello World'], + }); + + expect(mockSpawn).toHaveBeenCalledWith('echo', ['Hello World'], undefined); + }); + + it('should execute with logger but no logStream', async () => { + const logStreamSpy = jest.spyOn(mockLogStream, 'write'); + await executeShellCommand({ + command: 'echo', + args: ['Hello World'], + logger: mockLogger, + }); + + // Simulate command output + mockProcess.stdout.emit('data', Buffer.from('Hello World\n')); + + mockProcess.on('close', (code: any) => { + expect(code).toBe(0); + expect(logStreamSpy).not.toHaveBeenCalled(); + expect(mockLogger.info).toHaveBeenCalledWith('Hello World'); + expect(mockLogger.error).not.toHaveBeenCalledWith(expect.anything()); + }); + }); + + it('should execute with logStream but no logger', async () => { + const logStreamSpy = jest.spyOn(mockLogStream, 'write'); + + await executeShellCommand({ + command: 'echo', + args: ['Hello World'], + logStream: mockLogStream, + }); + + mockProcess.stdout.emit('data', Buffer.from('Hello World\n')); + mockProcess.stderr.emit('data', Buffer.from('Command not found\n')); + + mockProcess.on('close', () => { + expect(logStreamSpy).toHaveBeenCalledWith(expect.any(Buffer)); + expect(logStreamSpy).toHaveBeenCalledTimes(2); + expect(mockLogger.info).not.toHaveBeenCalled(); + }); + }); + + it('should execute with both logger and logStream', async () => { + const logStreamSpy = jest.spyOn(mockLogStream, 'write'); + + await executeShellCommand({ + command: 'echo', + args: ['Hello World'], + logger: mockLogger, + logStream: mockLogStream, + }); + + mockProcess.stdout.emit('data', Buffer.from('Hello World\n')); + mockProcess.stderr.emit('data', Buffer.from('Command not found\n')); + + mockProcess.on('close', () => { + expect(mockLogger.info).toHaveBeenCalledWith('Hello World'); + expect(mockLogger.error).toHaveBeenCalledWith('Command not found'); + expect(logStreamSpy).toHaveBeenCalledTimes(2); + }); + }); + + it('should handle non-zero exit code', async () => { + mockProcess.on.mockImplementation( + (event: string, callback: (arg0: number) => void) => { + if (event === 'close') { + callback(1); // Simulate command failing + } + }, + ); + + await expect( + executeShellCommand({ + command: 'echo', + args: ['Hello World'], + logger: mockLogger, + }), + ).rejects.toThrow('Command echo failed, exit code: 1'); + }); +}); diff --git a/plugins/scaffolder-node/src/actions/executeShellCommand.ts b/plugins/scaffolder-node/src/actions/executeShellCommand.ts index ce54989589..1d45d74327 100644 --- a/plugins/scaffolder-node/src/actions/executeShellCommand.ts +++ b/plugins/scaffolder-node/src/actions/executeShellCommand.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { LoggerService } from '@backstage/backend-plugin-api'; import { spawn, SpawnOptionsWithoutStdio } from 'child_process'; import { PassThrough, Writable } from 'stream'; @@ -29,7 +30,12 @@ export type ExecuteShellCommandOptions = { args: string[]; /** options to pass to spawn */ options?: SpawnOptionsWithoutStdio; - /** stream to capture stdout and stderr output */ + /** logger to capture stdout and stderr output */ + logger?: LoggerService; + /** + * stream to capture stdout and stderr output + * @deprecated please provide a logger instead. + */ logStream?: Writable; }; @@ -45,20 +51,25 @@ export async function executeShellCommand( command, args, options: spawnOptions, + logger, logStream = new PassThrough(), } = options; await new Promise((resolve, reject) => { const process = spawn(command, args, spawnOptions); - process.stdout.on('data', stream => { - logStream.write(stream); + process.stdout.on('data', chunk => { + logStream?.write(chunk); + logger?.info( + Buffer.isBuffer(chunk) ? chunk.toString('utf8').trim() : chunk.trim(), + ); }); - - process.stderr.on('data', stream => { - logStream.write(stream); + process.stderr.on('data', chunk => { + logStream?.write(chunk); + logger?.error( + Buffer.isBuffer(chunk) ? chunk.toString('utf8').trim() : chunk.trim(), + ); }); - process.on('error', error => { return reject(error); }); diff --git a/plugins/scaffolder-node/src/actions/types.ts b/plugins/scaffolder-node/src/actions/types.ts index 5dd9d5526f..171d3d82db 100644 --- a/plugins/scaffolder-node/src/actions/types.ts +++ b/plugins/scaffolder-node/src/actions/types.ts @@ -57,6 +57,13 @@ export type ActionContext< */ getInitiatorCredentials(): Promise; + /** + * Task information + */ + task: { + id: string; + }; + templateInfo?: TemplateInfo; /** diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index bed2f6d3e5..8d3cde2750 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,98 @@ # @backstage/plugin-scaffolder-react +## 1.14.3-next.2 + +### Patch Changes + +- 91bb99a: Fix field extension validation not working when field is in dependencies in an array field +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/theme@0.6.3 + - @backstage/version-bridge@1.0.10 + +## 1.14.3-next.1 + +### Patch Changes + +- d8f9079: Updated dependency `@rjsf/utils` to `5.23.2`. + Updated dependency `@rjsf/core` to `5.23.2`. + Updated dependency `@rjsf/material-ui` to `5.23.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.2`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + +## 1.14.3-next.0 + +### Patch Changes + +- 37421bc: Fixed scaffolder form fields not resolving correctly in the `useCustomFieldExtensions` hook. +- Updated dependencies + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-scaffolder-common@1.5.8 + +## 1.14.2 + +### 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 +- 28e286f: Added test coverage selectors to TemplateCard and its sub-components +- c846d76: Updated dependency `flatted` to `3.3.2`. +- 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`. +- 97a13ad: Improve performance of typing into scaffolder secret widget +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- 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.15.0 + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/catalog-client@1.9.0 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-permission-react@0.4.29 + +## 1.14.2-next.2 + +### Patch Changes + +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + ## 1.14.2-next.1 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index ecaea17fb5..9bb87b6544 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-react", - "version": "1.14.2-next.1", + "version": "1.14.3-next.2", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", "backstage": { "role": "web-library", @@ -73,10 +73,10 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", - "@rjsf/core": "5.23.1", - "@rjsf/material-ui": "5.23.1", - "@rjsf/utils": "5.23.1", - "@rjsf/validator-ajv8": "5.23.1", + "@rjsf/core": "5.23.2", + "@rjsf/material-ui": "5.23.2", + "@rjsf/utils": "5.23.2", + "@rjsf/validator-ajv8": "5.23.2", "@types/json-schema": "^7.0.9", "ajv-errors": "^3.0.0", "classnames": "^2.2.6", diff --git a/plugins/scaffolder-react/report-alpha.api.md b/plugins/scaffolder-react/report-alpha.api.md index 2cc8416b3c..4f9f86d1ac 100644 --- a/plugins/scaffolder-react/report-alpha.api.md +++ b/plugins/scaffolder-react/report-alpha.api.md @@ -5,13 +5,17 @@ ```ts /// +import { AnyApiFactory } from '@backstage/frontend-plugin-api'; import { AnyApiRef } from '@backstage/core-plugin-api'; import { ApiHolder } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { ComponentType } from 'react'; import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; import { CustomFieldValidator } from '@backstage/plugin-scaffolder-react'; import { Dispatch } from 'react'; import { ExtensionBlueprint } from '@backstage/frontend-plugin-api'; +import { ExtensionDefinition } from '@backstage/frontend-plugin-api'; +import { ExtensionInput } from '@backstage/frontend-plugin-api'; import { FieldExtensionComponentProps } from '@backstage/plugin-scaffolder-react'; import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import { FieldSchema } from '@backstage/plugin-scaffolder-react'; @@ -171,6 +175,34 @@ export type FormFieldExtensionData< schema?: FieldSchema, z.output>; }; +// @alpha (undocumented) +export const formFieldsApi: ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef; + inputs: { + formFields: ExtensionInput< + ConfigurableExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'form-fields'; + params: { + factory: AnyApiFactory; + }; +}>; + +// @alpha (undocumented) +export const formFieldsApiRef: ApiRef; + // @alpha (undocumented) export type FormValidation = { [name: string]: FieldValidation | FormValidation; @@ -245,6 +277,12 @@ export type ScaffolderFormDecoratorContext< ) => void; }; +// @alpha (undocumented) +export interface ScaffolderFormFieldsApi { + // (undocumented) + getFormFields(): Promise; +} + // @alpha (undocumented) export function ScaffolderPageContextMenu( props: ScaffolderPageContextMenuProps, diff --git a/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.test.tsx b/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.test.tsx new file mode 100644 index 0000000000..c21d43d6ff --- /dev/null +++ b/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.test.tsx @@ -0,0 +1,129 @@ +/* + * 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, { PropsWithChildren } from 'react'; +import { createPlugin } from '@backstage/core-plugin-api'; +import { TestApiProvider, wrapInTestApp } from '@backstage/test-utils'; +import { renderHook, waitFor } from '@testing-library/react'; +import { ScaffolderFormFieldsApi, formFieldsApiRef } from '../alpha'; +import { useCustomFieldExtensions } from './useCustomFieldExtensions'; +import { + ScaffolderFieldExtensions, + createScaffolderFieldExtension, +} from '../extensions'; + +const plugin = createPlugin({ + id: 'scaffolder', + apis: [], + routes: {}, + externalRoutes: {}, +}); + +describe('useCustomFieldExtensions', () => { + const mockFormFieldsApi: jest.Mocked = { + getFormFields: jest.fn(), + }; + const wrapper = ({ children }: PropsWithChildren<{}>) => + wrapInTestApp( + + {children} + , + ); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should return field extensions from the React tree', async () => { + mockFormFieldsApi.getFormFields.mockResolvedValue([]); + const CustomFieldExtension = plugin.provide( + createScaffolderFieldExtension({ + name: 'test', + component: () =>
Test
, + }), + ); + + const { result } = renderHook( + () => + useCustomFieldExtensions( + + + , + ), + { + wrapper, + }, + ); + + expect(result.current).toEqual([expect.objectContaining({ name: 'test' })]); + }); + + it('should return field extensions from formFieldsApi', async () => { + mockFormFieldsApi.getFormFields.mockResolvedValue([ + { + name: 'blueprint', + component: () =>
Test
, + }, + ]); + + const { result } = renderHook(() => useCustomFieldExtensions(
), { + wrapper, + }); + + await waitFor(() => { + expect(result.current.length).toBeGreaterThan(0); + }); + + expect(result.current).toEqual([ + expect.objectContaining({ name: 'blueprint' }), + ]); + }); + + it('should return field extensions from both sources', async () => { + mockFormFieldsApi.getFormFields.mockResolvedValue([ + { + name: 'blueprint', + component: () =>
Test
, + }, + ]); + + const CustomFieldExtension = plugin.provide( + createScaffolderFieldExtension({ + name: 'test', + component: () =>
Test
, + }), + ); + + const { result } = renderHook( + () => + useCustomFieldExtensions( + + + , + ), + { + wrapper, + }, + ); + + await waitFor(() => { + expect(result.current).toHaveLength(2); + }); + + const fieldNames = result.current.map(field => field.name); + expect(fieldNames).toEqual(expect.arrayContaining(['test', 'blueprint'])); + }); +}); diff --git a/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.ts b/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.ts index 7e0aafd53f..d44fc18e07 100644 --- a/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.ts +++ b/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.ts @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { useElementFilter } from '@backstage/core-plugin-api'; +import { useAsync, useMountEffect } from '@react-hookz/web'; +import { useApi, useElementFilter } from '@backstage/core-plugin-api'; +import { formFieldsApiRef } from '../next'; import { FieldExtensionOptions } from '../extensions'; import { FIELD_EXTENSION_KEY, @@ -25,11 +27,21 @@ import { * @public */ export const useCustomFieldExtensions = < + // todo(blam): this shouldn't be here, should remove this, but this is a breaking change to remove the generic. TComponentDataType = FieldExtensionOptions, >( outlet: React.ReactNode, ) => { - return useElementFilter(outlet, elements => + // Get custom fields created with FormFieldBlueprint + const formFieldsApi = useApi(formFieldsApiRef); + const [{ result: blueprintFields }, { execute }] = useAsync( + () => formFieldsApi.getFormFields(), + [], + ); + useMountEffect(execute); + + // Get custom fields created with ScaffolderFieldExtensions + const outletFields = useElementFilter(outlet, elements => elements .selectByComponentData({ key: FIELD_EXTENSION_WRAPPER_KEY, @@ -38,4 +50,18 @@ export const useCustomFieldExtensions = < key: FIELD_EXTENSION_KEY, }), ); + + // This should really be a different type moving foward, but we do this to keep type compatibility. + // should probably also move the defaults into the API eventually too, but that will come with the move + // to the new frontend system. + const blueprintsToLegacy: FieldExtensionOptions[] = blueprintFields?.map( + field => ({ + component: field.component, + name: field.name, + validation: field.validation, + schema: field.schema?.schema, + }), + ); + + return [...blueprintsToLegacy, ...outletFields] as TComponentDataType[]; }; diff --git a/plugins/scaffolder/src/alpha/api/FormFieldsApi.ts b/plugins/scaffolder-react/src/next/api/FormFieldsApi.ts similarity index 95% rename from plugins/scaffolder/src/alpha/api/FormFieldsApi.ts rename to plugins/scaffolder-react/src/next/api/FormFieldsApi.ts index 35141463d5..7712b91a18 100644 --- a/plugins/scaffolder/src/alpha/api/FormFieldsApi.ts +++ b/plugins/scaffolder-react/src/next/api/FormFieldsApi.ts @@ -21,7 +21,7 @@ import { } from '@backstage/frontend-plugin-api'; import { formFieldsApiRef } from './ref'; import { ScaffolderFormFieldsApi } from './types'; -import { FormFieldBlueprint } from '@backstage/plugin-scaffolder-react/alpha'; +import { FormFieldBlueprint } from '../blueprints'; import { FormField, OpaqueFormField } from '@internal/scaffolder'; class DefaultScaffolderFormFieldsApi implements ScaffolderFormFieldsApi { @@ -40,6 +40,7 @@ class DefaultScaffolderFormFieldsApi implements ScaffolderFormFieldsApi { } } +/** @alpha */ export const formFieldsApi = ApiBlueprint.makeWithOverrides({ name: 'form-fields', inputs: { diff --git a/plugins/scaffolder-react/src/next/api/index.ts b/plugins/scaffolder-react/src/next/api/index.ts new file mode 100644 index 0000000000..ecc62e5acf --- /dev/null +++ b/plugins/scaffolder-react/src/next/api/index.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 { formFieldsApi } from './FormFieldsApi'; +export { formFieldsApiRef } from './ref'; +export type { ScaffolderFormFieldsApi } from './types'; diff --git a/plugins/scaffolder-react/src/next/api/ref.ts b/plugins/scaffolder-react/src/next/api/ref.ts new file mode 100644 index 0000000000..eaa6f49c21 --- /dev/null +++ b/plugins/scaffolder-react/src/next/api/ref.ts @@ -0,0 +1,23 @@ +/* + * 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 { createApiRef } from '@backstage/frontend-plugin-api'; +import { ScaffolderFormFieldsApi } from './types'; + +/** @alpha */ +export const formFieldsApiRef = createApiRef({ + id: 'plugin.scaffolder.form-fields', +}); diff --git a/plugins/scaffolder-react/src/next/api/types.ts b/plugins/scaffolder-react/src/next/api/types.ts new file mode 100644 index 0000000000..2c98111b1c --- /dev/null +++ b/plugins/scaffolder-react/src/next/api/types.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 { FormFieldExtensionData } from '../blueprints'; + +/** @alpha */ +export interface ScaffolderFormFieldsApi { + getFormFields(): Promise; +} diff --git a/plugins/scaffolder-react/src/next/components/SecretWidget/SecretWidget.tsx b/plugins/scaffolder-react/src/next/components/SecretWidget/SecretWidget.tsx index 6b9094c199..25aec236fb 100644 --- a/plugins/scaffolder-react/src/next/components/SecretWidget/SecretWidget.tsx +++ b/plugins/scaffolder-react/src/next/components/SecretWidget/SecretWidget.tsx @@ -17,7 +17,8 @@ import { WidgetProps } from '@rjsf/utils'; import { useTemplateSecrets } from '@backstage/plugin-scaffolder-react'; import TextField from '@material-ui/core/TextField'; -import React from 'react'; +import React, { useMemo, useState } from 'react'; +import debounce from 'lodash/debounce'; /** * Secret Widget for overriding the default password input widget @@ -38,16 +39,31 @@ export const SecretWidget = ( disabled, } = props; + const [localValue, setLocalValue] = useState(secrets[name] ?? ''); + + // Memoize the debounced function so it persists across re-renders + const debouncedSetSecrets = useMemo( + () => + debounce((value: string) => { + setSecrets({ [name]: value }); + }, 300), + [setSecrets, name], + ); + + const handleChange = (e: React.ChangeEvent) => { + const newValue = e.target.value; + setLocalValue(newValue); + onChange(Array(newValue.length).fill('*').join('')); + debouncedSetSecrets(newValue); + }; + return ( { - onChange(Array(e.target.value.length).fill('*').join('')); - setSecrets({ [name]: e.target.value }); - }} - value={secrets[name] ?? ''} + onChange={handleChange} + value={localValue} type="password" autoComplete="off" required={required} diff --git a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts index f4dab376bc..02e15ec53b 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts @@ -435,4 +435,62 @@ describe('createAsyncValidators', () => { expect(validators.CustomLinkField).toHaveBeenCalled(); }); + + it('should validate field in the dependencies in an array field', async () => { + const schema: JsonObject = { + title: 'Make a choice', + properties: { + myArray: { + type: 'array', + title: 'Array', + items: { + type: 'object', + required: ['selector'], + properties: { + selector: { + title: 'Selector', + type: 'string', + enum: ['Choice 1', 'Choice 2'], + }, + }, + dependencies: { + selector: { + oneOf: [ + { properties: { selector: { enum: ['Choice 1'] } } }, + { + properties: { + selector: { enum: ['Choice 2'] }, + customValidatedField: { + title: 'Custom validated field', + type: 'string', + 'ui:field': 'ValidateKebabCase', + }, + }, + }, + ], + }, + }, + }, + }, + }, + }; + + const validators = { ValidateKebabCase: jest.fn() }; + + const validate = createAsyncValidators(schema, validators, { + apiHolder: { get: jest.fn() }, + }); + + await validate({ + myArray: [ + { + selector: 'Choice 2', + customValidatedField: 'apple', + }, + { selector: 'Choice 1' }, + ], + }); + + expect(validators.ValidateKebabCase).toHaveBeenCalled(); + }); }); diff --git a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts index d11d0b9b3b..b8ae3a6dfd 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts @@ -135,6 +135,26 @@ export const createAsyncValidators = ( for (const [, propValue] of Object.entries(properties)) { await doValidate(propValue); } + if (Array.isArray(value)) { + for (const [_, v] of Object.entries(value)) { + const { schema: itemSchema, uiSchema: itemUiSchema } = + extractSchemaFromStep(definitionInSchema.items); + + if (isObject(v)) { + for (const [pK, pV] of Object.entries(v)) { + if ('ui:field' in itemUiSchema[pK]) { + await validateForm( + itemUiSchema[pK]['ui:field'], + pK, + pV, + itemSchema, + itemUiSchema, + ); + } + } + } + } + } } else if (isObject(value)) { formValidation[key] = await validate(formData, pointer, value); } diff --git a/plugins/scaffolder-react/src/next/components/TemplateCard/CardLink.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/CardLink.tsx index 263a1356b7..4aa63e4555 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateCard/CardLink.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/CardLink.tsx @@ -19,7 +19,7 @@ import { Link } from '@backstage/core-components'; import { makeStyles } from '@material-ui/core/styles'; import React from 'react'; -interface CardLinkProps { +export interface CardLinkProps { icon: IconComponent; text: string; url: string; diff --git a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx index 5d2c8aa7fe..d8057b9867 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx @@ -15,67 +15,26 @@ */ import { RELATION_OWNED_BY } from '@backstage/catalog-model'; -import { MarkdownContent, UserIcon } from '@backstage/core-components'; -import { - IconComponent, - useAnalytics, - useApp, -} from '@backstage/core-plugin-api'; -import { - EntityRefLinks, - getEntityRelations, -} from '@backstage/plugin-catalog-react'; +import { IconComponent, useAnalytics } from '@backstage/core-plugin-api'; +import { getEntityRelations } from '@backstage/plugin-catalog-react'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; -import Box from '@material-ui/core/Box'; import Card from '@material-ui/core/Card'; import CardActions from '@material-ui/core/CardActions'; import CardContent from '@material-ui/core/CardContent'; -import Chip from '@material-ui/core/Chip'; import Divider from '@material-ui/core/Divider'; -import Button from '@material-ui/core/Button'; import Grid from '@material-ui/core/Grid'; import { makeStyles, Theme } from '@material-ui/core/styles'; -import LanguageIcon from '@material-ui/icons/Language'; import React, { useCallback } from 'react'; import { CardHeader } from './CardHeader'; -import { CardLink } from './CardLink'; import { usePermission } from '@backstage/plugin-permission-react'; import { taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha'; +import { TemplateCardContent } from './TemplateCardContent'; +import { TemplateCardTags } from './TemplateCardTags'; +import { TemplateCardLinks } from './TemplateCardLinks'; +import { TemplateCardActions } from './TemplateCardActions'; -const useStyles = makeStyles(theme => ({ - box: { - overflow: 'hidden', - textOverflow: 'ellipsis', - display: '-webkit-box', - '-webkit-line-clamp': 10, - '-webkit-box-orient': 'vertical', - }, - markdown: { - /** to make the styles for React Markdown not leak into the description */ - '& :first-child': { - margin: 0, - }, - }, - label: { - color: theme.palette.text.secondary, - textTransform: 'uppercase', - fontWeight: 'bold', - letterSpacing: 0.5, - lineHeight: 1, - fontSize: '0.75rem', - }, - footer: { - display: 'flex', - justifyContent: 'space-between', - flex: 1, - alignItems: 'center', - }, - ownedBy: { - display: 'flex', - alignItems: 'center', - flex: 1, - color: theme.palette.link, - }, +const useStyles = makeStyles(() => ({ + actionContainer: { padding: '16px', flex: 1, alignItems: 'flex-end' }, })); /** @@ -89,7 +48,6 @@ export interface TemplateCardProps { text: string; url: string; }[]; - onSelected?: (template: TemplateEntityV1beta3) => void; } @@ -98,16 +56,13 @@ export interface TemplateCardProps { * @alpha */ export const TemplateCard = (props: TemplateCardProps) => { - const { onSelected, template } = props; + const { additionalLinks, onSelected, template } = props; const styles = useStyles(); const analytics = useAnalytics(); const ownedByRelations = getEntityRelations(template, RELATION_OWNED_BY); - const app = useApp(); - const iconResolver = (key?: string): IconComponent => - key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon; const hasTags = !!template.metadata.tags?.length; const hasLinks = - !!props.additionalLinks?.length || !!template.metadata.links?.length; + !!additionalLinks?.length || !!template.metadata.links?.length; const displayDefaultDivider = !hasTags && !hasLinks; const { allowed: canCreateTask } = usePermission({ @@ -120,98 +75,33 @@ export const TemplateCard = (props: TemplateCardProps) => { return ( - + - - - - - - + + {displayDefaultDivider && ( )} - {hasTags && ( - <> - - - - - - {template.metadata.tags?.map(tag => ( - - - - ))} - - - - )} + {hasTags && } {hasLinks && ( - <> - - - - - - {props.additionalLinks?.map(({ icon, text, url }, index) => ( - - - - ))} - {template.metadata.links?.map( - ({ url, icon, title }, index) => ( - - - - ), - )} - - - + )} - -
-
- {ownedByRelations.length > 0 && ( - <> - - - - )} -
- {canCreateTask ? ( - - ) : null} -
+ +
); diff --git a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardActions.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardActions.tsx new file mode 100644 index 0000000000..e8a84487df --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardActions.tsx @@ -0,0 +1,86 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { UserIcon } from '@backstage/core-components'; +import { EntityRefLinks } from '@backstage/plugin-catalog-react'; +import Button from '@material-ui/core/Button'; +import { makeStyles, Theme } from '@material-ui/core/styles'; +import React from 'react'; + +const useStyles = makeStyles(theme => ({ + footer: { + display: 'flex', + justifyContent: 'space-between', + flex: 1, + alignItems: 'center', + }, + ownedBy: { + display: 'flex', + alignItems: 'center', + flex: 1, + color: theme.palette.link, + }, + actionContainer: { padding: '16px', flex: 1, alignItems: 'flex-end' }, +})); + +/** + * The Props for the {@link TemplateCardActions} component + * @alpha + */ +export interface TemplateCardActionsProps { + ownedByRelations: any; + canCreateTask: boolean; + handleChoose: () => void; +} +export const TemplateCardActions = ({ + canCreateTask, + handleChoose, + ownedByRelations, +}: TemplateCardActionsProps) => { + const styles = useStyles(); + + return ( +
+
+ {ownedByRelations.length > 0 && ( + <> + + + + )} +
+ {canCreateTask ? ( + + ) : null} +
+ ); +}; diff --git a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardContent.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardContent.tsx new file mode 100644 index 0000000000..fad5c85474 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardContent.tsx @@ -0,0 +1,59 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { MarkdownContent } from '@backstage/core-components'; +import type { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; +import { makeStyles } from '@material-ui/core/styles'; +import Box from '@material-ui/core/Box'; +import Grid from '@material-ui/core/Grid'; +import React from 'react'; + +const useStyles = makeStyles(() => ({ + box: { + overflow: 'hidden', + textOverflow: 'ellipsis', + display: '-webkit-box', + '-webkit-line-clamp': 10, + '-webkit-box-orient': 'vertical', + }, + markdown: { + /** to make the styles for React Markdown not leak into the description */ + '& :first-child': { + margin: 0, + }, + }, +})); + +/** + * The Props for the {@link TemplateCardContent} component + * @alpha + */ +export interface TemplateCardContentProps { + template: TemplateEntityV1beta3; +} +export const TemplateCardContent = ({ template }: TemplateCardContentProps) => { + const styles = useStyles(); + return ( + + + + + + ); +}; diff --git a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardLinks.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardLinks.tsx new file mode 100644 index 0000000000..f626875818 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardLinks.tsx @@ -0,0 +1,85 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { IconComponent, useApp } from '@backstage/core-plugin-api'; +import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; +import Divider from '@material-ui/core/Divider'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles, Theme } from '@material-ui/core/styles'; +import LanguageIcon from '@material-ui/icons/Language'; +import React from 'react'; +import { CardLink } from './CardLink'; + +const useStyles = makeStyles({}); + +/** + * The Props for the {@link TemplateCardLinks} component + * @alpha + */ +export interface TemplateCardLinksProps { + template: TemplateEntityV1beta3; + additionalLinks?: { + icon: IconComponent; + text: string; + url: string; + }[]; +} +export const TemplateCardLinks = ({ + template, + additionalLinks, +}: TemplateCardLinksProps) => { + const styles = useStyles(); + const app = useApp(); + const iconResolver = (key?: string): IconComponent => + key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon; + return ( + <> + + + + + + {additionalLinks?.map(({ icon, text, url }, index) => ( + + + + ))} + {template.metadata.links?.map(({ url, icon, title }, index) => ( + + + + ))} + + + + ); +}; diff --git a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardTags.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardTags.tsx new file mode 100644 index 0000000000..88550e2104 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCardTags.tsx @@ -0,0 +1,55 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; +import Chip from '@material-ui/core/Chip'; +import Divider from '@material-ui/core/Divider'; +import Grid from '@material-ui/core/Grid'; +import React from 'react'; + +/** + * The Props for the {@link TemplateCardTags} component + * @alpha + */ +export interface TemplateCardTagsProps { + template: TemplateEntityV1beta3; +} +export const TemplateCardTags = ({ template }: TemplateCardTagsProps) => ( + <> + + + + + + {template.metadata.tags?.map(tag => ( + + + + ))} + + + +); diff --git a/plugins/scaffolder-react/src/next/index.ts b/plugins/scaffolder-react/src/next/index.ts index c4e94f36a3..9c967a5db9 100644 --- a/plugins/scaffolder-react/src/next/index.ts +++ b/plugins/scaffolder-react/src/next/index.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +export * from './api'; export * from './components'; export * from './lib'; export * from './hooks'; diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index e4c99d833d..bfb6bfd934 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,112 @@ # @backstage/plugin-scaffolder +## 1.27.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.3-next.2 + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-scaffolder-common@1.5.9-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + +## 1.27.4-next.1 + +### Patch Changes + +- d8f9079: Updated dependency `@rjsf/utils` to `5.23.2`. + Updated dependency `@rjsf/core` to `5.23.2`. + Updated dependency `@rjsf/material-ui` to `5.23.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.2`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-scaffolder-react@1.14.3-next.1 + - @backstage/integration-react@1.2.2 + - @backstage/core-compat-api@0.3.4 + +## 1.27.4-next.0 + +### Patch Changes + +- 3f09ef4: Fix issue with `secrets` not being forwarded properly to the backend when creating a task +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.3-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/core-compat-api@0.3.4 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/errors@1.2.6 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/integration@1.16.0 + - @backstage/integration-react@1.2.2 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-scaffolder-common@1.5.8 + +## 1.27.2 + +### 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`. +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/integration@1.16.0 + - @backstage/plugin-scaffolder-common@1.5.8 + - @backstage/plugin-scaffolder-react@1.14.2 + - @backstage/catalog-client@1.9.0 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-react@0.4.29 + +## 1.27.2-next.2 + +### Patch Changes + +- 184161f: Scaffolder field extensions registered with `FormFieldBlueprint` are now collected in the `useCustomFieldExtensions` hook, enabling them for use in the scaffolder. +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/types@1.2.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-scaffolder-common@1.5.8-next.1 + ## 1.27.2-next.1 ### Patch Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 2f32b1ccd9..0790f6178f 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder", - "version": "1.27.2-next.1", + "version": "1.27.4-next.2", "description": "The Backstage plugin that helps you create new things", "backstage": { "role": "frontend-plugin", @@ -81,10 +81,10 @@ "@material-ui/lab": "4.0.0-alpha.61", "@microsoft/fetch-event-source": "^2.0.1", "@react-hookz/web": "^24.0.0", - "@rjsf/core": "5.23.1", - "@rjsf/material-ui": "5.23.1", - "@rjsf/utils": "5.23.1", - "@rjsf/validator-ajv8": "5.23.1", + "@rjsf/core": "5.23.2", + "@rjsf/material-ui": "5.23.2", + "@rjsf/utils": "5.23.2", + "@rjsf/validator-ajv8": "5.23.2", "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", "git-url-parse": "^15.0.0", diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md index 15ec32fa49..e272b57655 100644 --- a/plugins/scaffolder/report-alpha.api.md +++ b/plugins/scaffolder/report-alpha.api.md @@ -14,7 +14,7 @@ import { ExtensionInput } from '@backstage/frontend-plugin-api'; import { ExternalRouteRef } from '@backstage/frontend-plugin-api'; import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import { FormField } from '@internal/scaffolder'; -import { FormFieldExtensionData } from '@backstage/plugin-scaffolder-react/alpha'; +import { formFieldsApiRef } from '@backstage/plugin-scaffolder-react/alpha'; import type { FormProps as FormProps_2 } from '@rjsf/core'; import { FormProps as FormProps_3 } from '@backstage/plugin-scaffolder-react'; import { FrontendPlugin } from '@backstage/frontend-plugin-api'; @@ -26,6 +26,7 @@ import { default as React_2 } from 'react'; import { ReviewStepProps } from '@backstage/plugin-scaffolder-react'; import { RouteRef } from '@backstage/frontend-plugin-api'; import { ScaffolderFormDecorator } from '@backstage/plugin-scaffolder-react/alpha'; +import { ScaffolderFormFieldsApi } from '@backstage/plugin-scaffolder-react/alpha'; import { SubRouteRef } from '@backstage/frontend-plugin-api'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react'; @@ -52,6 +53,33 @@ const _default: FrontendPlugin< }>; }, { + 'api:scaffolder/form-fields': ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: { + formFields: ExtensionInput< + ConfigurableExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'form-fields'; + params: { + factory: AnyApiFactory; + }; + }>; 'page:scaffolder': ExtensionDefinition<{ kind: 'page'; name: undefined; @@ -129,33 +157,6 @@ const _default: FrontendPlugin< factory: AnyApiFactory; }; }>; - 'api:scaffolder/form-fields': ExtensionDefinition<{ - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: { - formFields: ExtensionInput< - ConfigurableExtensionDataRef< - () => Promise, - 'scaffolder.form-field-loader', - {} - >, - { - singleton: false; - optional: false; - } - >; - }; - kind: 'api'; - name: 'form-fields'; - params: { - factory: AnyApiFactory; - }; - }>; } >; export default _default; @@ -175,8 +176,7 @@ export class DefaultScaffolderFormDecoratorsApi // @alpha (undocumented) export const formDecoratorsApiRef: ApiRef; -// @alpha (undocumented) -export const formFieldsApiRef: ApiRef; +export { formFieldsApiRef }; // @alpha @deprecated export type FormProps = Pick< @@ -197,11 +197,7 @@ export interface ScaffolderFormDecoratorsApi { getFormDecorators(): Promise; } -// @alpha (undocumented) -export interface ScaffolderFormFieldsApi { - // (undocumented) - getFormFields(): Promise; -} +export { ScaffolderFormFieldsApi }; // @public (undocumented) export type ScaffolderTemplateEditorClassKey = diff --git a/plugins/scaffolder/src/alpha/api/index.ts b/plugins/scaffolder/src/alpha/api/index.ts index 0afefe17a5..07d4b65a3b 100644 --- a/plugins/scaffolder/src/alpha/api/index.ts +++ b/plugins/scaffolder/src/alpha/api/index.ts @@ -14,9 +14,6 @@ * limitations under the License. */ -export { formFieldsApiRef, formDecoratorsApiRef } from './ref'; -export type { - ScaffolderFormFieldsApi, - ScaffolderFormDecoratorsApi, -} from './types'; +export { formDecoratorsApiRef } from './ref'; +export type { ScaffolderFormDecoratorsApi } from './types'; export { DefaultScaffolderFormDecoratorsApi } from './FormDecoratorsApi'; diff --git a/plugins/scaffolder/src/alpha/api/ref.ts b/plugins/scaffolder/src/alpha/api/ref.ts index 9890a9a9b2..532669d0ad 100644 --- a/plugins/scaffolder/src/alpha/api/ref.ts +++ b/plugins/scaffolder/src/alpha/api/ref.ts @@ -15,12 +15,7 @@ */ import { createApiRef } from '@backstage/frontend-plugin-api'; -import { ScaffolderFormFieldsApi, ScaffolderFormDecoratorsApi } from './types'; - -/** @alpha */ -export const formFieldsApiRef = createApiRef({ - id: 'plugin.scaffolder.form-fields', -}); +import { ScaffolderFormDecoratorsApi } from './types'; /** @alpha */ export const formDecoratorsApiRef = createApiRef({ diff --git a/plugins/scaffolder/src/alpha/api/types.ts b/plugins/scaffolder/src/alpha/api/types.ts index 10f97a6a10..1d2d331adf 100644 --- a/plugins/scaffolder/src/alpha/api/types.ts +++ b/plugins/scaffolder/src/alpha/api/types.ts @@ -14,15 +14,7 @@ * limitations under the License. */ -import { - FormFieldExtensionData, - ScaffolderFormDecorator, -} from '@backstage/plugin-scaffolder-react/alpha'; - -/** @alpha */ -export interface ScaffolderFormFieldsApi { - getFormFields(): Promise; -} +import { ScaffolderFormDecorator } from '@backstage/plugin-scaffolder-react/alpha'; /** @alpha */ export interface ScaffolderFormDecoratorsApi { diff --git a/plugins/scaffolder/src/alpha/hooks/useFormDecorators.test.tsx b/plugins/scaffolder/src/alpha/hooks/useFormDecorators.test.tsx index 92475c3eea..8f486bbba1 100644 --- a/plugins/scaffolder/src/alpha/hooks/useFormDecorators.test.tsx +++ b/plugins/scaffolder/src/alpha/hooks/useFormDecorators.test.tsx @@ -81,4 +81,75 @@ describe('useFormDecorators', () => { expect(mockApiImplementation.test).toHaveBeenCalledWith('hello'); }); }); + + it('should return existing secrets and formstate', async () => { + const renderedHook = renderHook(() => useFormDecorators({ manifest }), { + wrapper: ({ children }) => ( + {} }], + ]} + > + {children} + + ), + }); + await waitFor(async () => { + const result = renderedHook.result.current!; + + const { secrets, formState } = await result.run({ + formState: { test: 'formState' }, + secrets: { test: 'hello' }, + }); + + expect(secrets).toEqual({ test: 'hello' }); + expect(formState).toEqual({ test: 'formState' }); + }); + }); + + it('should allow merging of existing secrets and formstate', async () => { + const secretAndFormDataModifier = createScaffolderFormDecorator({ + id: 'test', + async decorator({ setFormState, setSecrets }) { + setFormState(state => ({ ...state, new: 'formState' })); + setSecrets(state => ({ ...state, new: 'hello' })); + }, + }); + const renderedHook = renderHook(() => useFormDecorators({ manifest }), { + wrapper: ({ children }) => ( + {} }], + ]} + > + {children} + + ), + }); + await waitFor(async () => { + const result = renderedHook.result.current!; + + const { secrets, formState } = await result.run({ + formState: { test: 'formState' }, + secrets: { test: 'hello' }, + }); + + expect(secrets).toEqual({ test: 'hello', new: 'hello' }); + expect(formState).toEqual({ test: 'formState', new: 'formState' }); + }); + }); }); diff --git a/plugins/scaffolder/src/alpha/hooks/useFormDecorators.ts b/plugins/scaffolder/src/alpha/hooks/useFormDecorators.ts index 8469a89bec..d74c4a9823 100644 --- a/plugins/scaffolder/src/alpha/hooks/useFormDecorators.ts +++ b/plugins/scaffolder/src/alpha/hooks/useFormDecorators.ts @@ -75,7 +75,7 @@ export const useFormDecorators = ({ secrets: Record; }) => { let formState: Record = { ...opts.formState }; - let secrets: Record = {}; + let secrets: Record = { ...opts.secrets }; if (manifest?.EXPERIMENTAL_formDecorators) { // for each of the form decorators, go and call the decorator with the context diff --git a/plugins/scaffolder/src/alpha/index.ts b/plugins/scaffolder/src/alpha/index.ts index 53e2b8f0bf..d239f44b4f 100644 --- a/plugins/scaffolder/src/alpha/index.ts +++ b/plugins/scaffolder/src/alpha/index.ts @@ -25,4 +25,9 @@ export { export { scaffolderTranslationRef } from '../translation'; export * from './api'; +export { + formFieldsApiRef, + type ScaffolderFormFieldsApi, +} from '@backstage/plugin-scaffolder-react/alpha'; + export { default } from './plugin'; diff --git a/plugins/scaffolder/src/alpha/plugin.tsx b/plugins/scaffolder/src/alpha/plugin.tsx index f3f0e9ed9e..44ec1f5d4c 100644 --- a/plugins/scaffolder/src/alpha/plugin.tsx +++ b/plugins/scaffolder/src/alpha/plugin.tsx @@ -32,7 +32,7 @@ import { scaffolderPage, scaffolderApi, } from './extensions'; -import { formFieldsApi } from './api/FormFieldsApi'; +import { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha'; /** @alpha */ export default createFrontendPlugin({ diff --git a/plugins/scaffolder/src/components/Router/Router.test.tsx b/plugins/scaffolder/src/components/Router/Router.test.tsx index c062c723cf..9c752ed3c1 100644 --- a/plugins/scaffolder/src/components/Router/Router.test.tsx +++ b/plugins/scaffolder/src/components/Router/Router.test.tsx @@ -15,7 +15,11 @@ */ import React from 'react'; import { Router } from './Router'; -import { renderInTestApp } from '@backstage/test-utils'; +import { + renderInTestApp, + TestApiProvider, + TestAppOptions, +} from '@backstage/test-utils'; import { createScaffolderFieldExtension, ScaffolderFieldExtensions, @@ -26,12 +30,26 @@ import { ScaffolderLayouts, } from '@backstage/plugin-scaffolder-react'; import { TemplateListPage, TemplateWizardPage } from '../../alpha/components'; +import { formFieldsApiRef } from '@backstage/plugin-scaffolder-react/alpha'; jest.mock('../../alpha/components', () => ({ TemplateWizardPage: jest.fn(() => null), TemplateListPage: jest.fn(() => null), })); +const wrapInApisAndRender = ( + element: React.ReactElement, + opts?: TestAppOptions, +) => + renderInTestApp( + [] }]]} + > + {element} + , + opts, + ); + describe('Router', () => { beforeEach(() => { (TemplateWizardPage as jest.Mock).mockClear(); @@ -39,13 +57,13 @@ describe('Router', () => { }); describe('/', () => { it('should render the TemplateListPage', async () => { - await renderInTestApp(); + await wrapInApisAndRender(); expect(TemplateListPage).toHaveBeenCalled(); }); it('should render user-provided TemplateListPage', async () => { - const { getByText } = await renderInTestApp( + const { getByText } = await wrapInApisAndRender( <>foobar, @@ -62,7 +80,7 @@ describe('Router', () => { describe('/templates/:templateName', () => { it('should render the TemplateWizard page', async () => { - await renderInTestApp(, { + await wrapInApisAndRender(, { routeEntries: ['/templates/default/foo'], }); @@ -70,7 +88,7 @@ describe('Router', () => { }); it('should render user-provided TemplateWizardPage', async () => { - const { getByText } = await renderInTestApp( + const { getByText } = await wrapInApisAndRender( <>foobar, @@ -87,13 +105,14 @@ describe('Router', () => { it('should pass through the FormProps property', async () => { const transformErrorsMock = jest.fn(); - await renderInTestApp( + await wrapInApisAndRender( , + { routeEntries: ['/templates/default/foo'], }, @@ -118,7 +137,7 @@ describe('Router', () => { }), ); - await renderInTestApp( + await wrapInApisAndRender( @@ -146,7 +165,7 @@ describe('Router', () => { }), ); - await renderInTestApp( + await wrapInApisAndRender( diff --git a/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.test.tsx b/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.test.tsx index e7b12f42c0..1fe7ffb17e 100644 --- a/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.test.tsx +++ b/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.test.tsx @@ -90,7 +90,7 @@ describe('', () => { @@ -113,7 +113,7 @@ describe('', () => { diff --git a/plugins/scaffolder/src/components/fields/SecretInput/SecretInput.test.tsx b/plugins/scaffolder/src/components/fields/SecretInput/SecretInput.test.tsx index fa810b9d17..dd88b9986c 100644 --- a/plugins/scaffolder/src/components/fields/SecretInput/SecretInput.test.tsx +++ b/plugins/scaffolder/src/components/fields/SecretInput/SecretInput.test.tsx @@ -22,7 +22,7 @@ import { SecretInput } from './SecretInput'; import { renderInTestApp } from '@backstage/test-utils'; import { Form } from '@backstage/plugin-scaffolder-react/alpha'; import validator from '@rjsf/validator-ajv8'; -import { fireEvent, act } from '@testing-library/react'; +import { fireEvent, act, waitFor } from '@testing-library/react'; describe('', () => { const SecretsComponent = () => { @@ -63,8 +63,15 @@ describe('', () => { fireEvent.change(secretInput, { target: { value: mockSecret } }); }); - const { secrets } = JSON.parse(getByTestId('current-secrets').textContent!); - - expect(secrets.myKey).toBe(mockSecret); + // Wait for the debounced update to occur + await waitFor( + () => { + const { secrets } = JSON.parse( + getByTestId('current-secrets').textContent!, + ); + expect(secrets.myKey).toBe(mockSecret); + }, + { timeout: 500 }, + ); }); }); diff --git a/plugins/scaffolder/src/plugin.tsx b/plugins/scaffolder/src/plugin.tsx index a6ccdef32c..17592b5826 100644 --- a/plugins/scaffolder/src/plugin.tsx +++ b/plugins/scaffolder/src/plugin.tsx @@ -80,6 +80,7 @@ import { RepoBranchPicker } from './components/fields/RepoBranchPicker/RepoBranc import { RepoBranchPickerSchema } from './components/fields/RepoBranchPicker/schema'; import { formDecoratorsApiRef } from './alpha/api/ref'; import { DefaultScaffolderFormDecoratorsApi } from './alpha/api/FormDecoratorsApi'; +import { formFieldsApiRef } from '@backstage/plugin-scaffolder-react/alpha'; /** * The main plugin export for the scaffolder. @@ -109,6 +110,11 @@ export const scaffolderPlugin = createPlugin({ deps: {}, factory: () => DefaultScaffolderFormDecoratorsApi.create(), }), + createApiFactory({ + api: formFieldsApiRef, + deps: {}, + factory: () => ({ getFormFields: async () => [] }), + }), ], routes: { root: rootRouteRef, diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index 50426ca6d4..8886563f06 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,77 @@ # @backstage/plugin-search-backend-module-catalog +## 0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## 0.3.0-next.0 + +### Minor Changes + +- dd515e3: **BREAKING**: Removed support for the old backend system. Please [migrate to the new backend system](https://backstage.io/docs/backend-system/) and enable [the catalog collator](https://backstage.io/docs/features/search/collators#catalog) there. + + As part of this, the `/alpha` export path is gone too. Just import the module from the root of the package as usual instead. + +### Patch Changes + +- 1e09b06: Internal refactor to use cursor based pagination +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## 0.2.6 + +### Patch Changes + +- ed0aaec: Update README +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.2.6-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index 1f96cbbcdd..4e7b30893d 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-catalog", - "version": "0.2.6-next.1", + "version": "0.3.0-next.1", "description": "A module for the search backend that exports catalog modules", "backstage": { "role": "backend-plugin-module", @@ -8,7 +8,9 @@ "pluginPackage": "@backstage/plugin-search-backend" }, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" }, "homepage": "https://backstage.io", "repository": { @@ -17,23 +19,8 @@ "directory": "plugins/search-backend-module-catalog" }, "license": "Apache-2.0", - "exports": { - ".": "./src/index.ts", - "./alpha": "./src/alpha.ts", - "./package.json": "./package.json" - }, "main": "src/index.ts", "types": "src/index.ts", - "typesVersions": { - "*": { - "alpha": [ - "src/alpha.ts" - ], - "package.json": [ - "package.json" - ] - } - }, "files": [ "dist", "config.d.ts" @@ -48,7 +35,6 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", diff --git a/plugins/search-backend-module-catalog/report-alpha.api.md b/plugins/search-backend-module-catalog/report-alpha.api.md deleted file mode 100644 index a622e05a3e..0000000000 --- a/plugins/search-backend-module-catalog/report-alpha.api.md +++ /dev/null @@ -1,13 +0,0 @@ -## API Report File for "@backstage/plugin-search-backend-module-catalog" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts -import { BackendFeature } from '@backstage/backend-plugin-api'; - -// @alpha (undocumented) -const _feature: BackendFeature; -export default _feature; - -// (No @packageDocumentation comment for this package) -``` diff --git a/plugins/search-backend-module-catalog/report.api.md b/plugins/search-backend-module-catalog/report.api.md index 76314dcdf5..ab20ea29d3 100644 --- a/plugins/search-backend-module-catalog/report.api.md +++ b/plugins/search-backend-module-catalog/report.api.md @@ -3,22 +3,10 @@ > 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 { BackendFeature } from '@backstage/backend-plugin-api'; -import { CatalogApi } from '@backstage/catalog-client'; -import { CatalogCollatorEntityTransformer as CatalogCollatorEntityTransformer_2 } from '@backstage/plugin-search-backend-module-catalog'; import { CatalogEntityDocument } from '@backstage/plugin-catalog-common'; -import { Config } from '@backstage/config'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; -import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; import { Entity } from '@backstage/catalog-model'; import { ExtensionPoint } from '@backstage/backend-plugin-api'; -import { GetEntitiesRequest } from '@backstage/catalog-client'; -import { Permission } from '@backstage/plugin-permission-common'; -import { Readable } from 'stream'; -import { TokenManager } from '@backstage/backend-common'; // @public (undocumented) export type CatalogCollatorEntityTransformer = ( @@ -27,43 +15,16 @@ export type CatalogCollatorEntityTransformer = ( // @public export type CatalogCollatorExtensionPoint = { - setEntityTransformer(transformer: CatalogCollatorEntityTransformer_2): void; + setEntityTransformer(transformer: CatalogCollatorEntityTransformer): void; }; // @public export const catalogCollatorExtensionPoint: ExtensionPoint; -// @public -const _default: BackendFeature; -export default _default; - // @public (undocumented) export const defaultCatalogCollatorEntityTransformer: CatalogCollatorEntityTransformer; -// @public @deprecated -export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { - // (undocumented) - static fromConfig( - configRoot: Config, - options: DefaultCatalogCollatorFactoryOptions, - ): DefaultCatalogCollatorFactory; - // (undocumented) - getCollator(): Promise; - // (undocumented) - readonly type = 'software-catalog'; - // (undocumented) - readonly visibilityPermission: Permission; -} - -// @public @deprecated (undocumented) -export type DefaultCatalogCollatorFactoryOptions = { - auth?: AuthService; - discovery: DiscoveryService; - tokenManager?: TokenManager; - locationTemplate?: string; - filter?: GetEntitiesRequest['filter']; - batchSize?: number; - catalogClient?: CatalogApi; - entityTransformer?: CatalogCollatorEntityTransformer; -}; +// @public +const searchModuleCatalogCollator: BackendFeature; +export default searchModuleCatalogCollator; ``` diff --git a/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.test.ts b/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.test.ts index 32a6f8b701..68aedbdef8 100644 --- a/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.test.ts +++ b/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.test.ts @@ -14,17 +14,12 @@ * limitations under the License. */ -import { registerMswTestHooks } from '@backstage/backend-test-utils'; +import { mockServices } from '@backstage/backend-test-utils'; import { Entity } from '@backstage/catalog-model'; -import { ConfigReader } from '@backstage/config'; +import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; import { TestPipeline } from '@backstage/plugin-search-backend-node'; -import { rest } from 'msw'; -import { setupServer } from 'msw/node'; import { Readable } from 'stream'; import { DefaultCatalogCollatorFactory } from './DefaultCatalogCollatorFactory'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; - -const server = setupServer(); const expectedEntities: Entity[] = [ { @@ -57,44 +52,19 @@ const expectedEntities: Entity[] = [ ]; describe('DefaultCatalogCollatorFactory', () => { - const config = new ConfigReader({}); - const mockDiscoveryApi: jest.Mocked = { - getBaseUrl: jest.fn().mockResolvedValue('http://localhost:7007'), - getExternalBaseUrl: jest.fn(), - }; - - const options = { - discovery: mockDiscoveryApi, - }; - - registerMswTestHooks(server); - - beforeEach(() => { - server.use( - rest.get('http://localhost:7007/entities', (req, res, ctx) => { - if (req.url.searchParams.has('filter')) { - const filter = req.url.searchParams.get('filter'); - if (filter === 'kind=Foo,kind=Bar') { - // When filtering on the 'Foo,Bar' kinds we simply return no items, to simulate a filter - return res(ctx.json([])); - } - throw new Error('Unexpected filter parameter'); - } - - // Imitate offset/limit pagination. - const offset = parseInt(req.url.searchParams.get('offset') || '0', 10); - const limit = parseInt(req.url.searchParams.get('limit') || '500', 10); - return res(ctx.json(expectedEntities.slice(offset, limit + offset))); - }), - ); - }); + const config = mockServices.rootConfig(); + const auth = mockServices.auth(); + const catalog = catalogServiceMock({ entities: expectedEntities }); describe('getCollator', () => { let factory: DefaultCatalogCollatorFactory; let collator: Readable; beforeEach(async () => { - factory = DefaultCatalogCollatorFactory.fromConfig(config, options); + factory = DefaultCatalogCollatorFactory.fromConfig(config, { + auth, + catalog, + }); collator = await factory.getCollator(); }); @@ -105,7 +75,6 @@ describe('DefaultCatalogCollatorFactory', () => { it('fetches from the configured catalog service', async () => { const pipeline = TestPipeline.fromCollator(collator); const { documents } = await pipeline.execute(); - expect(mockDiscoveryApi.getBaseUrl).toHaveBeenCalledWith('catalog'); expect(documents).toHaveLength(expectedEntities.length); }); @@ -145,7 +114,8 @@ describe('DefaultCatalogCollatorFactory', () => { it('maps a returned entity to an expected CatalogEntityDocument with custom transformer', async () => { const customFactory = DefaultCatalogCollatorFactory.fromConfig(config, { - ...options, + auth, + catalog, entityTransformer: entity => ({ title: `custom-title-${ entity.metadata.title ?? entity.metadata.name @@ -200,10 +170,19 @@ describe('DefaultCatalogCollatorFactory', () => { it('maps a returned entity with a custom locationTemplate', async () => { // Provide an alternate location template. - factory = DefaultCatalogCollatorFactory.fromConfig(new ConfigReader({}), { - discovery: mockDiscoveryApi, - locationTemplate: '/software/:name', - }); + factory = DefaultCatalogCollatorFactory.fromConfig( + mockServices.rootConfig({ + data: { + search: { + collators: { catalog: { locationTemplate: '/software/:name' } }, + }, + }, + }), + { + auth, + catalog, + }, + ); collator = await factory.getCollator(); const pipeline = TestPipeline.fromCollator(collator); @@ -215,12 +194,19 @@ describe('DefaultCatalogCollatorFactory', () => { it('allows filtering of the retrieved catalog entities', async () => { // Provide a custom filter. - factory = DefaultCatalogCollatorFactory.fromConfig(new ConfigReader({}), { - discovery: mockDiscoveryApi, - filter: { - kind: ['Foo', 'Bar'], + factory = DefaultCatalogCollatorFactory.fromConfig( + mockServices.rootConfig({ + data: { + search: { + collators: { catalog: { filter: { kind: ['Foo', 'Bar'] } } }, + }, + }, + }), + { + auth, + catalog, }, - }); + ); collator = await factory.getCollator(); const pipeline = TestPipeline.fromCollator(collator); @@ -231,10 +217,19 @@ describe('DefaultCatalogCollatorFactory', () => { }); it('paginates through catalog entities using batchSize', async () => { - factory = DefaultCatalogCollatorFactory.fromConfig(config, { - ...options, - batchSize: 1, - }); + factory = DefaultCatalogCollatorFactory.fromConfig( + mockServices.rootConfig({ + data: { + search: { + collators: { catalog: { batchSize: 1 } }, + }, + }, + }), + { + auth, + catalog, + }, + ); collator = await factory.getCollator(); const pipeline = TestPipeline.fromCollator(collator); diff --git a/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts b/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts index 11d72c156b..1cef2e21df 100644 --- a/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts +++ b/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts @@ -14,49 +14,24 @@ * limitations under the License. */ -import { - TokenManager, - createLegacyAuthAdapters, -} from '@backstage/backend-common'; -import { - CatalogApi, - CatalogClient, - GetEntitiesRequest, -} from '@backstage/catalog-client'; +import { AuthService } from '@backstage/backend-plugin-api'; +import { QueryEntitiesInitialRequest } from '@backstage/catalog-client'; import { stringifyEntityRef } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import { CatalogEntityDocument } from '@backstage/plugin-catalog-common'; import { catalogEntityReadPermission } from '@backstage/plugin-catalog-common/alpha'; +import { CatalogService } from '@backstage/plugin-catalog-node'; import { Permission } from '@backstage/plugin-permission-common'; import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; import { Readable } from 'stream'; import { CatalogCollatorEntityTransformer } from './CatalogCollatorEntityTransformer'; import { readCollatorConfigOptions } from './config'; import { defaultCatalogCollatorEntityTransformer } from './defaultCatalogCollatorEntityTransformer'; -import { AuthService, DiscoveryService } from '@backstage/backend-plugin-api'; -/** - * @public - * @deprecated This type is deprecated along with the {@link DefaultCatalogCollatorFactory}. - */ export type DefaultCatalogCollatorFactoryOptions = { - auth?: AuthService; - discovery: DiscoveryService; - tokenManager?: TokenManager; - /** - * @deprecated Use the config key `search.collators.catalog.locationTemplate` instead. - */ - locationTemplate?: string; - /** - * @deprecated Use the config key `search.collators.catalog.filter` instead. - */ - filter?: GetEntitiesRequest['filter']; - /** - * @deprecated Use the config key `search.collators.catalog.batchSize` instead. - */ - batchSize?: number; - catalogClient?: CatalogApi; - /** + auth: AuthService; + catalog: CatalogService; + /* * Allows you to customize how entities are shaped into documents. */ entityTransformer?: CatalogCollatorEntityTransformer; @@ -64,9 +39,6 @@ export type DefaultCatalogCollatorFactoryOptions = { /** * Collates entities from the Catalog into documents for the search backend. - * - * @public - * @deprecated Migrate to the {@link https://backstage.io/docs/backend-system/building-backends/migrating | new backend system} and install this collator via module instead (see {@link https://github.com/backstage/backstage/blob/nbs10/search-deprecate-create-router/plugins/search-backend-module-catalog/README.md#installation | here} for more installation details). */ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { public readonly type = 'software-catalog'; @@ -74,9 +46,9 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { catalogEntityReadPermission; private locationTemplate: string; - private filter?: GetEntitiesRequest['filter']; + private filter?: QueryEntitiesInitialRequest['filter']; private batchSize: number; - private readonly catalogClient: CatalogApi; + private readonly catalog: CatalogService; private entityTransformer: CatalogCollatorEntityTransformer; private auth: AuthService; @@ -85,47 +57,37 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { options: DefaultCatalogCollatorFactoryOptions, ) { const configOptions = readCollatorConfigOptions(configRoot); - const { auth: adaptedAuth } = createLegacyAuthAdapters({ - auth: options.auth, - discovery: options.discovery, - tokenManager: options.tokenManager, - }); return new DefaultCatalogCollatorFactory({ - locationTemplate: - options.locationTemplate ?? configOptions.locationTemplate, - filter: options.filter ?? configOptions.filter, - batchSize: options.batchSize ?? configOptions.batchSize, + locationTemplate: configOptions.locationTemplate, + filter: configOptions.filter, + batchSize: configOptions.batchSize, entityTransformer: options.entityTransformer, - auth: adaptedAuth, - discovery: options.discovery, - catalogClient: options.catalogClient, + auth: options.auth, + catalog: options.catalog, }); } private constructor(options: { locationTemplate: string; - filter: GetEntitiesRequest['filter']; + filter: QueryEntitiesInitialRequest['filter']; batchSize: number; entityTransformer?: CatalogCollatorEntityTransformer; auth: AuthService; - discovery: DiscoveryService; - catalogClient?: CatalogApi; + catalog: CatalogService; }) { const { auth, batchSize, - discovery, locationTemplate, filter, - catalogClient, + catalog, entityTransformer, } = options; this.locationTemplate = locationTemplate; this.filter = filter; this.batchSize = batchSize; - this.catalogClient = - catalogClient || new CatalogClient({ discoveryApi: discovery }); + this.catalog = catalog; this.entityTransformer = entityTransformer ?? defaultCatalogCollatorEntityTransformer; this.auth = auth; @@ -137,32 +99,21 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { private async *execute(): AsyncGenerator { let entitiesRetrieved = 0; - let moreEntitiesToGet = true; + let cursor: string | undefined = undefined; - // Offset/limit pagination is used on the Catalog Client in order to - // limit (and allow some control over) memory used by the search backend - // at index-time. - while (moreEntitiesToGet) { - const { token } = await this.auth.getPluginRequestToken({ - onBehalfOf: await this.auth.getOwnServiceCredentials(), - targetPluginId: 'catalog', - }); - const entities = ( - await this.catalogClient.getEntities( - { - filter: this.filter, - limit: this.batchSize, - offset: entitiesRetrieved, - }, - { token }, - ) - ).items; + do { + const response = await this.catalog.queryEntities( + { + filter: this.filter, + limit: this.batchSize, + ...(cursor ? { cursor } : {}), + }, + { credentials: await this.auth.getOwnServiceCredentials() }, + ); + cursor = response.pageInfo.nextCursor; + entitiesRetrieved += response.items.length; - // Control looping through entity batches. - moreEntitiesToGet = entities.length === this.batchSize; - entitiesRetrieved += entities.length; - - for (const entity of entities) { + for (const entity of response.items) { yield { ...this.entityTransformer(entity), authorization: { @@ -175,7 +126,7 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { }), }; } - } + } while (cursor); } private applyArgsToFormat( diff --git a/plugins/search-backend-module-catalog/src/collators/index.ts b/plugins/search-backend-module-catalog/src/collators/index.ts index 5876e71a02..d4fbbab760 100644 --- a/plugins/search-backend-module-catalog/src/collators/index.ts +++ b/plugins/search-backend-module-catalog/src/collators/index.ts @@ -14,8 +14,5 @@ * limitations under the License. */ -export { DefaultCatalogCollatorFactory } from './DefaultCatalogCollatorFactory'; -export type { DefaultCatalogCollatorFactoryOptions } from './DefaultCatalogCollatorFactory'; - export { defaultCatalogCollatorEntityTransformer } from './defaultCatalogCollatorEntityTransformer'; export type { CatalogCollatorEntityTransformer } from './CatalogCollatorEntityTransformer'; diff --git a/plugins/search-backend-module-catalog/src/index.ts b/plugins/search-backend-module-catalog/src/index.ts index 3e0ec59cc0..e6c5b96173 100644 --- a/plugins/search-backend-module-catalog/src/index.ts +++ b/plugins/search-backend-module-catalog/src/index.ts @@ -16,9 +16,13 @@ /** * @packageDocumentation + * * A module for the search backend that exports Catalog modules. */ -export * from './module'; -export { default } from './module'; +export { + type CatalogCollatorExtensionPoint, + catalogCollatorExtensionPoint, + searchModuleCatalogCollator as default, +} from './module'; export * from './collators'; diff --git a/plugins/search-backend-module-catalog/src/module.test.ts b/plugins/search-backend-module-catalog/src/module.test.ts index d05c96c8ec..5056f70f9c 100644 --- a/plugins/search-backend-module-catalog/src/module.test.ts +++ b/plugins/search-backend-module-catalog/src/module.test.ts @@ -16,7 +16,7 @@ import { mockServices, startTestBackend } from '@backstage/backend-test-utils'; import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; -import searchModuleCatalogCollator from './module'; +import { searchModuleCatalogCollator } from './module'; describe('searchModuleCatalogCollator', () => { it('should register the catalog collator to the search index registry extension point with factory and schedule', async () => { diff --git a/plugins/search-backend-module-catalog/src/module.ts b/plugins/search-backend-module-catalog/src/module.ts index 3256a2b32f..32fe4e4728 100644 --- a/plugins/search-backend-module-catalog/src/module.ts +++ b/plugins/search-backend-module-catalog/src/module.ts @@ -16,7 +16,8 @@ /** * @packageDocumentation - * A module for the search backend that exports Catalog modules. + * + * A collator module for the search backend that indexes your software catalog. */ import { @@ -24,13 +25,11 @@ import { createBackendModule, createExtensionPoint, } from '@backstage/backend-plugin-api'; -import { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha'; -import { - CatalogCollatorEntityTransformer, - DefaultCatalogCollatorFactory, -} from '@backstage/plugin-search-backend-module-catalog'; +import { catalogServiceRef } from '@backstage/plugin-catalog-node'; import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; import { readScheduleConfigOptions } from './collators/config'; +import { CatalogCollatorEntityTransformer } from './collators'; +import { DefaultCatalogCollatorFactory } from './collators/DefaultCatalogCollatorFactory'; /** * Options for {@link catalogCollatorExtensionPoint}. @@ -60,7 +59,7 @@ export const catalogCollatorExtensionPoint = * * @public */ -export default createBackendModule({ +export const searchModuleCatalogCollator = createBackendModule({ pluginId: 'search', moduleId: 'catalog-collator', register(env) { @@ -79,28 +78,19 @@ export default createBackendModule({ deps: { auth: coreServices.auth, config: coreServices.rootConfig, - discovery: coreServices.discovery, scheduler: coreServices.scheduler, indexRegistry: searchIndexRegistryExtensionPoint, catalog: catalogServiceRef, }, - async init({ - auth, - config, - discovery, - scheduler, - indexRegistry, - catalog, - }) { + async init({ auth, config, scheduler, indexRegistry, catalog }) { indexRegistry.addCollator({ schedule: scheduler.createScheduledTaskRunner( readScheduleConfigOptions(config), ), factory: DefaultCatalogCollatorFactory.fromConfig(config, { auth, + catalog, entityTransformer, - discovery, - catalogClient: catalog, }), }); }, diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index d8c78dcb85..06baf7d157 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.6.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + +## 1.6.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## 1.6.3 + +### Patch Changes + +- 991c9fe: Update the ElasticSearchSearchEngine translator to handle phrase searches. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-search-common@1.2.16 + +## 1.6.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 1.6.3-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 81edcc9a3f..9b1a9e6766 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", - "version": "1.6.3-next.1", + "version": "1.6.4-next.1", "description": "A module for the search backend that implements search using ElasticSearch", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-explore/CHANGELOG.md b/plugins/search-backend-module-explore/CHANGELOG.md index e6fbe40fe0..f0c58e4b11 100644 --- a/plugins/search-backend-module-explore/CHANGELOG.md +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -1,5 +1,47 @@ # @backstage/plugin-search-backend-module-explore +## 0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## 0.2.6 + +### Patch Changes + +- ed0aaec: Update README +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/config@1.3.1 + - @backstage/plugin-search-common@1.2.16 + +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.2.6-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index 481ba5326e..dce0052feb 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-explore", - "version": "0.2.6-next.1", + "version": "0.2.7-next.1", "description": "A module for the search backend that exports explore modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-explore/src/collators/ToolDocumentCollatorFactory.test.ts b/plugins/search-backend-module-explore/src/collators/ToolDocumentCollatorFactory.test.ts index 92f75df91f..b8d915636a 100644 --- a/plugins/search-backend-module-explore/src/collators/ToolDocumentCollatorFactory.test.ts +++ b/plugins/search-backend-module-explore/src/collators/ToolDocumentCollatorFactory.test.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ConfigReader } from '@backstage/config'; + import { TestPipeline } from '@backstage/plugin-search-backend-node'; import { mockServices, @@ -23,7 +23,6 @@ import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { Readable } from 'stream'; import { ToolDocumentCollatorFactory } from './ToolDocumentCollatorFactory'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; const logger = mockServices.logger.mock(); @@ -54,11 +53,10 @@ const mockTools = { }; describe('ToolDocumentCollatorFactory', () => { - const config = new ConfigReader({}); - const mockDiscoveryApi: jest.Mocked = { - getBaseUrl: jest.fn().mockResolvedValue('http://test-backend/api/explore'), - getExternalBaseUrl: jest.fn(), - }; + const config = mockServices.rootConfig(); + const mockDiscoveryApi = mockServices.discovery.mock({ + getBaseUrl: async () => 'http://test-backend/api/explore', + }); const options = { discovery: mockDiscoveryApi, diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index fe223ee285..eea0caf86a 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.40-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + +## 0.5.40-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## 0.5.39 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/config@1.3.1 + - @backstage/plugin-search-common@1.2.16 + +## 0.5.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.5.39-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index eb57d59afc..ef7517a9f0 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-pg", - "version": "0.5.39-next.1", + "version": "0.5.40-next.1", "description": "A module for the search backend that implements search using PostgreSQL", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md index f999456842..75c0ae5219 100644 --- a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md +++ b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-search-backend-module-stack-overflow-collator +## 0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## 0.3.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/config@1.3.1 + - @backstage/plugin-search-common@1.2.16 + +## 0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.3.4-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-stack-overflow-collator/package.json b/plugins/search-backend-module-stack-overflow-collator/package.json index 531c9d9e6b..bfec24bc88 100644 --- a/plugins/search-backend-module-stack-overflow-collator/package.json +++ b/plugins/search-backend-module-stack-overflow-collator/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-stack-overflow-collator", - "version": "0.3.4-next.1", + "version": "0.3.5-next.1", "description": "A module for the search backend that exports stack overflow modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index 23b303dafb..4493c30ac2 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,71 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + - @backstage/plugin-techdocs-node@1.12.16-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-techdocs-node@1.12.16-next.0 + +## 0.3.4 + +### Patch Changes + +- ed0aaec: Update README +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-techdocs-node@1.12.15 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## 0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 0.3.4-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index b6c211dcfd..4c41a38900 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-techdocs", - "version": "0.3.4-next.1", + "version": "0.3.5-next.1", "description": "A module for the search backend that exports techdocs modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts index 4adb42cf1e..2b8ec17b0d 100644 --- a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts +++ b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { Entity } from '@backstage/catalog-model'; import { ConfigReader } from '@backstage/config'; import { TestPipeline } from '@backstage/plugin-search-backend-node'; @@ -25,7 +26,6 @@ import { setupServer } from 'msw/node'; import { Readable } from 'stream'; import { DefaultTechDocsCollatorFactory } from './DefaultTechDocsCollatorFactory'; import { TechDocsCollatorEntityTransformer } from './TechDocsCollatorEntityTransformer'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; import { MkSearchIndexDoc, TechDocsCollatorDocumentTransformer, @@ -81,11 +81,10 @@ const expectedEntities: Entity[] = [ ]; describe('DefaultTechDocsCollatorFactory', () => { - const config = new ConfigReader({}); - const mockDiscoveryApi: jest.Mocked = { - getBaseUrl: jest.fn().mockResolvedValue('http://test-backend'), - getExternalBaseUrl: jest.fn(), - }; + const config = mockServices.rootConfig.mock(); + const mockDiscoveryApi = mockServices.discovery.mock({ + getBaseUrl: async () => 'http://test-backend', + }); const options = { logger, discovery: mockDiscoveryApi, diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index cfda048db9..c66a6ddb5b 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-search-backend-node +## 1.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + +## 1.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## 1.3.6 + +### Patch Changes + +- 5ae8a2c: Removed unnecessary dependency on `@backstage/backend-defaults`. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## 1.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 1.3.6-next.1 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 3183045d78..8429d677f2 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-node", - "version": "1.3.6-next.1", + "version": "1.3.7-next.1", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", "backstage": { "role": "node-library", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 8942ebc723..7d976d3d38 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,73 @@ # @backstage/plugin-search-backend +## 1.8.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-openapi-utils@0.4.1-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + +## 1.8.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/backend-openapi-utils@0.4.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## 1.8.0 + +### Minor Changes + +- 384e494: Internal updates to generated code. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/backend-openapi-utils@0.4.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## 1.8.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 1.8.0-next.1 ### Minor Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index acd16f671f..ce5be47a5f 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend", - "version": "1.8.0-next.1", + "version": "1.8.1-next.1", "description": "The Backstage backend plugin that provides your backstage app with search", "backstage": { "role": "backend-plugin", diff --git a/plugins/search-common/CHANGELOG.md b/plugins/search-common/CHANGELOG.md index 53a63b4c22..5b57dc49cd 100644 --- a/plugins/search-common/CHANGELOG.md +++ b/plugins/search-common/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-search-common +## 1.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## 1.2.16 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + +## 1.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + ## 1.2.15 ### Patch Changes diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index 652a48ba96..b57849d9d1 100644 --- a/plugins/search-common/package.json +++ b/plugins/search-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-common", - "version": "1.2.15", + "version": "1.2.17-next.0", "description": "Common functionalities for Search, to be shared between various search-enabled plugins", "backstage": { "role": "common-library", diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 317923e258..026d7e841e 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-search-react +## 1.8.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/theme@0.6.3 + - @backstage/version-bridge@1.0.10 + +## 1.8.4 + +### 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 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16 + +## 1.8.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16-next.0 + ## 1.8.4-next.1 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 8729885428..8d284e3331 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.8.4-next.1", + "version": "1.8.5-next.0", "backstage": { "role": "web-library", "pluginId": "search", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 31350a44d7..05087516fd 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,62 @@ # @backstage/plugin-search +## 1.4.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/version-bridge@1.0.10 + +## 1.4.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## 1.4.21 + +### Patch Changes + +- d311c84: Use Select from core-components and update Lifecycle filter to use Select instead checkboxes. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-search-react@1.8.4 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16 + +## 1.4.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + ## 1.4.21-next.1 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 7a223542fe..66a68b8a1b 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search", - "version": "1.4.21-next.1", + "version": "1.4.22-next.1", "description": "The Backstage plugin that provides your backstage app with search", "backstage": { "role": "frontend-plugin", diff --git a/plugins/signals-backend/CHANGELOG.md b/plugins/signals-backend/CHANGELOG.md index 8569df8056..711e27e620 100644 --- a/plugins/signals-backend/CHANGELOG.md +++ b/plugins/signals-backend/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-signals-backend +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + - @backstage/plugin-signals-node@0.1.16-next.1 + +## 0.3.0-next.1 + +### Minor Changes + +- f59ea1d: Removed support for the old backend system. If you were using the old `createRouter` export, please migrate to [the new backend system](https://backstage.io/docs/backend-system/). + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + - @backstage/plugin-signals-node@0.1.16-next.0 + +## 0.2.4 + +### Patch Changes + +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-node@0.1.15 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json index 34eb99d79f..6a2f9f99a0 100644 --- a/plugins/signals-backend/package.json +++ b/plugins/signals-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-backend", - "version": "0.2.4-next.1", + "version": "0.3.0-next.2", "backstage": { "role": "backend-plugin", "pluginId": "signals", @@ -37,14 +37,12 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-events-node": "workspace:^", "@backstage/plugin-signals-node": "workspace:^", "@backstage/types": "workspace:^", - "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "http-proxy-middleware": "^2.0.0", @@ -60,6 +58,7 @@ "@backstage/plugin-auth-backend": "workspace:^", "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^", "@backstage/plugin-events-backend": "workspace:^", + "@types/express": "^4.17.6", "@types/supertest": "^2.0.8", "@types/ws": "^8.5.10", "msw": "^1.0.0", diff --git a/plugins/signals-backend/report.api.md b/plugins/signals-backend/report.api.md index 10f74ba37e..2b27ef2b3c 100644 --- a/plugins/signals-backend/report.api.md +++ b/plugins/signals-backend/report.api.md @@ -3,39 +3,7 @@ > 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 { BackendFeature } from '@backstage/backend-plugin-api'; -import { Config } from '@backstage/config'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; -import { EventsService } from '@backstage/plugin-events-node'; -import express from 'express'; -import { IdentityApi } from '@backstage/plugin-auth-node'; -import { LifecycleService } from '@backstage/backend-plugin-api'; -import { LoggerService } from '@backstage/backend-plugin-api'; -import { UserInfoService } from '@backstage/backend-plugin-api'; - -// @public @deprecated (undocumented) -export function createRouter(options: RouterOptions): Promise; - -// @public @deprecated (undocumented) -export interface RouterOptions { - // (undocumented) - auth?: AuthService; - // (undocumented) - config: Config; - // (undocumented) - discovery: DiscoveryService; - // (undocumented) - events: EventsService; - // (undocumented) - identity?: IdentityApi; - // (undocumented) - lifecycle?: LifecycleService; - // (undocumented) - logger: LoggerService; - // (undocumented) - userInfo?: UserInfoService; -} // @public const signalsPlugin: BackendFeature; diff --git a/plugins/signals-backend/src/deprecated.ts b/plugins/signals-backend/src/deprecated.ts deleted file mode 100644 index d33c9a06b9..0000000000 --- a/plugins/signals-backend/src/deprecated.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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 express from 'express'; - -import { Config } from '@backstage/config'; -import { - AuthService, - DiscoveryService, - LifecycleService, - LoggerService, - UserInfoService, -} from '@backstage/backend-plugin-api'; -import { createLegacyAuthAdapters } from '@backstage/backend-common'; - -import { IdentityApi } from '@backstage/plugin-auth-node'; -import { EventsService } from '@backstage/plugin-events-node'; - -import { createRouter as _createRouter } from './service/router'; - -/** - * @public - * @deprecated Please migrate to the new backend system as this will be removed in the future. - */ -export interface RouterOptions { - logger: LoggerService; - events: EventsService; - identity?: IdentityApi; - discovery: DiscoveryService; - config: Config; - lifecycle?: LifecycleService; - auth?: AuthService; - userInfo?: UserInfoService; -} - -/** - * @public - * @deprecated Please migrate to the new backend system as this will be removed in the future. - */ -export async function createRouter( - options: RouterOptions, -): Promise { - return _createRouter({ - ...options, - ...createLegacyAuthAdapters(options), - }); -} diff --git a/plugins/signals-backend/src/index.ts b/plugins/signals-backend/src/index.ts index c852c81518..c5b3fe692a 100644 --- a/plugins/signals-backend/src/index.ts +++ b/plugins/signals-backend/src/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export * from './deprecated'; export { signalsPlugin as default } from './plugin'; diff --git a/plugins/signals-backend/src/plugin.ts b/plugins/signals-backend/src/plugin.ts index 3ca10f46d1..f01777b4fc 100644 --- a/plugins/signals-backend/src/plugin.ts +++ b/plugins/signals-backend/src/plugin.ts @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { coreServices, createBackendPlugin, } from '@backstage/backend-plugin-api'; -import { createRouter } from './deprecated'; import { eventsServiceRef } from '@backstage/plugin-events-node'; +import { createRouter } from './service/router'; /** * Signals backend plugin diff --git a/plugins/signals-backend/src/service/SignalManager.test.ts b/plugins/signals-backend/src/service/SignalManager.test.ts index eccc715d1b..642c00a7d7 100644 --- a/plugins/signals-backend/src/service/SignalManager.test.ts +++ b/plugins/signals-backend/src/service/SignalManager.test.ts @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { WebSocket } from 'ws'; import { EventsServiceSubscribeOptions } from '@backstage/plugin-events-node'; import { SignalManager } from './SignalManager'; -import { ConfigReader } from '@backstage/config'; import { mockServices } from '@backstage/backend-test-utils'; class MockWebSocket { @@ -70,15 +70,15 @@ describe('SignalManager', () => { }; const shutdownHooks: Function[] = []; - const mockLifecycle = { + const mockLifecycle = mockServices.lifecycle.mock({ addShutdownHook: (hook: Function) => shutdownHooks.push(hook), - }; + }); const manager = SignalManager.create({ events: mockEvents, logger: mockServices.logger.mock(), - config: new ConfigReader({}), - lifecycle: mockLifecycle as any, + config: mockServices.rootConfig(), + lifecycle: mockLifecycle, }); it('should close all connections when server is closed', () => { diff --git a/plugins/signals-backend/src/service/SignalManager.ts b/plugins/signals-backend/src/service/SignalManager.ts index bf20d6a8c4..ec9cb57900 100644 --- a/plugins/signals-backend/src/service/SignalManager.ts +++ b/plugins/signals-backend/src/service/SignalManager.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { EventParams, EventsService } from '@backstage/plugin-events-node'; import { SignalPayload } from '@backstage/plugin-signals-node'; import crypto from 'crypto'; @@ -45,7 +46,7 @@ export type SignalManagerOptions = { events: EventsService; config: Config; logger: LoggerService; - lifecycle?: LifecycleService; + lifecycle: LifecycleService; }; /** @internal */ @@ -79,7 +80,7 @@ export class SignalManager { this.onEventBrokerEvent(params.eventPayload as SignalPayload), }); - options.lifecycle?.addShutdownHook(() => this.onShutdown()); + options.lifecycle.addShutdownHook(() => this.onShutdown()); } private ping() { diff --git a/plugins/signals-backend/src/service/router.test.ts b/plugins/signals-backend/src/service/router.test.ts index 8584a06dea..0138a1a5d3 100644 --- a/plugins/signals-backend/src/service/router.test.ts +++ b/plugins/signals-backend/src/service/router.test.ts @@ -16,29 +16,14 @@ import express from 'express'; import request from 'supertest'; - import { createRouter } from './router'; -import { EventsService } from '@backstage/plugin-events-node'; -import { - DiscoveryService, - UserInfoService, -} from '@backstage/backend-plugin-api'; -import { ConfigReader } from '@backstage/config'; import { mockErrorHandler, mockServices } from '@backstage/backend-test-utils'; -const eventsServiceMock: jest.Mocked = { - subscribe: jest.fn(), - publish: jest.fn(), -}; - -const discovery: jest.Mocked = { - getBaseUrl: jest.fn().mockResolvedValue('/api/signals'), - getExternalBaseUrl: jest.fn(), -}; - -const userInfo: jest.Mocked = { - getUserInfo: jest.fn(), -}; +const eventsServiceMock = mockServices.events.mock(); +const discovery = mockServices.discovery.mock({ + getBaseUrl: async () => '/api/signals', +}); +const userInfo = mockServices.userInfo.mock(); describe('createRouter', () => { let app: express.Express; @@ -49,7 +34,8 @@ describe('createRouter', () => { events: eventsServiceMock, discovery, userInfo, - config: new ConfigReader({}), + config: mockServices.rootConfig(), + lifecycle: mockServices.lifecycle.mock(), auth: mockServices.auth(), }); app = express().use(router).use(mockErrorHandler()); diff --git a/plugins/signals-backend/src/service/router.ts b/plugins/signals-backend/src/service/router.ts index 0633e5fb8d..eb1c24f383 100644 --- a/plugins/signals-backend/src/service/router.ts +++ b/plugins/signals-backend/src/service/router.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import express, { NextFunction, Request, Response } from 'express'; import Router from 'express-promise-router'; import { @@ -36,7 +37,7 @@ export interface RouterOptions { events: EventsService; discovery: DiscoveryService; config: Config; - lifecycle?: LifecycleService; + lifecycle: LifecycleService; userInfo: UserInfoService; auth: AuthService; } diff --git a/plugins/signals-node/CHANGELOG.md b/plugins/signals-node/CHANGELOG.md index 0a3b28b3fa..4c79504e66 100644 --- a/plugins/signals-node/CHANGELOG.md +++ b/plugins/signals-node/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-signals-node +## 0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 0.1.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 0.1.15 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + ## 0.1.15-next.1 ### Patch Changes diff --git a/plugins/signals-node/package.json b/plugins/signals-node/package.json index 15dbad8e4e..291029a6f9 100644 --- a/plugins/signals-node/package.json +++ b/plugins/signals-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-node", - "version": "0.1.15-next.1", + "version": "0.1.16-next.1", "description": "Node.js library for the signals plugin", "backstage": { "role": "node-library", diff --git a/plugins/signals-react/CHANGELOG.md b/plugins/signals-react/CHANGELOG.md index f417bf94a9..605cff0ef4 100644 --- a/plugins/signals-react/CHANGELOG.md +++ b/plugins/signals-react/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-signals-react +## 0.0.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + +## 0.0.8 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + +## 0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + ## 0.0.7 ### Patch Changes diff --git a/plugins/signals-react/package.json b/plugins/signals-react/package.json index 70368dc02c..0fb36a0306 100644 --- a/plugins/signals-react/package.json +++ b/plugins/signals-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-react", - "version": "0.0.7", + "version": "0.0.9-next.0", "description": "Web library for the signals plugin", "backstage": { "role": "web-library", diff --git a/plugins/signals/CHANGELOG.md b/plugins/signals/CHANGELOG.md index b9dc92853a..1b302c6276 100644 --- a/plugins/signals/CHANGELOG.md +++ b/plugins/signals/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-signals +## 0.0.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-signals-react@0.0.9-next.0 + - @backstage/theme@0.6.3 + +## 0.0.14 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8 + +## 0.0.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + ## 0.0.14-next.1 ### Patch Changes diff --git a/plugins/signals/package.json b/plugins/signals/package.json index 7f07fcd116..1427195ff4 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals", - "version": "0.0.14-next.1", + "version": "0.0.15-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "signals", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 4b0854cfd2..6cb2897873 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,60 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.44-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.12.1-next.1 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.1 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/test-utils@1.7.4-next.0 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + +## 1.0.44-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-catalog@1.26.1-next.0 + - @backstage/plugin-techdocs@1.12.1-next.0 + - @backstage/integration-react@1.2.2 + +## 1.0.43 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/core-app-api@1.15.3 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-search-react@1.8.4 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/test-utils@1.7.3 + - @backstage/plugin-techdocs-react@1.2.12 + +## 1.0.43-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/test-utils@1.7.3-next.1 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 1.0.43-next.1 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 5142b39abe..6540ab0b64 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.43-next.1", + "version": "1.0.44-next.1", "backstage": { "role": "web-library", "pluginId": "techdocs-addons", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index a6aaa5833f..b452601b0f 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,84 @@ # @backstage/plugin-techdocs-backend +## 1.11.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-catalog-node@1.15.1-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.1 + - @backstage/plugin-techdocs-node@1.12.16-next.1 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/integration@1.16.1-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + +## 1.11.5-next.1 + +### Patch Changes + +- 29a4aa8: fix(config): add missing parameters in config schema + +## 1.11.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-node@1.15.1-next.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-backend-module-techdocs@0.3.5-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + - @backstage/plugin-techdocs-node@1.12.16-next.0 + +## 1.11.4 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.4 + - @backstage/plugin-catalog-node@1.15.0 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-techdocs-node@1.12.15 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-techdocs-common@0.1.0 + +## 1.11.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-catalog-node@1.15.0-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/plugin-techdocs-node@1.12.15-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + ## 1.11.4-next.1 ### Patch Changes diff --git a/plugins/techdocs-backend/config.d.ts b/plugins/techdocs-backend/config.d.ts index 4910d8d76e..c220717ddb 100644 --- a/plugins/techdocs-backend/config.d.ts +++ b/plugins/techdocs-backend/config.d.ts @@ -263,6 +263,11 @@ export interface Config { * the credentials belongs to a different project to the bucket. */ projectId?: string; + /** + * (Optional) Location in storage bucket to save files + * If not set, the default location will be the root of the storage bucket + */ + bucketRootPath?: string; }; }; diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 2af1e6cd14..6e70fad10a 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-backend", - "version": "1.11.4-next.1", + "version": "1.11.5-next.2", "description": "The Backstage backend plugin that renders technical documentation for your components", "backstage": { "role": "backend-plugin", diff --git a/plugins/techdocs-backend/src/cache/TechDocsCache.test.ts b/plugins/techdocs-backend/src/cache/TechDocsCache.test.ts index 1cdd0174b5..6bc849e30d 100644 --- a/plugins/techdocs-backend/src/cache/TechDocsCache.test.ts +++ b/plugins/techdocs-backend/src/cache/TechDocsCache.test.ts @@ -17,7 +17,6 @@ import { ConfigReader } from '@backstage/config'; import { CacheInvalidationError, TechDocsCache } from './TechDocsCache'; import { mockServices } from '@backstage/backend-test-utils'; -import { CacheService } from '@backstage/backend-plugin-api'; const cached = (str: string): string => { return Buffer.from(str).toString('base64'); @@ -25,17 +24,12 @@ const cached = (str: string): string => { describe('TechDocsCache', () => { let CacheUnderTest: TechDocsCache; - let MockClient: jest.Mocked; + const cache = mockServices.cache.mock(); beforeEach(() => { - MockClient = { - get: jest.fn(), - set: jest.fn(), - delete: jest.fn(), - withOptions: jest.fn(), - }; + jest.clearAllMocks(); CacheUnderTest = TechDocsCache.fromConfig(new ConfigReader({}), { - cache: MockClient, + cache: cache, logger: mockServices.logger.mock(), }); }); @@ -43,16 +37,16 @@ describe('TechDocsCache', () => { describe('get', () => { it('returns undefined if no response', async () => { const expectedPath = 'some/index.html'; - MockClient.get.mockResolvedValueOnce(undefined); + cache.get.mockResolvedValueOnce(undefined); const actual = await CacheUnderTest.get(expectedPath); - expect(MockClient.get).toHaveBeenCalledWith(expectedPath); + expect(cache.get).toHaveBeenCalledWith(expectedPath); expect(actual).toBe(undefined); }); it('returns undefined if cache get throws', async () => { const expectedPath = 'some/index.html'; - MockClient.get.mockRejectedValueOnce(new Error()); + cache.get.mockRejectedValueOnce(new Error()); const actual = await CacheUnderTest.get(expectedPath); expect(actual).toBe(undefined); @@ -60,7 +54,7 @@ describe('TechDocsCache', () => { it('returns undefined if no response after 1s by default', async () => { const expectedPath = 'some/index.html'; - MockClient.get.mockImplementationOnce(() => { + cache.get.mockImplementationOnce(() => { return new Promise(resolve => { setTimeout(() => resolve(cached('value')), 1500); }); @@ -71,7 +65,7 @@ describe('TechDocsCache', () => { it('returns undefined if no response after configured readTimeout', async () => { const expectedPath = 'some/index.html'; - MockClient.get.mockImplementationOnce(() => { + cache.get.mockImplementationOnce(() => { return new Promise(resolve => { setTimeout(() => resolve(cached('value')), 20); }); @@ -82,7 +76,7 @@ describe('TechDocsCache', () => { techdocs: { cache: { readTimeout: 10 } }, }), { - cache: MockClient, + cache: cache, logger: mockServices.logger.mock(), }, ); @@ -93,7 +87,7 @@ describe('TechDocsCache', () => { it('returns data if cache get returns it', async () => { const expectedPath = 'some/index.html'; - MockClient.get.mockResolvedValueOnce(cached('expected value')); + cache.get.mockResolvedValueOnce(cached('expected value')); const actual = await CacheUnderTest.get(expectedPath); expect(actual?.toString()).toBe('expected value'); @@ -103,17 +97,14 @@ describe('TechDocsCache', () => { describe('set', () => { it('sets a base64-encoded string', async () => { const expectedPath = 'some/index.html'; - MockClient.set.mockResolvedValueOnce(undefined); + cache.set.mockResolvedValueOnce(undefined); await CacheUnderTest.set(expectedPath, Buffer.from('some data')); - expect(MockClient.set).toHaveBeenCalledWith( - expectedPath, - cached('some data'), - ); + expect(cache.set).toHaveBeenCalledWith(expectedPath, cached('some data')); }); it('does not throw if client throws', () => { - MockClient.set.mockRejectedValueOnce(new Error()); + cache.set.mockRejectedValueOnce(new Error()); expect(() => CacheUnderTest.set('i.html', Buffer.from(''))).not.toThrow(); }); }); @@ -121,26 +112,26 @@ describe('TechDocsCache', () => { describe('invalidate', () => { it('calls delete on client', async () => { const expectedPath = 'some/index.html'; - MockClient.delete.mockResolvedValueOnce(undefined); + cache.delete.mockResolvedValueOnce(undefined); await CacheUnderTest.invalidate(expectedPath); - expect(MockClient.delete).toHaveBeenCalledWith(expectedPath); + expect(cache.delete).toHaveBeenCalledWith(expectedPath); }); }); describe('invalidateMultiple', () => { it('calls delete once per given path', async () => { const expectedPaths = ['one/index.html', 'two/index.html']; - MockClient.delete.mockResolvedValue(undefined); + cache.delete.mockResolvedValue(undefined); await CacheUnderTest.invalidateMultiple(expectedPaths); - expect(MockClient.delete).toHaveBeenNthCalledWith(1, expectedPaths[0]); - expect(MockClient.delete).toHaveBeenNthCalledWith(2, expectedPaths[1]); + expect(cache.delete).toHaveBeenNthCalledWith(1, expectedPaths[0]); + expect(cache.delete).toHaveBeenNthCalledWith(2, expectedPaths[1]); }); it('returns an array of as many paths provided', async () => { const expectedPaths = ['one/index.html', 'two/index.html']; - MockClient.delete.mockResolvedValue(undefined); + cache.delete.mockResolvedValue(undefined); const actual = await CacheUnderTest.invalidateMultiple(expectedPaths); expect(actual.length).toBe(2); @@ -148,19 +139,19 @@ describe('TechDocsCache', () => { it('calls delete on all paths even if the first rejects', async () => { const expectedPaths = ['one/index.html', 'two/index.html']; - MockClient.delete.mockRejectedValueOnce(new Error()); - MockClient.delete.mockResolvedValueOnce(undefined); + cache.delete.mockRejectedValueOnce(new Error()); + cache.delete.mockResolvedValueOnce(undefined); await expect( CacheUnderTest.invalidateMultiple(expectedPaths), ).rejects.toThrow(CacheInvalidationError); - expect(MockClient.delete).toHaveBeenCalledTimes(2); + expect(cache.delete).toHaveBeenCalledTimes(2); }); it('rejects with invalidations error response', async () => { const expectedPaths = ['one/index.html', 'two/index.html']; - MockClient.delete.mockResolvedValueOnce(undefined); - MockClient.delete.mockRejectedValueOnce(new Error()); + cache.delete.mockResolvedValueOnce(undefined); + cache.delete.mockRejectedValueOnce(new Error()); await expect( CacheUnderTest.invalidateMultiple.bind(CacheUnderTest, expectedPaths), diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts index c825f0dbb7..8ff949cff8 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts @@ -25,7 +25,6 @@ import { setupServer } from 'msw/node'; import { http, HttpResponse } from 'msw'; import { ConfigReader } from '@backstage/config'; import { TECHDOCS_ANNOTATION } from '@backstage/plugin-techdocs-common'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; const logger = loggerToWinstonLogger(mockServices.logger.mock()); @@ -80,15 +79,14 @@ describe('TechDocs Collator', () => { registerMswTestHooks(worker); describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => { - let mockDiscoveryApi: jest.Mocked; + const mockDiscoveryApi = mockServices.discovery.mock({ + getBaseUrl: async () => 'http://test-backend', + }); let mockTokenManager: jest.Mocked; let collator: DefaultTechDocsCollator; beforeEach(() => { - mockDiscoveryApi = { - getBaseUrl: jest.fn().mockResolvedValue('http://test-backend'), - getExternalBaseUrl: jest.fn(), - }; + jest.clearAllMocks(); mockTokenManager = { getToken: jest.fn().mockResolvedValue({ token: '' }), authenticate: jest.fn(), @@ -144,15 +142,13 @@ describe('TechDocs Collator', () => { }); describe('DefaultTechDocsCollator', () => { - let mockDiscoveryApi: jest.Mocked; + const mockDiscoveryApi = mockServices.discovery.mock({ + getBaseUrl: async () => 'http://test-backend', + }); let mockTokenManager: jest.Mocked; let collator: DefaultTechDocsCollator; beforeEach(() => { - mockDiscoveryApi = { - getBaseUrl: jest.fn().mockResolvedValue('http://test-backend'), - getExternalBaseUrl: jest.fn(), - }; mockTokenManager = { getToken: jest.fn().mockResolvedValue({ token: '' }), authenticate: jest.fn(), diff --git a/plugins/techdocs-backend/src/service/DocsSynchronizer.test.ts b/plugins/techdocs-backend/src/service/DocsSynchronizer.test.ts index bef5a9c433..5248ca6dad 100644 --- a/plugins/techdocs-backend/src/service/DocsSynchronizer.test.ts +++ b/plugins/techdocs-backend/src/service/DocsSynchronizer.test.ts @@ -31,7 +31,6 @@ import { mockServices, registerMswTestHooks, } from '@backstage/backend-test-utils'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; import { http, HttpResponse } from 'msw'; import { setupServer } from 'msw/node'; @@ -59,10 +58,7 @@ describe('DocsSynchronizer', () => { hasDocsBeenGenerated: jest.fn(), publish: jest.fn(), }; - const discovery: jest.Mocked = { - getBaseUrl: jest.fn(), - getExternalBaseUrl: jest.fn(), - }; + const discovery = mockServices.discovery.mock(); const cache: jest.Mocked = { get: jest.fn(), set: jest.fn(), diff --git a/plugins/techdocs-backend/src/service/router.test.ts b/plugins/techdocs-backend/src/service/router.test.ts index 631efe06ea..c74167552d 100644 --- a/plugins/techdocs-backend/src/service/router.test.ts +++ b/plugins/techdocs-backend/src/service/router.test.ts @@ -32,7 +32,6 @@ import { CachedEntityLoader } from './CachedEntityLoader'; import { createEventStream, createRouter, RouterOptions } from './router'; import { TechDocsCache } from '../cache'; import { mockErrorHandler, mockServices } from '@backstage/backend-test-utils'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; jest.mock('@backstage/catalog-client'); jest.mock('@backstage/config'); @@ -111,10 +110,7 @@ describe('createRouter', () => { hasDocsBeenGenerated: jest.fn(), publish: jest.fn(), }; - const discovery: jest.Mocked = { - getBaseUrl: jest.fn(), - getExternalBaseUrl: jest.fn(), - }; + const discovery = mockServices.discovery.mock(); const cache: jest.Mocked = { getClient: jest.fn(), }; diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 5db4ab9749..02b7912e61 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + - @backstage/integration@1.16.1-next.0 + +## 1.1.20-next.0 + +### Patch Changes + +- b664b2a: Internal refactor for safer handling of possible null value. +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration@1.16.0 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-techdocs-react@1.2.12 + +## 1.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-techdocs-react@1.2.12 + +## 1.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 1.1.19-next.1 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 4e9c5e9bf5..05a0f9a37b 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", - "version": "1.1.19-next.1", + "version": "1.1.20-next.1", "description": "Plugin module for contributed TechDocs Addons", "backstage": { "role": "frontend-plugin-module", diff --git a/plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.tsx b/plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.tsx index 38269e6245..47409f47c7 100644 --- a/plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.tsx +++ b/plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.tsx @@ -28,7 +28,7 @@ export const LightBoxAddon = () => { useEffect(() => { let dataSourceImages: DataSource | null = null; - let lightbox = new PhotoSwipeLightbox({ + let lightbox: PhotoSwipeLightbox | null = new PhotoSwipeLightbox({ pswpModule: PhotoSwipe, initialZoomLevel: 1, secondaryZoomLevel: (zoomLevelObject: ZoomLevel) => { @@ -71,14 +71,14 @@ export const LightBoxAddon = () => { }; }); } - lightbox.loadAndOpen(index, dataSourceImages); + lightbox?.loadAndOpen(index, dataSourceImages); return false; }; }); lightbox.init(); return () => { - lightbox.destroy(); + lightbox?.destroy(); lightbox = null; }; }, [images]); diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 929b8ae72a..1c2db14fac 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,62 @@ # @backstage/plugin-techdocs-node +## 1.12.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/integration-aws-node@0.1.15-next.0 + - @backstage/integration@1.16.1-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + +## 1.12.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/integration@1.16.0 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-techdocs-common@0.1.0 + +## 1.12.15 + +### Patch Changes + +- 5f04976: Fixed a bug that caused missing code in published packages. +- Updated dependencies + - @backstage/integration@1.16.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/integration-aws-node@0.1.14 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-techdocs-common@0.1.0 + +## 1.12.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-aws-node@0.1.14-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-techdocs-common@0.1.0 + ## 1.12.15-next.1 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index aef23deb5d..d530760d92 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-node", - "version": "1.12.15-next.1", + "version": "1.12.16-next.1", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", "backstage": { "role": "node-library", diff --git a/plugins/techdocs-node/src/stages/prepare/dir.test.ts b/plugins/techdocs-node/src/stages/prepare/dir.test.ts index 2dadfa6ece..7b61db222d 100644 --- a/plugins/techdocs-node/src/stages/prepare/dir.test.ts +++ b/plugins/techdocs-node/src/stages/prepare/dir.test.ts @@ -13,11 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { TECHDOCS_ANNOTATION } from '@backstage/plugin-techdocs-common'; -import { ConfigReader } from '@backstage/config'; import { DirectoryPreparer } from './dir'; import { mockServices } from '@backstage/backend-test-utils'; -import { UrlReaderService } from '@backstage/backend-plugin-api'; function normalizePath(path: string) { return path @@ -45,12 +44,8 @@ const createMockEntity = (annotations: {}) => { }; }; -const mockConfig = new ConfigReader({}); -const mockUrlReader: jest.Mocked = { - readUrl: jest.fn(), - readTree: jest.fn(), - search: jest.fn(), -}; +const mockConfig = mockServices.rootConfig(); +const mockUrlReader = mockServices.urlReader.mock(); describe('directory preparer', () => { it('should merge managed-by-location and techdocs-ref when techdocs-ref is relative', async () => { diff --git a/plugins/techdocs-node/src/stages/publish/local.test.ts b/plugins/techdocs-node/src/stages/publish/local.test.ts index a6dc9c09c4..be6f3b2fa8 100644 --- a/plugins/techdocs-node/src/stages/publish/local.test.ts +++ b/plugins/techdocs-node/src/stages/publish/local.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { overridePackagePathResolution } from '@backstage/backend-plugin-api/testUtils'; import { ConfigReader } from '@backstage/config'; import express from 'express'; @@ -24,7 +25,6 @@ import { createMockDirectory, mockServices, } from '@backstage/backend-test-utils'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; const createMockEntity = (annotations = {}, lowerCase = false) => { return { @@ -39,10 +39,9 @@ const createMockEntity = (annotations = {}, lowerCase = false) => { }; }; -const testDiscovery: jest.Mocked = { - getBaseUrl: jest.fn().mockResolvedValue('http://localhost:7007/api/techdocs'), - getExternalBaseUrl: jest.fn(), -}; +const testDiscovery = mockServices.discovery.mock({ + getBaseUrl: async () => 'http://localhost:7007/api/techdocs', +}); const mockPublishDir = createMockDirectory(); diff --git a/plugins/techdocs-node/src/stages/publish/publish.test.ts b/plugins/techdocs-node/src/stages/publish/publish.test.ts index 408a171fe0..9885337db8 100644 --- a/plugins/techdocs-node/src/stages/publish/publish.test.ts +++ b/plugins/techdocs-node/src/stages/publish/publish.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { ConfigReader } from '@backstage/config'; import { Publisher } from './publish'; import { LocalPublish } from './local'; @@ -22,13 +23,11 @@ import { AzureBlobStoragePublish } from './azureBlobStorage'; import { OpenStackSwiftPublish } from './openStackSwift'; import { mockServices } from '@backstage/backend-test-utils'; import { PublisherBase } from './types'; -import { DiscoveryService } from '@backstage/backend-plugin-api'; const logger = mockServices.logger.mock(); -const discovery: jest.Mocked = { - getBaseUrl: jest.fn().mockResolvedValueOnce('http://localhost:7007'), - getExternalBaseUrl: jest.fn(), -}; +const discovery = mockServices.discovery.mock({ + getBaseUrl: async () => 'http://localhost:7007', +}); jest.mock('@azure/identity', () => ({ __esModule: true, diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 2bb1849def..af153d63f2 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-techdocs-react +## 1.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/version-bridge@1.0.10 + +## 1.2.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/version-bridge@1.0.10 + +## 1.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/version-bridge@1.0.10 + ## 1.2.12-next.1 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 47104ec6b1..6e27c91f14 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-react", - "version": "1.2.12-next.1", + "version": "1.2.13-next.0", "description": "Shared frontend utilities for TechDocs and Addons", "backstage": { "role": "web-library", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 5453e7209e..ccb8b037c2 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,86 @@ # @backstage/plugin-techdocs +## 1.12.1-next.1 + +### Patch Changes + +- 3710b35: Allow passing down `withSearch` prop to `EntityTechdocsContent` component since it was `true` by default, now user can use the `EntityTechdocsContent` component _without_ showing the search field on top of the content. +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-auth-react@0.1.11-next.0 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/integration@1.16.1-next.0 + - @backstage/theme@0.6.3 + - @backstage/plugin-techdocs-common@0.1.0 + +## 1.12.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/integration-react@1.2.2 + - @backstage/core-compat-api@0.3.4 + +## 1.12.0 + +### Minor Changes + +- e153ca6: Add pagination support to TechDocs Index Page and make it the default + +### 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/plugin-catalog-react@1.15.0 + - @backstage/integration@1.16.0 + - @backstage/plugin-search-react@1.8.4 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-techdocs-common@0.1.0 + - @backstage/plugin-techdocs-react@1.2.12 + +## 1.11.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/integration@1.16.0-next.1 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-techdocs-common@0.1.0 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + ## 1.11.3-next.1 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 97f58f30aa..65df90ea77 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs", - "version": "1.11.3-next.1", + "version": "1.12.1-next.1", "description": "The Backstage plugin that renders technical documentation for your components", "backstage": { "role": "frontend-plugin", diff --git a/plugins/techdocs/report.api.md b/plugins/techdocs/report.api.md index 2cc3934f62..196fef5f35 100644 --- a/plugins/techdocs/report.api.md +++ b/plugins/techdocs/report.api.md @@ -12,6 +12,7 @@ import { Config } from '@backstage/config'; import { CSSProperties } from '@material-ui/styles/withStyles'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { Entity } from '@backstage/catalog-model'; +import { EntityListPagination } from '@backstage/plugin-catalog-react'; import { EntityOwnerPickerProps } from '@backstage/plugin-catalog-react'; import { FetchApi } from '@backstage/core-plugin-api'; import { IdentityApi } from '@backstage/core-plugin-api'; @@ -132,9 +133,12 @@ export type DocsTableRow = { }; // @public -export const EmbeddedDocsRouter: ( - props: PropsWithChildren<{}>, -) => React_2.JSX.Element; +export const EmbeddedDocsRouter: ({ + children, + withSearch, +}: React_2.PropsWithChildren<{ + withSearch?: boolean | undefined; +}>) => React_2.JSX.Element; // @public export const EntityListDocsGrid: ( @@ -190,9 +194,12 @@ export type EntityListDocsTableProps = { }; // @public -export const EntityTechdocsContent: (props: { - children?: ReactNode; -}) => JSX_2.Element; +export const EntityTechdocsContent: ({ + children, + withSearch, +}: PropsWithChildren<{ + withSearch?: boolean | undefined; +}>) => JSX_2.Element; // @public export const isTechDocsAvailable: (entity: Entity) => boolean; @@ -309,6 +316,7 @@ export type TechDocsIndexPageProps = { columns?: TableColumn[]; actions?: TableProps['actions']; ownerPickerMode?: EntityOwnerPickerProps['mode']; + pagination?: EntityListPagination; }; // @public @deprecated (undocumented) diff --git a/plugins/techdocs/src/Router.tsx b/plugins/techdocs/src/Router.tsx index 352c9f5b73..6a0bc0e08e 100644 --- a/plugins/techdocs/src/Router.tsx +++ b/plugins/techdocs/src/Router.tsx @@ -57,16 +57,19 @@ export const Router = () => { }; export const EmbeddedDocsRouter = ( - props: PropsWithChildren<{ emptyState?: React.ReactElement }>, + props: PropsWithChildren<{ + emptyState?: React.ReactElement; + withSearch?: boolean; + }>, ) => { - const { children, emptyState } = props; + const { children, emptyState, withSearch = true } = props; const { entity } = useEntity(); // Using objects instead of elements, otherwise "outlet" will be null on sub-pages and add-ons won't render const element = useRoutes([ { path: '/*', - element: , + element: , children: [ { path: '*', @@ -96,8 +99,11 @@ export const EmbeddedDocsRouter = ( * * @public */ -export const LegacyEmbeddedDocsRouter = (props: PropsWithChildren<{}>) => { +export const LegacyEmbeddedDocsRouter = ({ + children, + withSearch = true, +}: PropsWithChildren<{ withSearch?: boolean }>) => { // Wrap the Router to avoid exposing the emptyState prop in the non-alpha // public API and make it easier for us to change later. - return ; + return ; }; diff --git a/plugins/techdocs/src/home/components/DefaultTechDocsHome.tsx b/plugins/techdocs/src/home/components/DefaultTechDocsHome.tsx index 2fbd5bb50a..f9757f29cc 100644 --- a/plugins/techdocs/src/home/components/DefaultTechDocsHome.tsx +++ b/plugins/techdocs/src/home/components/DefaultTechDocsHome.tsx @@ -46,7 +46,13 @@ export type DefaultTechDocsHomeProps = TechDocsIndexPageProps; * @public */ export const DefaultTechDocsHome = (props: TechDocsIndexPageProps) => { - const { initialFilter = 'owned', columns, actions, ownerPickerMode } = props; + const { + initialFilter = 'owned', + columns, + actions, + ownerPickerMode, + pagination, + } = props; return ( @@ -55,7 +61,7 @@ export const DefaultTechDocsHome = (props: TechDocsIndexPageProps) => { Discover documentation in your ecosystem. - + diff --git a/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.test.tsx b/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.test.tsx new file mode 100644 index 0000000000..69bcc5d46b --- /dev/null +++ b/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.test.tsx @@ -0,0 +1,168 @@ +/* + * 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, { ReactNode } from 'react'; +import { fireEvent, screen, waitFor } from '@testing-library/react'; +import { CursorPaginatedDocsTable } from './CursorPaginatedDocsTable'; +import { DocsTableRow } from './types'; +import { renderInTestApp } from '@backstage/test-utils'; +import { + DefaultEntityFilters, + EntityKindFilter, + EntityListContextProps, +} from '@backstage/plugin-catalog-react'; +import { MockEntityListContextProvider } from '@backstage/plugin-catalog-react/testUtils'; + +describe('CursorPaginatedDocsTable', () => { + const data = new Array(100).fill(0).map((_, index) => { + const name = `techdocs-${index}`; + return { + entity: { + apiVersion: '1', + kind: 'TestKind', + metadata: { + name, + }, + }, + resolved: { + docsUrl: 'https://example.com', + ownedByRelationsTitle: 'owned', + ownedByRelations: [], + }, + } as DocsTableRow; + }); + + const columns = [ + { + title: 'Title', + field: 'entity.metadata.name', + searchable: true, + }, + ]; + + const wrapInContext = ( + node: ReactNode, + value?: Partial>, + ) => { + return ( + + {node} + + ); + }; + + it('should display all the items', async () => { + await renderInTestApp( + wrapInContext(), + ); + + for (const item of data) { + expect(screen.queryByText(item.entity.metadata.name)).toBeInTheDocument(); + } + }); + + it('should display and invoke the next button', async () => { + const { rerender } = await renderInTestApp( + wrapInContext( + , + ), + ); + + expect( + screen.queryAllByRole('button', { name: 'Next Page' })[0], + ).toBeDisabled(); + + const fn = jest.fn(); + + rerender( + wrapInContext( + , + ), + ); + + const nextButton = screen.queryAllByRole('button', { + name: 'Next Page', + })[0]; + expect(nextButton).toBeEnabled(); + + fireEvent.click(nextButton); + expect(fn).toHaveBeenCalled(); + }); + + it('should display and invoke the prev button', async () => { + const { rerender } = await renderInTestApp( + wrapInContext( + , + ), + ); + + expect( + screen.queryAllByRole('button', { name: 'Next Page' })[0], + ).toBeDisabled(); + + const fn = jest.fn(); + + rerender( + wrapInContext( + , + ), + ); + + const prevButton = screen.queryAllByRole('button', { + name: 'Previous Page', + })[0]; + expect(prevButton).toBeEnabled(); + + fireEvent.click(prevButton); + expect(fn).toHaveBeenCalled(); + }); + + it('should display entity names when loading has finished and no error occurred', async () => { + await renderInTestApp( + e.entity), + totalItems: data.length, + filters: { + kind: new EntityKindFilter('techdocs', 'TechDocs'), + }, + }} + > + + , + ); + + expect(screen.getByText(/techdocs-0/)).toBeInTheDocument(); + expect(screen.getByText(/techdocs-50/)).toBeInTheDocument(); + expect(screen.getByText(/techdocs-99/)).toBeInTheDocument(); + await waitFor(() => { + expect(screen.getByText(/My title/)).toBeInTheDocument(); + }); + }); +}); diff --git a/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.tsx b/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.tsx new file mode 100644 index 0000000000..48a1ecddce --- /dev/null +++ b/plugins/techdocs/src/home/components/Tables/CursorPaginatedDocsTable.tsx @@ -0,0 +1,75 @@ +/* + * 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 { Table, TableProps } from '@backstage/core-components'; +import { DocsTableRow } from './types'; + +type PaginatedDocsTableProps = { + prev?(): void; + next?(): void; +} & TableProps; + +/** + * @internal + */ + +export function CursorPaginatedDocsTable(props: PaginatedDocsTableProps) { + const { + actions, + columns, + data, + next, + prev, + title, + isLoading, + options, + ...restProps + } = props; + + return ( + { + if (page > 0) { + next?.(); + } else { + prev?.(); + } + }} + /* this will enable the prev button accordingly */ + page={prev ? 1 : 0} + /* this will enable the next button accordingly */ + totalCount={next ? Number.MAX_VALUE : Number.MAX_SAFE_INTEGER} + localization={{ pagination: { labelDisplayedRows: '' } }} + isLoading={isLoading} + {...restProps} + /> + ); +} diff --git a/plugins/techdocs/src/home/components/Tables/DocsTable.tsx b/plugins/techdocs/src/home/components/Tables/DocsTable.tsx index b1537affdb..29dbb3fd4f 100644 --- a/plugins/techdocs/src/home/components/Tables/DocsTable.tsx +++ b/plugins/techdocs/src/home/components/Tables/DocsTable.tsx @@ -18,11 +18,7 @@ import React from 'react'; import useCopyToClipboard from 'react-use/esm/useCopyToClipboard'; import { configApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api'; -import { Entity, RELATION_OWNED_BY } from '@backstage/catalog-model'; -import { - getEntityRelations, - humanizeEntityRef, -} from '@backstage/plugin-catalog-react'; +import { Entity } from '@backstage/catalog-model'; import { rootDocsRouteRef } from '../../../routes'; import { EmptyState, @@ -33,9 +29,9 @@ import { TableProps, } from '@backstage/core-components'; import { actionFactories } from './actions'; -import { columnFactories } from './columns'; -import { toLowerMaybe } from '../../../helpers'; +import { columnFactories, defaultColumns } from './columns'; import { DocsTableRow } from './types'; +import { entitiesToDocsMapper } from './helpers'; /** * Props for {@link DocsTable}. @@ -51,14 +47,6 @@ export type DocsTableProps = { options?: TableOptions; }; -const defaultColumns: TableColumn[] = [ - columnFactories.createTitleColumn({ hidden: true }), - columnFactories.createNameColumn(), - columnFactories.createOwnerColumn(), - columnFactories.createKindColumn(), - columnFactories.createTypeColumn(), -]; - /** * Component which renders a table documents * @@ -71,26 +59,11 @@ export const DocsTable = (props: DocsTableProps) => { const config = useApi(configApiRef); if (!entities) return null; - const documents = entities.map(entity => { - const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY); - return { - entity, - resolved: { - docsUrl: getRouteToReaderPageFor({ - namespace: toLowerMaybe( - entity.metadata.namespace ?? 'default', - config, - ), - kind: toLowerMaybe(entity.kind, config), - name: toLowerMaybe(entity.metadata.name, config), - }), - ownedByRelations, - ownedByRelationsTitle: ownedByRelations - .map(r => humanizeEntityRef(r, { defaultKind: 'group' })) - .join(', '), - }, - }; - }); + const documents = entitiesToDocsMapper( + entities, + getRouteToReaderPageFor, + config, + ); const defaultActions: TableProps['actions'] = [ actionFactories.createCopyDocsUrlAction(copyToClipboard), diff --git a/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx b/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx index 563bec4d22..08702d2fde 100644 --- a/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx +++ b/plugins/techdocs/src/home/components/Tables/EntityListDocsTable.tsx @@ -24,14 +24,19 @@ import { TableProps, WarningPanel, } from '@backstage/core-components'; +import { configApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api'; import { useEntityList, useStarredEntities, } from '@backstage/plugin-catalog-react'; import { DocsTable } from './DocsTable'; +import { OffsetPaginatedDocsTable } from './OffsetPaginatedDocsTable'; +import { CursorPaginatedDocsTable } from './CursorPaginatedDocsTable'; import { actionFactories } from './actions'; -import { columnFactories } from './columns'; +import { columnFactories, defaultColumns } from './columns'; import { DocsTableRow } from './types'; +import { rootDocsRouteRef } from '../../../routes'; +import { entitiesToDocsMapper } from './helpers'; /** * Props for {@link EntityListDocsTable}. @@ -51,9 +56,12 @@ export type EntityListDocsTableProps = { */ export const EntityListDocsTable = (props: EntityListDocsTableProps) => { const { columns, actions, options } = props; - const { loading, error, entities, filters } = useEntityList(); + const { loading, error, entities, filters, paginationMode, pageInfo } = + useEntityList(); const { isStarredEntity, toggleStarredEntity } = useStarredEntities(); const [, copyToClipboard] = useCopyToClipboard(); + const getRouteToReaderPageFor = useRouteRef(rootDocsRouteRef); + const config = useApi(configApiRef); const title = capitalize(filters.user?.value ?? 'all'); @@ -65,6 +73,38 @@ export const EntityListDocsTable = (props: EntityListDocsTableProps) => { ), ]; + const documents = entitiesToDocsMapper( + entities, + getRouteToReaderPageFor, + config, + ); + + if (paginationMode === 'cursor') { + return ( + + ); + } else if (paginationMode === 'offset') { + return ( + + ); + } + if (error) { return ( { + const data = new Array(100).fill(0).map((_, index) => { + const name = `tectdocs-${index}`; + return { + entity: { + apiVersion: '1', + kind: 'TestKind', + metadata: { + name, + }, + }, + resolved: { + docsUrl: 'https://example.com', + ownedByRelationsTitle: 'owned', + ownedByRelations: [], + }, + } as DocsTableRow; + }); + + const columns = [ + { + title: 'Title', + field: 'entity.metadata.name', + searchable: true, + }, + ]; + + const wrapInContext = ( + node: ReactNode, + value?: Partial>, + ) => { + return ( + + {node} + + ); + }; + + it('should display all the items', async () => { + await renderInTestApp( + wrapInContext( + , + { + setOffset: jest.fn(), + limit: Number.MAX_SAFE_INTEGER, + offset: 0, + totalItems: data.length, + }, + ), + ); + + for (const item of data) { + expect(screen.queryByText(item.entity.metadata.name)).toBeInTheDocument(); + } + }); + + it('should display and invoke the next and previous buttons', async () => { + const offsetFn = jest.fn(); + + await renderInTestApp( + wrapInContext( + , + { setOffset: offsetFn, limit: 10, totalItems: data.length, offset: 0 }, + ), + ); + + expect(offsetFn).toHaveBeenNthCalledWith(1, 0); + const nextButton = screen.queryAllByRole('button', { + name: 'Next Page', + })[0]; + expect(nextButton).toBeEnabled(); + + fireEvent.click(nextButton); + expect(offsetFn).toHaveBeenNthCalledWith(2, 10); + + const prevButton = screen.queryAllByRole('button', { + name: 'Previous Page', + })[0]; + expect(prevButton).toBeEnabled(); + + fireEvent.click(prevButton); + expect(offsetFn).toHaveBeenNthCalledWith(3, 0); + }); +}); diff --git a/plugins/techdocs/src/home/components/Tables/OffsetPaginatedDocsTable.tsx b/plugins/techdocs/src/home/components/Tables/OffsetPaginatedDocsTable.tsx new file mode 100644 index 0000000000..9f4572117d --- /dev/null +++ b/plugins/techdocs/src/home/components/Tables/OffsetPaginatedDocsTable.tsx @@ -0,0 +1,75 @@ +/* + * 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, { useEffect } from 'react'; + +import { Table, TableProps } from '@backstage/core-components'; +import { DocsTableRow } from './types'; +import { + EntityTextFilter, + useEntityList, +} from '@backstage/plugin-catalog-react'; + +/** + * @internal + */ +export function OffsetPaginatedDocsTable(props: TableProps) { + const { actions, columns, data, isLoading, options } = props; + const { updateFilters, setLimit, setOffset, limit, totalItems, offset } = + useEntityList(); + const [page, setPage] = React.useState( + offset && limit ? Math.floor(offset / limit) : 0, + ); + + useEffect(() => { + if (totalItems && page * limit >= totalItems) { + setOffset!(Math.max(0, totalItems - limit)); + } else { + setOffset!(Math.max(0, page * limit)); + } + }, [setOffset, page, limit, totalItems]); + + return ( + + columns={columns} + data={data} + options={{ + paginationPosition: 'both', + pageSizeOptions: [5, 10, 20, 50, 100], + pageSize: limit, + emptyRowsWhenPaging: false, + actionsColumnIndex: -1, + ...options, + }} + actions={actions} + onSearchChange={(searchText: string) => + updateFilters({ + text: searchText ? new EntityTextFilter(searchText) : undefined, + }) + } + page={page} + onPageChange={newPage => { + setPage(newPage); + }} + onRowsPerPageChange={pageSize => { + setLimit(pageSize); + }} + totalCount={totalItems} + localization={{ pagination: { labelDisplayedRows: '' } }} + isLoading={isLoading} + /> + ); +} diff --git a/plugins/techdocs/src/home/components/Tables/columns.tsx b/plugins/techdocs/src/home/components/Tables/columns.tsx index ef22f6d288..9947e1de9e 100644 --- a/plugins/techdocs/src/home/components/Tables/columns.tsx +++ b/plugins/techdocs/src/home/components/Tables/columns.tsx @@ -85,3 +85,11 @@ export const columnFactories = { }; }, }; + +export const defaultColumns: TableColumn[] = [ + columnFactories.createTitleColumn({ hidden: true }), + columnFactories.createNameColumn(), + columnFactories.createOwnerColumn(), + columnFactories.createKindColumn(), + columnFactories.createTypeColumn(), +]; diff --git a/plugins/techdocs/src/home/components/Tables/helpers.ts b/plugins/techdocs/src/home/components/Tables/helpers.ts new file mode 100644 index 0000000000..4c6383c35e --- /dev/null +++ b/plugins/techdocs/src/home/components/Tables/helpers.ts @@ -0,0 +1,56 @@ +/* + * 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 { RELATION_OWNED_BY, Entity } from '@backstage/catalog-model'; +import { + getEntityRelations, + humanizeEntityRef, +} from '@backstage/plugin-catalog-react'; +import { toLowerMaybe } from '../../../helpers'; +import { ConfigApi, RouteFunc } from '@backstage/core-plugin-api'; + +type getRouteFunc = RouteFunc<{ + namespace: string; + kind: string; + name: string; +}>; + +export function entitiesToDocsMapper( + entities: Entity[], + getRouteToReaderPageFor: getRouteFunc, + config: ConfigApi, +) { + return entities.map(entity => { + const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY); + return { + entity, + resolved: { + docsUrl: getRouteToReaderPageFor({ + namespace: toLowerMaybe( + entity.metadata.namespace ?? 'default', + config, + ), + kind: toLowerMaybe(entity.kind, config), + name: toLowerMaybe(entity.metadata.name, config), + }), + ownedByRelations, + ownedByRelationsTitle: ownedByRelations + .map(r => humanizeEntityRef(r, { defaultKind: 'group' })) + .join(', '), + }, + }; + }); +} diff --git a/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx b/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx index 409d68a593..585248c6c9 100644 --- a/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx +++ b/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx @@ -14,7 +14,11 @@ * limitations under the License. */ -import { catalogApiRef } from '@backstage/plugin-catalog-react'; +import { + catalogApiRef, + starredEntitiesApiRef, + MockStarredEntitiesApi, +} from '@backstage/plugin-catalog-react'; import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; import { screen } from '@testing-library/react'; @@ -37,7 +41,10 @@ const mockCatalogApi = catalogApiMock({ }); describe('TechDocsCustomHome', () => { - const apiRegistry = TestApiRegistry.from([catalogApiRef, mockCatalogApi]); + const apiRegistry = TestApiRegistry.from( + [catalogApiRef, mockCatalogApi], + [starredEntitiesApiRef, new MockStarredEntitiesApi()], + ); it('should render a TechDocs home page', async () => { const tabsConfig = [ diff --git a/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx b/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx index 56d086acfc..d89bc5ee1b 100644 --- a/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx +++ b/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx @@ -23,6 +23,7 @@ import { catalogApiRef, CatalogApi, useEntityOwnership, + EntityListProvider, } from '@backstage/plugin-catalog-react'; import { Entity } from '@backstage/catalog-model'; import { DocsTable } from './Tables'; @@ -127,7 +128,9 @@ const CustomPanel = ({ ) : null}
- + + +
); diff --git a/plugins/techdocs/src/home/components/TechDocsIndexPage.tsx b/plugins/techdocs/src/home/components/TechDocsIndexPage.tsx index adbb68d3e9..cc89d22c08 100644 --- a/plugins/techdocs/src/home/components/TechDocsIndexPage.tsx +++ b/plugins/techdocs/src/home/components/TechDocsIndexPage.tsx @@ -18,6 +18,7 @@ import React from 'react'; import { useOutlet } from 'react-router-dom'; import { TableColumn, TableProps } from '@backstage/core-components'; import { + EntityListPagination, EntityOwnerPickerProps, UserListFilterKind, } from '@backstage/plugin-catalog-react'; @@ -34,6 +35,7 @@ export type TechDocsIndexPageProps = { columns?: TableColumn[]; actions?: TableProps['actions']; ownerPickerMode?: EntityOwnerPickerProps['mode']; + pagination?: EntityListPagination; }; export const TechDocsIndexPage = (props: TechDocsIndexPageProps) => { diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index f757f72741..00dfa70701 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-user-settings-backend +## 0.2.29-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-signals-node@0.1.16-next.1 + - @backstage/plugin-user-settings-common@0.0.1 + +## 0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-node@0.1.16-next.0 + - @backstage/plugin-user-settings-common@0.0.1 + +## 0.2.28 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-node@0.1.15 + - @backstage/plugin-user-settings-common@0.0.1 + +## 0.2.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-signals-node@0.1.15-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-user-settings-common@0.0.1 + ## 0.2.28-next.1 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 6a8d4a4a0c..9cfa486243 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings-backend", - "version": "0.2.28-next.1", + "version": "0.2.29-next.1", "description": "The Backstage backend plugin to manage user settings", "backstage": { "role": "backend-plugin", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index c14cae5ee4..2075e06bc9 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,67 @@ # @backstage/plugin-user-settings +## 0.8.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-signals-react@0.0.9-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/theme@0.6.3 + - @backstage/plugin-user-settings-common@0.0.1 + +## 0.8.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/core-compat-api@0.3.4 + +## 0.8.17 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/core-app-api@1.15.3 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8 + - @backstage/plugin-user-settings-common@0.0.1 + +## 0.8.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-signals-react@0.0.8-next.0 + - @backstage/plugin-user-settings-common@0.0.1 + ## 0.8.17-next.1 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 79b21a2f51..baf6090d6d 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings", - "version": "0.8.17-next.1", + "version": "0.8.18-next.1", "description": "A Backstage plugin that provides a settings page", "backstage": { "role": "frontend-plugin", diff --git a/storybook/yarn.lock b/storybook/yarn.lock index 80d4a3e7fd..be21a0fead 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -581,27 +581,29 @@ __metadata: languageName: node linkType: hard -"@eslint/config-array@npm:^0.18.0": - version: 0.18.0 - resolution: "@eslint/config-array@npm:0.18.0" +"@eslint/config-array@npm:^0.19.0": + version: 0.19.1 + resolution: "@eslint/config-array@npm:0.19.1" dependencies: - "@eslint/object-schema": ^2.1.4 + "@eslint/object-schema": ^2.1.5 debug: ^4.3.1 minimatch: ^3.1.2 - checksum: 5ff748e1788745bfb3160c3b3151d62a7c054e336e9fe8069e86cfa6106f3abbd59b24f1253122268295f98c66803e9a7b23d7f947a8c00f62d2060cc44bc7fc + checksum: 421aad712a5ef1a3d118b5e0857f79c080f9dd619a76ce19d20105d381521583786f7abb1195744af9e62a5124e6657066eb6780e920f4001846bd91c1a665f0 languageName: node linkType: hard -"@eslint/core@npm:^0.7.0": - version: 0.7.0 - resolution: "@eslint/core@npm:0.7.0" - checksum: 91d4aa2805f356fb0bba693411deab91590472666e22c9c03304ba03b288b74403a5e120db16d0926ea94281e15563a8d4d519cd1e565d514e2d5015a84b8575 +"@eslint/core@npm:^0.9.0": + version: 0.9.1 + resolution: "@eslint/core@npm:0.9.1" + dependencies: + "@types/json-schema": ^7.0.15 + checksum: 33c8159842cc3a646caa267c008cb567ca60e0220bcdcf6e426128409953b8f6a9b142246db616c71d06331edf769c192d7e2792b3f19c2a6b8179e491512d89 languageName: node linkType: hard -"@eslint/eslintrc@npm:^3.1.0": - version: 3.1.0 - resolution: "@eslint/eslintrc@npm:3.1.0" +"@eslint/eslintrc@npm:^3.2.0": + version: 3.2.0 + resolution: "@eslint/eslintrc@npm:3.2.0" dependencies: ajv: ^6.12.4 debug: ^4.3.2 @@ -612,30 +614,30 @@ __metadata: js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: b0a9bbd98c8b9e0f4d975b042ff9b874dde722b20834ea2ff46551c3de740d4f10f56c449b790ef34d7f82147cbddfc22b004a43cc885dbc2664bb134766b5e4 + checksum: c898e4d12f4c9a79a61ee3c91e38eea5627a04e021cb749191e8537445858bfe32f810eca0cb2dc9902b8ad8b65ca07ef7221dc4bad52afe60cbbf50ec56c236 languageName: node linkType: hard -"@eslint/js@npm:9.14.0": - version: 9.14.0 - resolution: "@eslint/js@npm:9.14.0" - checksum: 727767d3c80bf88e08565af10cc3732ca0d272c729bbd39043722a203eea289ec6149ab42d977d2d28a81d99329dceeed091b70db37b868e6659913a0840e17b +"@eslint/js@npm:9.17.0": + version: 9.17.0 + resolution: "@eslint/js@npm:9.17.0" + checksum: b68a14ff518ffa12e3b85fa9c72b818faeff092285acfbf02da2d0fb12a681b76651638881e98845f2df2ed346ed0d33faeb1d9caac163daf232c223b7efe89c languageName: node linkType: hard -"@eslint/object-schema@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/object-schema@npm:2.1.4" - checksum: 5a03094115bcdab7991dbbc5d17a9713f394cebb4b44d3eaf990d7487b9b8e1877b817997334ab40be52e299a0384595c6f6ba91b389901e5e1d21efda779271 +"@eslint/object-schema@npm:^2.1.5": + version: 2.1.5 + resolution: "@eslint/object-schema@npm:2.1.5" + checksum: 5facffc832bae93c510f4d38f0f1cbfebd3d7ec772ece6b801bd09bf2dce52e781f4dea500aa133d02257e04ed6a3958fa18cbaed1f9623974a804ee60a8ca54 languageName: node linkType: hard -"@eslint/plugin-kit@npm:^0.2.0": - version: 0.2.3 - resolution: "@eslint/plugin-kit@npm:0.2.3" +"@eslint/plugin-kit@npm:^0.2.3": + version: 0.2.4 + resolution: "@eslint/plugin-kit@npm:0.2.4" dependencies: levn: ^0.4.1 - checksum: b93b9c3f5b1722d09cc4e609abd4510130f659f70f6417b68ac7c4ad9fbf9e3d4f0ef5b6f2bad106eb8c1c1b2146bd0391e0a1c00ddeae46c917f175b8c0da4b + checksum: 5693465dca5fc6f27b090f987b51bc738f48c6a6b5678dcc1791522921834206388b462578edd362d458e8de6dcd21cce1a2e8cff47d1512411ba0389112c231 languageName: node linkType: hard @@ -670,10 +672,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/retry@npm:^0.4.0": - version: 0.4.0 - resolution: "@humanwhocodes/retry@npm:0.4.0" - checksum: a1ea6ba7deff692f08770bea159eb53f280d6b56e6a340c238679752c3d2956797e31431a19a0e1cd303cfb130200024d3dc6bec36c7d98edd4789006d19dfd1 +"@humanwhocodes/retry@npm:^0.4.1": + version: 0.4.1 + resolution: "@humanwhocodes/retry@npm:0.4.1" + checksum: f11167c28e8266faba470fd273cbaafe2827523492bc18c5623015adb7ed66f46b2e542e3d756fed9ca614300249267814220c2f5f03a59e07fdfa64fc14ad52 languageName: node linkType: hard @@ -2304,14 +2306,14 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": - version: 7.0.5 - resolution: "cross-spawn@npm:7.0.5" +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.6": + 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: 55c50004cb6bbea3649784caac6e7b8ddd03fa8c1e14dbd5a1f15896708378006eb7526a52a0f48770c768c9b8aed48a5888eb8e785ff59ff7749e74f66cd96b + checksum: 8d306efacaf6f3f60e0224c287664093fa9185680b2d195852ba9a863f85d02dcc737094c6e512175f8ee0161f9b87c73c6826034c2422e39de7d6569cf4503b languageName: node linkType: hard @@ -2687,15 +2689,15 @@ __metadata: linkType: hard "eslint-plugin-storybook@npm:^0.11.0": - version: 0.11.0 - resolution: "eslint-plugin-storybook@npm:0.11.0" + version: 0.11.1 + resolution: "eslint-plugin-storybook@npm:0.11.1" dependencies: "@storybook/csf": ^0.1.11 "@typescript-eslint/utils": ^8.8.1 ts-dedent: ^2.2.0 peerDependencies: eslint: ">=6" - checksum: 52baa35ed4f49bc46bd323784ac2a48a615f0fd929b66dfec11bb2cbceded1a9978b68cbb1165aa36f078190651f93243f871ead368bb2f1ee131c7d00e265e9 + checksum: 8b8eb30b598f3c44c2bbf921e318215338f1159c1fba2d2f6cd5bc0b2ec14515655cf1760b5e11355baddabc2ac8446d4dc18ee6df6d2252555b126ff649a421 languageName: node linkType: hard @@ -2734,24 +2736,24 @@ __metadata: linkType: hard "eslint@npm:^9.11.1": - version: 9.14.0 - resolution: "eslint@npm:9.14.0" + version: 9.17.0 + resolution: "eslint@npm:9.17.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.12.1 - "@eslint/config-array": ^0.18.0 - "@eslint/core": ^0.7.0 - "@eslint/eslintrc": ^3.1.0 - "@eslint/js": 9.14.0 - "@eslint/plugin-kit": ^0.2.0 + "@eslint/config-array": ^0.19.0 + "@eslint/core": ^0.9.0 + "@eslint/eslintrc": ^3.2.0 + "@eslint/js": 9.17.0 + "@eslint/plugin-kit": ^0.2.3 "@humanfs/node": ^0.16.6 "@humanwhocodes/module-importer": ^1.0.1 - "@humanwhocodes/retry": ^0.4.0 + "@humanwhocodes/retry": ^0.4.1 "@types/estree": ^1.0.6 "@types/json-schema": ^7.0.15 ajv: ^6.12.4 chalk: ^4.0.0 - cross-spawn: ^7.0.2 + cross-spawn: ^7.0.6 debug: ^4.3.2 escape-string-regexp: ^4.0.0 eslint-scope: ^8.2.0 @@ -2771,7 +2773,6 @@ __metadata: minimatch: ^3.1.2 natural-compare: ^1.4.0 optionator: ^0.9.3 - text-table: ^0.2.0 peerDependencies: jiti: "*" peerDependenciesMeta: @@ -2779,7 +2780,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 1b54112da245f4175fbcf31ea5f71da38dda1bb8f5d645f3b2420035a4310949fda57af14ca7f7992e36374da8c06b94bf20ec8bda64a09409d818aefd0bf09c + checksum: 0caae58c53bf4dc9b4893d75e62339e4c40fe5589652a3cb63f30a15bad1f34f8f784ca4fca471bbffedabee516a9f9620ebc33818b55e1b715e8f000865c851 languageName: node linkType: hard @@ -4622,13 +4623,6 @@ __metadata: languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - "tiny-invariant@npm:^1.3.1, tiny-invariant@npm:^1.3.3": version: 1.3.3 resolution: "tiny-invariant@npm:1.3.3" diff --git a/yarn.lock b/yarn.lock index daa4928cc2..e98105adf4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -204,13 +204,13 @@ __metadata: linkType: hard "@apidevtools/json-schema-ref-parser@npm:^11.0.0, @apidevtools/json-schema-ref-parser@npm:^11.7.0": - version: 11.7.2 - resolution: "@apidevtools/json-schema-ref-parser@npm:11.7.2" + version: 11.7.3 + resolution: "@apidevtools/json-schema-ref-parser@npm:11.7.3" dependencies: "@jsdevtools/ono": ^7.1.3 "@types/json-schema": ^7.0.15 js-yaml: ^4.1.0 - checksum: 44096e5cd5a03b17ee5eb0a3b9e9a4db85d87da8ae2abda264eae615f2a43e3e6ba5ca208e1161d4d946755b121c10a9550e88792a725951f2c4cff6df0d8a19 + checksum: 3496edfb2c3d2f9a5a7a49795b4d560f1e4957015aef473775f4b5f2db55a4ddfb3778783401ddd24e7db2930a67a370fb8c68840d8bae0a2a581e0e57fc2f58 languageName: node linkType: hard @@ -336,8 +336,8 @@ __metadata: linkType: hard "@asyncapi/react-component@npm:^2.3.3": - version: 2.4.5 - resolution: "@asyncapi/react-component@npm:2.4.5" + version: 2.5.0 + resolution: "@asyncapi/react-component@npm:2.5.0" dependencies: "@asyncapi/avro-schema-parser": ^3.0.24 "@asyncapi/openapi-schema-parser": ^3.0.24 @@ -347,11 +347,12 @@ __metadata: isomorphic-dompurify: ^2.14.0 marked: ^4.0.14 openapi-sampler: ^1.2.1 + react-error-boundary: ^4.1.2 use-resize-observer: ^9.1.0 peerDependencies: react: ">=18.0.0" react-dom: ">=18.0.0" - checksum: 681eb6eb3fe2f9874725b368c298b7069373b7fb706437d15449ad747552ee515c0677ed7334c1826776b786fab57363817fd737d31f9f1d116fea3b58eef742 + checksum: d975f6182370f43aef9697e3e5b02d93b8ac8b8fcc43a0f8c4315681fdc3b6819078aa6ff963af1193fe7719c2cee78d55a57f188eb472b3e77494a90dbc75e5 languageName: node linkType: hard @@ -1824,8 +1825,8 @@ __metadata: linkType: hard "@azure/storage-blob@npm:^12.5.0": - version: 12.25.0 - resolution: "@azure/storage-blob@npm:12.25.0" + version: 12.26.0 + resolution: "@azure/storage-blob@npm:12.26.0" dependencies: "@azure/abort-controller": ^2.1.2 "@azure/core-auth": ^1.4.0 @@ -1840,7 +1841,7 @@ __metadata: "@azure/logger": ^1.0.0 events: ^3.0.0 tslib: ^2.2.0 - checksum: e592a27d9b8c76654c255544c4b53faea1468bf58f6acb9839115785de46fb6cbd3dce61bb11335af13b932bc651a53eb99140427c7cfcb3f8bd36ecedf38c17 + checksum: c3f7572bc54cd9e74ac73fa9225cc9398a716e574ff9b637e5b27faf4ac2d6207dc64b39f5dcff1671c4cb6730fbd765ebf796abd3e18ef95f5071d613ce3a13 languageName: node linkType: hard @@ -1871,7 +1872,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.9, @babel/core@npm:^7.19.6, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.7, @babel/core@npm:^7.26.0": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.9, @babel/core@npm:^7.19.6, @babel/core@npm:^7.24.7, @babel/core@npm:^7.26.0": version: 7.26.0 resolution: "@babel/core@npm:7.26.0" dependencies: @@ -2433,7 +2434,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.23.3, @babel/plugin-syntax-typescript@npm:^7.24.7, @babel/plugin-syntax-typescript@npm:^7.7.2": +"@babel/plugin-syntax-typescript@npm:^7.24.7, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.25.9 resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" dependencies: @@ -3324,7 +3325,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.25.6, @babel/runtime@npm:^7.26.0, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.26.0, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.26.0 resolution: "@babel/runtime@npm:7.26.0" dependencies: @@ -3645,13 +3646,13 @@ __metadata: node-forge: ^1.3.1 node-mocks-http: ^1.0.0 p-limit: ^3.1.0 + p-throttle: ^4.1.1 path-to-regexp: ^8.0.0 pg: ^8.11.3 pg-connection-string: ^2.3.0 pg-format: ^1.0.4 raw-body: ^2.4.1 selfsigned: ^2.0.0 - stoppable: ^1.1.0 supertest: ^7.0.0 tar: ^6.1.12 triple-beam: ^1.4.1 @@ -3744,22 +3745,21 @@ __metadata: languageName: unknown linkType: soft -"@backstage/backend-plugin-api@npm:^1.0.0, @backstage/backend-plugin-api@npm:^1.0.2": - version: 1.0.2 - resolution: "@backstage/backend-plugin-api@npm:1.0.2" +"@backstage/backend-plugin-api@npm:^1.0.0, @backstage/backend-plugin-api@npm:^1.1.0": + version: 1.1.0 + resolution: "@backstage/backend-plugin-api@npm:1.1.0" dependencies: "@backstage/cli-common": ^0.1.15 - "@backstage/config": ^1.3.0 - "@backstage/errors": ^1.2.5 - "@backstage/plugin-auth-node": ^0.5.4 - "@backstage/plugin-permission-common": ^0.8.2 + "@backstage/config": ^1.3.1 + "@backstage/errors": ^1.2.6 + "@backstage/plugin-auth-node": ^0.5.5 + "@backstage/plugin-permission-common": ^0.8.3 "@backstage/types": ^1.2.0 "@types/express": ^4.17.6 "@types/luxon": ^3.0.0 - express: ^4.17.1 knex: ^3.0.0 luxon: ^3.0.0 - checksum: c74ff15e54ddf31608551875b8b3c41d606ed889908b47baf167e76cf1a8cdd13b1697b8d3e12396e8ae538c7ef879b96a2e13c1bb5011c0bf1ac23719e7795c + checksum: 0a58762708c714511f7be16dcc6f5ceb80fb572f14f812887de2c93d83da4c70a62288fe0becb86b85f1319dcea1c632891bf2869bdca14b94d16d8066dba9ae languageName: node linkType: hard @@ -3826,35 +3826,28 @@ __metadata: resolution: "@backstage/canon@workspace:packages/canon" dependencies: "@backstage/cli": "workspace:^" - "@base_ui/react": ^1.0.0-alpha.3 + "@base-ui-components/react": ^1.0.0-alpha.4 "@chromatic-com/storybook": ^3.2.2 "@remixicon/react": ^4.5.0 - "@storybook/addon-essentials": ^8.4.5 - "@storybook/addon-interactions": ^8.4.5 + "@storybook/addon-essentials": ^8.4.7 + "@storybook/addon-interactions": ^8.4.7 "@storybook/addon-styling-webpack": ^1.0.1 - "@storybook/addon-themes": ^8.4.5 + "@storybook/addon-themes": ^8.4.7 "@storybook/addon-webpack5-compiler-swc": ^1.0.5 - "@storybook/blocks": ^8.4.5 - "@storybook/react": ^8.4.5 - "@storybook/react-webpack5": ^8.4.5 - "@storybook/test": ^8.4.5 + "@storybook/blocks": ^8.4.7 + "@storybook/react": ^8.4.7 + "@storybook/react-webpack5": ^8.4.7 + "@storybook/test": ^8.4.7 "@testing-library/jest-dom": ^6.0.0 "@types/react": ^18.0.0 "@types/react-dom": ^18.0.0 - "@vanilla-extract/css": ^1.16.0 - "@vanilla-extract/dynamic": ^2.1.2 - "@vanilla-extract/recipes": ^0.5.5 - "@vanilla-extract/rollup-plugin": ^1.3.10 - "@vanilla-extract/sprinkles": ^1.6.3 - "@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.5 - webpack-merge: ^6.0.1 + storybook: ^8.4.7 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 react: ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -3866,15 +3859,15 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-client@npm:^1.8.0": - version: 1.8.0 - resolution: "@backstage/catalog-client@npm:1.8.0" +"@backstage/catalog-client@npm:^1.9.0": + version: 1.9.0 + resolution: "@backstage/catalog-client@npm:1.9.0" dependencies: - "@backstage/catalog-model": ^1.7.1 - "@backstage/errors": ^1.2.5 + "@backstage/catalog-model": ^1.7.2 + "@backstage/errors": ^1.2.6 cross-fetch: ^4.0.0 uri-template: ^2.0.0 - checksum: 781ce437855eb59cf33687866b64d374471ed9376cdaec9aa4f5dc389ee2a5eb41e98707c902312cc4b99dfc885daa7e26d59228cf6eb5b539c9207aeda02f8c + checksum: ef26c36aee89ab1e8700fc681f5f62aa188cda714ae8bfe65ea154dc73ee6986ebabf2910805687d7eb66841765b0b6430c701726ec1f8171585a552e1f8d44f languageName: node linkType: hard @@ -3891,7 +3884,19 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@^1.4.3, @backstage/catalog-model@^1.7.0, @backstage/catalog-model@^1.7.1, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": +"@backstage/catalog-model@npm:^1.4.3, @backstage/catalog-model@npm:^1.7.0, @backstage/catalog-model@npm:^1.7.2": + version: 1.7.2 + resolution: "@backstage/catalog-model@npm:1.7.2" + dependencies: + "@backstage/errors": ^1.2.6 + "@backstage/types": ^1.2.0 + ajv: ^8.10.0 + lodash: ^4.17.21 + checksum: 97b166303e9428c03e20750360f830a3810e70362143429e847df552cc197c60a560075f59776515518f618d9e754e377d07abaefaf6b73df8b08385f3bdd00d + languageName: node + linkType: hard + +"@backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": version: 0.0.0-use.local resolution: "@backstage/catalog-model@workspace:packages/catalog-model" dependencies: @@ -3962,7 +3967,7 @@ __metadata: "@backstage/theme": "workspace:^" "@backstage/types": "workspace:^" "@manypkg/get-packages": ^1.1.3 - "@module-federation/enhanced": ^0.7.0 + "@module-federation/enhanced": ^0.8.0 "@octokit/graphql": ^5.0.0 "@octokit/graphql-schema": ^13.7.0 "@octokit/oauth-app": ^4.2.0 @@ -4005,8 +4010,8 @@ __metadata: "@types/webpack-env": ^1.15.2 "@types/webpack-sources": ^3.2.3 "@types/yarnpkg__lockfile": ^1.1.4 - "@typescript-eslint/eslint-plugin": ^6.12.0 - "@typescript-eslint/parser": ^6.7.2 + "@typescript-eslint/eslint-plugin": ^8.17.0 + "@typescript-eslint/parser": ^8.16.0 "@vitejs/plugin-react": ^4.3.1 "@yarnpkg/lockfile": ^1.1.0 "@yarnpkg/parsers": ^3.0.0 @@ -4017,7 +4022,7 @@ __metadata: commander: ^12.0.0 cross-fetch: ^4.0.0 cross-spawn: ^7.0.3 - css-loader: ^7.0.0 + css-loader: ^6.5.1 ctrlc-windows: ^2.1.0 del: ^8.0.0 esbuild: ^0.24.0 @@ -4025,14 +4030,14 @@ __metadata: eslint: ^8.6.0 eslint-config-prettier: ^9.0.0 eslint-formatter-friendly: ^7.0.0 - eslint-plugin-deprecation: ^2.0.0 - eslint-plugin-import: ^2.25.4 - eslint-plugin-jest: ^28.0.0 - eslint-plugin-jsx-a11y: ^6.5.1 - eslint-plugin-react: ^7.28.0 - eslint-plugin-react-hooks: ^4.3.0 - eslint-plugin-unused-imports: ^3.0.0 - eslint-webpack-plugin: ^4.0.0 + eslint-plugin-deprecation: ^3.0.0 + eslint-plugin-import: ^2.31.0 + eslint-plugin-jest: ^28.9.0 + eslint-plugin-jsx-a11y: ^6.10.2 + eslint-plugin-react: ^7.37.2 + eslint-plugin-react-hooks: ^5.0.0 + eslint-plugin-unused-imports: ^4.1.4 + eslint-webpack-plugin: ^4.2.0 express: ^4.17.1 fork-ts-checker-webpack-plugin: ^9.0.0 fs-extra: ^11.2.0 @@ -4139,12 +4144,12 @@ __metadata: linkType: soft "@backstage/config-loader@npm:^1.9.1": - version: 1.9.2 - resolution: "@backstage/config-loader@npm:1.9.2" + version: 1.9.4 + resolution: "@backstage/config-loader@npm:1.9.4" dependencies: "@backstage/cli-common": ^0.1.15 - "@backstage/config": ^1.3.0 - "@backstage/errors": ^1.2.5 + "@backstage/config": ^1.3.1 + "@backstage/errors": ^1.2.6 "@backstage/types": ^1.2.0 "@types/json-schema": ^7.0.6 ajv: ^8.10.0 @@ -4155,10 +4160,9 @@ __metadata: 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 - checksum: 92d0be7ccb05879d6a095adca144f3e9a330072282a9fddd1300f908d9292cc8531f248309df687c241b22825d63116e1b56f334cfac399e9b93dca22fe77e29 + checksum: 2cd930531e4433252a0354b875eacbe9b889e592ef1b0d3c78be62a1ed0b9b397bb24b980125b5d5a0526c55e718312bebfb34f12df87e42b20d8bfca3e61c72 languageName: node linkType: hard @@ -4189,7 +4193,18 @@ __metadata: languageName: unknown linkType: soft -"@backstage/config@^1.1.1, @backstage/config@^1.2.0, @backstage/config@^1.3.0, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": +"@backstage/config@npm:^1.1.1, @backstage/config@npm:^1.2.0, @backstage/config@npm:^1.3.1": + version: 1.3.1 + resolution: "@backstage/config@npm:1.3.1" + dependencies: + "@backstage/errors": ^1.2.6 + "@backstage/types": ^1.2.0 + ms: ^2.1.3 + checksum: aa193687f19b0f6d928eab8474e30425723bd86bb272f9576ce731edb580d403c339cda2a10553c48e50d08b4f3fb4c79f9fd63f8e8156b8e5da69e4ca83ba86 + languageName: node + linkType: hard + +"@backstage/config@workspace:^, @backstage/config@workspace:packages/config": version: 0.0.0-use.local resolution: "@backstage/config@workspace:packages/config" dependencies: @@ -4201,12 +4216,12 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-app-api@npm:^1.15.2": - version: 1.15.2 - resolution: "@backstage/core-app-api@npm:1.15.2" +"@backstage/core-app-api@npm:^1.15.3": + version: 1.15.3 + resolution: "@backstage/core-app-api@npm:1.15.3" dependencies: - "@backstage/config": ^1.3.0 - "@backstage/core-plugin-api": ^1.10.1 + "@backstage/config": ^1.3.1 + "@backstage/core-plugin-api": ^1.10.2 "@backstage/types": ^1.2.0 "@backstage/version-bridge": ^1.0.10 "@types/prop-types": ^15.7.3 @@ -4225,7 +4240,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 7539410665879107bfbe8ae697e9949ba3c697f9ebb63b61a59adb955bee3c35a581cc7d4b16a9c7830adf87081b5968f8ead3719019c3c08f80e2c17840ab0a + checksum: cba984dc0afe7b6bbb1b8fdc4bfc349bceab766d189c7517e39502042d38084c3d54610610e1ba305c8c1e5ccaa4a298c2640910d0a15d6741848c62c2436cc5 languageName: node linkType: hard @@ -4273,12 +4288,12 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-compat-api@npm:^0.3.3": - version: 0.3.3 - resolution: "@backstage/core-compat-api@npm:0.3.3" +"@backstage/core-compat-api@npm:^0.3.4": + version: 0.3.4 + resolution: "@backstage/core-compat-api@npm:0.3.4" dependencies: - "@backstage/core-plugin-api": ^1.10.1 - "@backstage/frontend-plugin-api": ^0.9.2 + "@backstage/core-plugin-api": ^1.10.2 + "@backstage/frontend-plugin-api": ^0.9.3 "@backstage/version-bridge": ^1.0.10 lodash: ^4.17.21 peerDependencies: @@ -4289,7 +4304,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 22b787b80d8e4bfd5ee2da7177fb1c2f64476ee507ab70686a6109ac39fad209896bc3aa09dadf6fb2ad22b0c899202b959d536f70227eebe0598bab1a0a6c50 + checksum: f6912e18abb9f549e50c102a2ff1198b06f41598392deeace7e43d812e2bc665e73a585e14922e12014e497a25b579388b1a3c9c094f6c6dc210e12bc10c391f languageName: node linkType: hard @@ -4309,7 +4324,7 @@ __metadata: "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" "@backstage/version-bridge": "workspace:^" - "@oriflame/backstage-plugin-score-card": ^0.8.0 + "@oriflame/backstage-plugin-score-card": ^0.9.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 "@types/react": ^18.0.0 @@ -4432,14 +4447,14 @@ __metadata: languageName: node linkType: hard -"@backstage/core-components@npm:^0.16.1": - version: 0.16.1 - resolution: "@backstage/core-components@npm:0.16.1" +"@backstage/core-components@npm:^0.16.2": + version: 0.16.2 + resolution: "@backstage/core-components@npm:0.16.2" dependencies: - "@backstage/config": ^1.3.0 - "@backstage/core-plugin-api": ^1.10.1 - "@backstage/errors": ^1.2.5 - "@backstage/theme": ^0.6.2 + "@backstage/config": ^1.3.1 + "@backstage/core-plugin-api": ^1.10.2 + "@backstage/errors": ^1.2.6 + "@backstage/theme": ^0.6.3 "@backstage/version-bridge": ^1.0.10 "@date-io/core": ^1.3.13 "@material-table/core": ^3.1.0 @@ -4481,7 +4496,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 83b5acfa236dc8c6ec7128030b8ef68fbc851c4fd3ccc10bf4b4bb5a95c07606bac845c47dae08ce2a852c0ec2d335e6e8850c7621a57c970dbeb0466b8ee958 + checksum: 7d9c89e3abca65828399958cbca5642f003ff8d1b0a5d9b45b36f7fc1b9607df30f74c369b04e11d194e691cd55e26822c726dec4e5b005c25b284ac7c5240bc languageName: node linkType: hard @@ -4563,7 +4578,28 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@^1.10.0, @backstage/core-plugin-api@^1.10.1, @backstage/core-plugin-api@^1.8.2, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@npm:^1.10.0, @backstage/core-plugin-api@npm:^1.10.2, @backstage/core-plugin-api@npm:^1.8.2": + version: 1.10.2 + resolution: "@backstage/core-plugin-api@npm:1.10.2" + dependencies: + "@backstage/config": ^1.3.1 + "@backstage/errors": ^1.2.6 + "@backstage/types": ^1.2.0 + "@backstage/version-bridge": ^1.0.10 + history: ^5.0.0 + 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 + checksum: c2bb2857237ca2453fddd1361142ab7fb26345ae833e90383a83fc8a186b31efef5d60e96423c21ebad4dd47c677e5f4a87460149a10eabdb790cbac844f83ae + languageName: node + linkType: hard + +"@backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": version: 0.0.0-use.local resolution: "@backstage/core-plugin-api@workspace:packages/core-plugin-api" dependencies: @@ -4674,7 +4710,17 @@ __metadata: languageName: unknown linkType: soft -"@backstage/errors@^1.2.3, @backstage/errors@^1.2.4, @backstage/errors@^1.2.5, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": +"@backstage/errors@npm:^1.2.3, @backstage/errors@npm:^1.2.4, @backstage/errors@npm:^1.2.6": + version: 1.2.6 + resolution: "@backstage/errors@npm:1.2.6" + dependencies: + "@backstage/types": ^1.2.0 + serialize-error: ^8.0.1 + checksum: 9867157464cf5f8821109faa46c101a30f94b701e08b7cb23c5884a2e83aa4b06ff7118b62210da84db1a770b1171ec219b161caf04748ad4b8c2f90a9f0fdc5 + languageName: node + linkType: hard + +"@backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@backstage/errors@workspace:packages/errors" dependencies: @@ -4696,16 +4742,16 @@ __metadata: languageName: unknown linkType: soft -"@backstage/frontend-app-api@npm:^0.10.2": - version: 0.10.2 - resolution: "@backstage/frontend-app-api@npm:0.10.2" +"@backstage/frontend-app-api@npm:^0.10.3": + version: 0.10.3 + resolution: "@backstage/frontend-app-api@npm:0.10.3" dependencies: - "@backstage/config": ^1.3.0 - "@backstage/core-app-api": ^1.15.2 - "@backstage/core-plugin-api": ^1.10.1 - "@backstage/errors": ^1.2.5 - "@backstage/frontend-defaults": ^0.1.3 - "@backstage/frontend-plugin-api": ^0.9.2 + "@backstage/config": ^1.3.1 + "@backstage/core-app-api": ^1.15.3 + "@backstage/core-plugin-api": ^1.10.2 + "@backstage/errors": ^1.2.6 + "@backstage/frontend-defaults": ^0.1.4 + "@backstage/frontend-plugin-api": ^0.9.3 "@backstage/types": ^1.2.0 "@backstage/version-bridge": ^1.0.10 lodash: ^4.17.21 @@ -4718,7 +4764,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 7e3485557c7c852a05e0d8567c8b944457c353bafbdd7b21c8cf22a5927c8a18a8a36ec092e9212bad4613f6f0ca7828e9c74ea2b2edc01159c2cffac9d4a0b3 + checksum: f263f50e6299ffdb31112069833a5d722c088c1c5c87b3dd18297f06e2162854eea269643fde2b2d3df246ba7634becbd78d890e68ce41274b5a35fa6b016305 languageName: node linkType: hard @@ -4756,15 +4802,15 @@ __metadata: languageName: unknown linkType: soft -"@backstage/frontend-defaults@npm:^0.1.3": - version: 0.1.3 - resolution: "@backstage/frontend-defaults@npm:0.1.3" +"@backstage/frontend-defaults@npm:^0.1.4": + version: 0.1.4 + resolution: "@backstage/frontend-defaults@npm:0.1.4" dependencies: - "@backstage/config": ^1.3.0 - "@backstage/errors": ^1.2.5 - "@backstage/frontend-app-api": ^0.10.2 - "@backstage/frontend-plugin-api": ^0.9.2 - "@backstage/plugin-app": ^0.1.3 + "@backstage/config": ^1.3.1 + "@backstage/errors": ^1.2.6 + "@backstage/frontend-app-api": ^0.10.3 + "@backstage/frontend-plugin-api": ^0.9.3 + "@backstage/plugin-app": ^0.1.4 "@react-hookz/web": ^24.0.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 @@ -4774,7 +4820,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 46932dad14f776b979ec9482addb8fd1e771b59f690612be2332937fb6d0a9e6d944658f3a5b11d397b773c421ccf6caba0163d10105e2b78ec4a6ecc924d3f5 + checksum: a4d8fb347f7424f1f2cc305d8d311130bd696e1aeca8ec119ddf0d268d73a746c58054015f5c696ef885cd429dff5ed49b2ac4c768160b2c87be2f0735dbf0da languageName: node linkType: hard @@ -4808,12 +4854,12 @@ __metadata: languageName: unknown linkType: soft -"@backstage/frontend-plugin-api@npm:^0.9.2": - version: 0.9.2 - resolution: "@backstage/frontend-plugin-api@npm:0.9.2" +"@backstage/frontend-plugin-api@npm:^0.9.3": + version: 0.9.3 + resolution: "@backstage/frontend-plugin-api@npm:0.9.3" dependencies: - "@backstage/core-components": ^0.16.1 - "@backstage/core-plugin-api": ^1.10.1 + "@backstage/core-components": ^0.16.2 + "@backstage/core-plugin-api": ^1.10.2 "@backstage/types": ^1.2.0 "@backstage/version-bridge": ^1.0.10 "@material-ui/core": ^4.12.4 @@ -4828,7 +4874,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 7b24e25ea4178214bdb055faa6dbc62e6be04fe99e89a38a5b79fe9813187d7f6445f798b9c6485a99c8ebb38824677288f133ce73099a3468ddd7c3ec98df26 + checksum: c2e1056f3338b8df5d30c61947994f1a707dc08d97e6b5ebb87722ddcac23c60fc006bc1917bf0929609098512da05ed232c2dc9c237c16979aea63681f81cb4 languageName: node linkType: hard @@ -4866,15 +4912,15 @@ __metadata: languageName: unknown linkType: soft -"@backstage/frontend-test-utils@npm:^0.2.3": - version: 0.2.3 - resolution: "@backstage/frontend-test-utils@npm:0.2.3" +"@backstage/frontend-test-utils@npm:^0.2.4": + version: 0.2.4 + resolution: "@backstage/frontend-test-utils@npm:0.2.4" dependencies: - "@backstage/config": ^1.3.0 - "@backstage/frontend-app-api": ^0.10.2 - "@backstage/frontend-plugin-api": ^0.9.2 - "@backstage/plugin-app": ^0.1.3 - "@backstage/test-utils": ^1.7.2 + "@backstage/config": ^1.3.1 + "@backstage/frontend-app-api": ^0.10.3 + "@backstage/frontend-plugin-api": ^0.9.3 + "@backstage/plugin-app": ^0.1.4 + "@backstage/test-utils": ^1.7.3 "@backstage/types": ^1.2.0 "@backstage/version-bridge": ^1.0.10 zod: ^3.22.4 @@ -4887,7 +4933,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 68f6a33b97437f6e3dd7e83e65d44197462a3c8164802bc25a73db5ab3a2726a356f777056cf2700e5702c5a1daa9daca8c0ab4026911159513a2c47c92caf0d + checksum: f3ff1b748e3edb01f557f875bbc4eade8bbdb0a63331494790b2c9f4e7ca140b85a35b3783a067cb5bd3243b521d285716ff74262ff1c0dcdf76fe7ef6c77af5 languageName: node linkType: hard @@ -4921,7 +4967,22 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-aws-node@^0.1.12, @backstage/integration-aws-node@workspace:^, @backstage/integration-aws-node@workspace:packages/integration-aws-node": +"@backstage/integration-aws-node@npm:^0.1.12": + version: 0.1.14 + resolution: "@backstage/integration-aws-node@npm:0.1.14" + dependencies: + "@aws-sdk/client-sts": ^3.350.0 + "@aws-sdk/credential-provider-node": ^3.350.0 + "@aws-sdk/credential-providers": ^3.350.0 + "@aws-sdk/types": ^3.347.0 + "@aws-sdk/util-arn-parser": ^3.310.0 + "@backstage/config": ^1.3.1 + "@backstage/errors": ^1.2.6 + checksum: 65b5a0f8c3b7936441eb0e7d853fb8f3feb6cb06421c2d9aa8f209503eaf625b88213a01747aa03fd3d6189be1c8ff301821f37506e813d4e76d9df53ad00f0e + languageName: node + linkType: hard + +"@backstage/integration-aws-node@workspace:^, @backstage/integration-aws-node@workspace:packages/integration-aws-node": version: 0.0.0-use.local resolution: "@backstage/integration-aws-node@workspace:packages/integration-aws-node" dependencies: @@ -4940,13 +5001,13 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@npm:^1.2.1": - version: 1.2.1 - resolution: "@backstage/integration-react@npm:1.2.1" +"@backstage/integration-react@npm:^1.1.24, @backstage/integration-react@npm:^1.2.2": + version: 1.2.2 + resolution: "@backstage/integration-react@npm:1.2.2" dependencies: - "@backstage/config": ^1.3.0 - "@backstage/core-plugin-api": ^1.10.1 - "@backstage/integration": ^1.15.2 + "@backstage/config": ^1.3.1 + "@backstage/core-plugin-api": ^1.10.2 + "@backstage/integration": ^1.16.0 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 peerDependencies: @@ -4957,7 +5018,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 493e146b2d217ec33ee6f9af39a8289aff230dba548b38d5ec8cff758cfa269184014a18778e54a6599458f408ddc1cab3f2435c229b4f038e9ad423e6086bdb + checksum: cf238ee64138a0fe2bd3957b3f852b3b2514176f557d532db2a358626540c00c021bd189ca1754cb40d536a62eeb1939e0fd9d4a37fc29a4df1e3e35bcd90578 languageName: node linkType: hard @@ -4992,20 +5053,21 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration@npm:^1.15.0, @backstage/integration@npm:^1.15.2": - version: 1.15.2 - resolution: "@backstage/integration@npm:1.15.2" +"@backstage/integration@npm:^1.15.0, @backstage/integration@npm:^1.16.0, @backstage/integration@npm:^1.9.0": + version: 1.16.0 + resolution: "@backstage/integration@npm:1.16.0" dependencies: "@azure/identity": ^4.0.0 - "@backstage/config": ^1.3.0 - "@backstage/errors": ^1.2.5 + "@azure/storage-blob": ^12.5.0 + "@backstage/config": ^1.3.1 + "@backstage/errors": ^1.2.6 "@octokit/auth-app": ^4.0.0 "@octokit/rest": ^19.0.3 cross-fetch: ^4.0.0 git-url-parse: ^15.0.0 lodash: ^4.17.21 luxon: ^3.0.0 - checksum: 59b109e1b9e196e36fc55264258a304839057fc1d8f438740c74c1750ee76a5d39341aa4fddaf5d81d06fdc679076710dd63de2fab4e105012eb040d9e303038 + checksum: d116f5b7ff06f6e520626c91c4551557a2a13a65b4914d62f6629744c6651e8925f901d193dcec9274a484c29147900daaa93c93b9acd9f98a7b06abf101a555 languageName: node linkType: hard @@ -5106,7 +5168,6 @@ __metadata: resolution: "@backstage/plugin-app-backend@workspace:plugins/app-backend" dependencies: "@backstage/backend-app-api": "workspace:^" - "@backstage/backend-common": ^0.25.0 "@backstage/backend-defaults": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" @@ -5171,16 +5232,16 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-app@npm:^0.1.3": - version: 0.1.3 - resolution: "@backstage/plugin-app@npm:0.1.3" +"@backstage/plugin-app@npm:^0.1.4": + version: 0.1.4 + resolution: "@backstage/plugin-app@npm:0.1.4" dependencies: - "@backstage/core-components": ^0.16.1 - "@backstage/core-plugin-api": ^1.10.1 - "@backstage/frontend-plugin-api": ^0.9.2 - "@backstage/integration-react": ^1.2.1 - "@backstage/plugin-permission-react": ^0.4.28 - "@backstage/theme": ^0.6.2 + "@backstage/core-components": ^0.16.2 + "@backstage/core-plugin-api": ^1.10.2 + "@backstage/frontend-plugin-api": ^0.9.3 + "@backstage/integration-react": ^1.2.2 + "@backstage/plugin-permission-react": ^0.4.29 + "@backstage/theme": ^0.6.3 "@material-ui/core": ^4.9.13 "@material-ui/icons": ^4.9.1 "@material-ui/lab": ^4.0.0-alpha.61 @@ -5193,7 +5254,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 9920d4be8e533579de59f43396e1e4ec7bd55fadec58f3e9057401417ec9a126f3df9f4a6fe6c9bcf13e1edb8ded2b9ca41bf871fa3ad21a1b16b5b2a9775731 + checksum: 6f3ef0e975a85834e3f3f07e1bbe91a0822bfcbcd0c7c38f1a0f610f39bd7513fbe61bbb69236ce76727de8c98284c37fa2aba22b29aefc2032a3fe51a440bee languageName: node linkType: hard @@ -5668,29 +5729,28 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-auth-node@npm:^0.5.2, @backstage/plugin-auth-node@npm:^0.5.4": - version: 0.5.4 - resolution: "@backstage/plugin-auth-node@npm:0.5.4" +"@backstage/plugin-auth-node@npm:^0.5.2, @backstage/plugin-auth-node@npm:^0.5.5": + version: 0.5.5 + resolution: "@backstage/plugin-auth-node@npm:0.5.5" dependencies: "@backstage/backend-common": ^0.25.0 - "@backstage/backend-plugin-api": ^1.0.2 - "@backstage/catalog-client": ^1.8.0 - "@backstage/catalog-model": ^1.7.1 - "@backstage/config": ^1.3.0 - "@backstage/errors": ^1.2.5 + "@backstage/backend-plugin-api": ^1.1.0 + "@backstage/catalog-client": ^1.9.0 + "@backstage/catalog-model": ^1.7.2 + "@backstage/config": ^1.3.1 + "@backstage/errors": ^1.2.6 "@backstage/types": ^1.2.0 - "@types/express": "*" + "@types/express": ^4.17.6 "@types/passport": ^1.0.3 express: ^4.17.1 jose: ^5.0.0 lodash: ^4.17.21 - node-fetch: ^2.7.0 passport: ^0.7.0 winston: ^3.2.1 zod: ^3.22.4 zod-to-json-schema: ^3.21.4 zod-validation-error: ^3.4.0 - checksum: 3ac80048a7b066e2f05be06412a0205467621cb43a485b3552eb96ec3d90951ec1fac0e066f81fdb30b95c7ddd1d35e920c79138d4c7286bdaf3033d8979ff99 + checksum: a9c3e4ed16ce4bde26797719636045a3bf01bf07813952ef7b970b96a0b518e858ad77ee4f35bfbe5cb905f2bfe47540688f1239f108bea69920a360357339d9 languageName: node linkType: hard @@ -5699,6 +5759,7 @@ __metadata: resolution: "@backstage/plugin-auth-node@workspace:plugins/auth-node" dependencies: "@backstage/backend-common": ^0.25.0 + "@backstage/backend-defaults": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-client": "workspace:^" @@ -5875,6 +5936,7 @@ __metadata: "@backstage/plugin-catalog-node": "workspace:^" luxon: ^3.0.0 msw: ^1.0.0 + p-throttle: ^4.1.1 uuid: ^11.0.0 languageName: unknown linkType: soft @@ -5960,7 +6022,6 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-gitlab-org@workspace:plugins/catalog-backend-module-gitlab-org" dependencies: - "@backstage/backend-common": ^0.25.0 "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" @@ -5992,6 +6053,7 @@ __metadata: lodash: ^4.17.21 luxon: ^3.0.0 msw: ^1.0.0 + node-fetch: ^2.7.0 uuid: ^11.0.0 languageName: unknown linkType: soft @@ -6084,19 +6146,15 @@ __metadata: resolution: "@backstage/plugin-catalog-backend-module-openapi@workspace:plugins/catalog-backend-module-openapi" dependencies: "@apidevtools/json-schema-ref-parser": ^11.0.0 - "@backstage/backend-common": ^0.25.0 "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" - "@backstage/config": "workspace:^" "@backstage/integration": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" openapi-types: ^12.0.0 - winston: ^3.2.1 yaml: ^2.1.1 languageName: unknown linkType: soft @@ -6209,7 +6267,18 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@^1.0.20, @backstage/plugin-catalog-common@^1.1.1, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": +"@backstage/plugin-catalog-common@npm:^1.0.20, @backstage/plugin-catalog-common@npm:^1.1.2": + version: 1.1.2 + resolution: "@backstage/plugin-catalog-common@npm:1.1.2" + dependencies: + "@backstage/catalog-model": ^1.7.2 + "@backstage/plugin-permission-common": ^0.8.3 + "@backstage/plugin-search-common": ^1.2.16 + checksum: ec4190c708f3e98fe09fcea56480ac36311a6b11a5a351f0e273c3ab39c45dec039e67aafc7974c73e14170350a3aedd6a5f4a009173536427b3c72c9fb45352 + languageName: node + linkType: hard + +"@backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-common@workspace:plugins/catalog-common" dependencies: @@ -6334,21 +6403,21 @@ __metadata: linkType: soft "@backstage/plugin-catalog-react@npm:^1.14.0, @backstage/plugin-catalog-react@npm:^1.9.3": - version: 1.14.2 - resolution: "@backstage/plugin-catalog-react@npm:1.14.2" + version: 1.15.0 + resolution: "@backstage/plugin-catalog-react@npm:1.15.0" dependencies: - "@backstage/catalog-client": ^1.8.0 - "@backstage/catalog-model": ^1.7.1 - "@backstage/core-compat-api": ^0.3.3 - "@backstage/core-components": ^0.16.1 - "@backstage/core-plugin-api": ^1.10.1 - "@backstage/errors": ^1.2.5 - "@backstage/frontend-plugin-api": ^0.9.2 - "@backstage/frontend-test-utils": ^0.2.3 - "@backstage/integration-react": ^1.2.1 - "@backstage/plugin-catalog-common": ^1.1.1 - "@backstage/plugin-permission-common": ^0.8.2 - "@backstage/plugin-permission-react": ^0.4.28 + "@backstage/catalog-client": ^1.9.0 + "@backstage/catalog-model": ^1.7.2 + "@backstage/core-compat-api": ^0.3.4 + "@backstage/core-components": ^0.16.2 + "@backstage/core-plugin-api": ^1.10.2 + "@backstage/errors": ^1.2.6 + "@backstage/frontend-plugin-api": ^0.9.3 + "@backstage/frontend-test-utils": ^0.2.4 + "@backstage/integration-react": ^1.2.2 + "@backstage/plugin-catalog-common": ^1.1.2 + "@backstage/plugin-permission-common": ^0.8.3 + "@backstage/plugin-permission-react": ^0.4.29 "@backstage/types": ^1.2.0 "@backstage/version-bridge": ^1.0.10 "@material-ui/core": ^4.12.2 @@ -6370,7 +6439,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 1de29cd4a90fbfa2ba574b6cd69045e15b01e52e2d3963304ab29fc24e00a19d46bd7d3c065ed51ab19bc0ce1bc66e1346d89a3adb034363897b149b3c3dde8e + checksum: d94aafd1f9c81bceb4917f3e49a9d3dddd409f41684373d826b79fbcd4059a896dfcf908263ea5a5c78dfbbc2eb3c43cd1cc97129c22fe0f98a8d91032a005c0 languageName: node linkType: hard @@ -6780,7 +6849,7 @@ __metadata: "@backstage/core-plugin-api": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@rjsf/utils": 5.23.1 + "@rjsf/utils": 5.23.2 "@types/react": ^18.0.0 "@types/react-grid-layout": ^1.3.2 react: ^18.0.2 @@ -6818,10 +6887,10 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 - "@rjsf/core": 5.23.1 - "@rjsf/material-ui": 5.23.1 - "@rjsf/utils": 5.23.1 - "@rjsf/validator-ajv8": 5.23.1 + "@rjsf/core": 5.23.2 + "@rjsf/material-ui": 5.23.2 + "@rjsf/utils": 5.23.2 + "@rjsf/validator-ajv8": 5.23.2 "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 @@ -7101,7 +7170,6 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-notifications-backend@workspace:plugins/notifications-backend" dependencies: - "@backstage/backend-common": ^0.25.0 "@backstage/backend-defaults": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" @@ -7304,6 +7372,7 @@ __metadata: resolution: "@backstage/plugin-permission-backend@workspace:plugins/permission-backend" dependencies: "@backstage/backend-common": ^0.25.0 + "@backstage/backend-defaults": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" @@ -7326,7 +7395,22 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-common@^0.8.2, @backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": +"@backstage/plugin-permission-common@npm:^0.8.3": + version: 0.8.3 + resolution: "@backstage/plugin-permission-common@npm:0.8.3" + dependencies: + "@backstage/config": ^1.3.1 + "@backstage/errors": ^1.2.6 + "@backstage/types": ^1.2.0 + cross-fetch: ^4.0.0 + uuid: ^11.0.0 + zod: ^3.22.4 + zod-to-json-schema: ^3.20.4 + checksum: cd8c91a6ce615d5689c9eb53f457d5c5bb85ca104061bd83d9e2f177acd6810f840e532c0b4850d0466dc68ce41650e19df50f91e78ab35f9355bb76a0c4809e + languageName: node + linkType: hard + +"@backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-common@workspace:plugins/permission-common" dependencies: @@ -7347,6 +7431,7 @@ __metadata: resolution: "@backstage/plugin-permission-node@workspace:plugins/permission-node" dependencies: "@backstage/backend-common": ^0.25.0 + "@backstage/backend-defaults": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" @@ -7365,7 +7450,27 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-react@^0.4.28, @backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": +"@backstage/plugin-permission-react@npm:^0.4.29": + version: 0.4.29 + resolution: "@backstage/plugin-permission-react@npm:0.4.29" + dependencies: + "@backstage/config": ^1.3.1 + "@backstage/core-plugin-api": ^1.10.2 + "@backstage/plugin-permission-common": ^0.8.3 + swr: ^2.0.0 + 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 + checksum: 4fe663b2d46f54e4878f579306802c84f238611822b929d5099d527e97fa3211872c85a51cb3fefddcff0231b92ba6d70a25971a7119ada2a03126e76cd8c006 + languageName: node + linkType: hard + +"@backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-react@workspace:plugins/permission-react" dependencies: @@ -7869,10 +7974,10 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^24.0.0 - "@rjsf/core": 5.23.1 - "@rjsf/material-ui": 5.23.1 - "@rjsf/utils": 5.23.1 - "@rjsf/validator-ajv8": 5.23.1 + "@rjsf/core": 5.23.2 + "@rjsf/material-ui": 5.23.2 + "@rjsf/utils": 5.23.2 + "@rjsf/validator-ajv8": 5.23.2 "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 @@ -7943,10 +8048,10 @@ __metadata: "@material-ui/lab": 4.0.0-alpha.61 "@microsoft/fetch-event-source": ^2.0.1 "@react-hookz/web": ^24.0.0 - "@rjsf/core": 5.23.1 - "@rjsf/material-ui": 5.23.1 - "@rjsf/utils": 5.23.1 - "@rjsf/validator-ajv8": 5.23.1 + "@rjsf/core": 5.23.2 + "@rjsf/material-ui": 5.23.2 + "@rjsf/utils": 5.23.2 + "@rjsf/validator-ajv8": 5.23.2 "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 @@ -8156,6 +8261,16 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-search-common@npm:^1.2.16": + version: 1.2.16 + resolution: "@backstage/plugin-search-common@npm:1.2.16" + dependencies: + "@backstage/plugin-permission-common": ^0.8.3 + "@backstage/types": ^1.2.0 + checksum: b4694b4be71dfbeac9352fc0f6dfc5b7d21f3fa69b15f9ff8efb22de2453e71c4f02340726325c7213e296a8bb07eaf60de552e3b6b13b40d97d53486b350389 + languageName: node + linkType: hard + "@backstage/plugin-search-common@workspace:^, @backstage/plugin-search-common@workspace:plugins/search-common": version: 0.0.0-use.local resolution: "@backstage/plugin-search-common@workspace:plugins/search-common" @@ -8254,7 +8369,6 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-signals-backend@workspace:plugins/signals-backend" dependencies: - "@backstage/backend-common": ^0.25.0 "@backstage/backend-defaults": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" @@ -8756,16 +8870,16 @@ __metadata: languageName: unknown linkType: soft -"@backstage/test-utils@npm:^1.7.2": - version: 1.7.2 - resolution: "@backstage/test-utils@npm:1.7.2" +"@backstage/test-utils@npm:^1.7.3": + version: 1.7.3 + resolution: "@backstage/test-utils@npm:1.7.3" dependencies: - "@backstage/config": ^1.3.0 - "@backstage/core-app-api": ^1.15.2 - "@backstage/core-plugin-api": ^1.10.1 - "@backstage/plugin-permission-common": ^0.8.2 - "@backstage/plugin-permission-react": ^0.4.28 - "@backstage/theme": ^0.6.2 + "@backstage/config": ^1.3.1 + "@backstage/core-app-api": ^1.15.3 + "@backstage/core-plugin-api": ^1.10.2 + "@backstage/plugin-permission-common": ^0.8.3 + "@backstage/plugin-permission-react": ^0.4.29 + "@backstage/theme": ^0.6.3 "@backstage/types": ^1.2.0 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 @@ -8784,7 +8898,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 2ef863129664a9c14f1e57c6c36bba873f7c2fcccf2a5dd5594f3773ba52aaed0695a7ae844bbf7f70483a3290421b48d78cb1d4634ac326006dfa30e1c9b306 + checksum: 46d13417a0e3e8b6db2d4ab536729e8f9575db320f0d0e5ded38cafb71571122b9b610d36f98e0674a3300469511408e608d277590c1a9b8dede05d73fc793ae languageName: node linkType: hard @@ -8827,43 +8941,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/theme@npm:^0.5.0": - version: 0.5.7 - resolution: "@backstage/theme@npm:0.5.7" - dependencies: - "@emotion/react": ^11.10.5 - "@emotion/styled": ^11.10.5 - "@mui/material": ^5.12.2 - peerDependencies: - "@material-ui/core": ^4.12.2 - "@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 - checksum: 5a315a198481f7b0c6f1a11bc102c36d2976cae25184ce6e28e6e44ce4a742e4d4416f19c71ac44f574a2745e30d13508a6c152f00e1facdef9c9d12dc3d0449 - languageName: node - linkType: hard - -"@backstage/theme@npm:^0.6.0, @backstage/theme@npm:^0.6.2": - version: 0.6.2 - resolution: "@backstage/theme@npm:0.6.2" - dependencies: - "@emotion/react": ^11.10.5 - "@emotion/styled": ^11.10.5 - "@mui/material": ^5.12.2 - peerDependencies: - "@material-ui/core": ^4.12.2 - "@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 - checksum: 480bf041bea2919b1d0590c7ee45950d6f2eb00403e40e7a86a0b16c1994693d7c3d67e401ff771d2e920a849d8cb02207a0b1212f436aed973439f66e824803 - languageName: node - linkType: hard - -"@backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": +"@backstage/theme@^0.6.0, @backstage/theme@^0.6.3, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": version: 0.0.0-use.local resolution: "@backstage/theme@workspace:packages/theme" dependencies: @@ -8890,7 +8968,30 @@ __metadata: languageName: unknown linkType: soft -"@backstage/types@^1.1.1, @backstage/types@^1.2.0, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": +"@backstage/theme@npm:^0.5.0": + version: 0.5.7 + resolution: "@backstage/theme@npm:0.5.7" + dependencies: + "@emotion/react": ^11.10.5 + "@emotion/styled": ^11.10.5 + "@mui/material": ^5.12.2 + peerDependencies: + "@material-ui/core": ^4.12.2 + "@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 + checksum: 5a315a198481f7b0c6f1a11bc102c36d2976cae25184ce6e28e6e44ce4a742e4d4416f19c71ac44f574a2745e30d13508a6c152f00e1facdef9c9d12dc3d0449 + languageName: node + linkType: hard + +"@backstage/types@npm:^1.1.1, @backstage/types@npm:^1.2.0": + version: 1.2.0 + resolution: "@backstage/types@npm:1.2.0" + checksum: a8b22a95b7c64bde31927e18f6892bb0be949bd1a7bc5d9ef1e4d9df984ff80144148a6019a69d1084f6214fcb9536fdd7d8f2fb3708ef373ff2e1bac28442b0 + languageName: node + linkType: hard + +"@backstage/types@workspace:^, @backstage/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@backstage/types@workspace:packages/types" dependencies: @@ -8930,27 +9031,23 @@ __metadata: languageName: node linkType: hard -"@base_ui/react@npm:^1.0.0-alpha.3": - version: 1.0.0-alpha.3 - resolution: "@base_ui/react@npm:1.0.0-alpha.3" +"@base-ui-components/react@npm:^1.0.0-alpha.4": + version: 1.0.0-alpha.4 + resolution: "@base-ui-components/react@npm:1.0.0-alpha.4" dependencies: - "@babel/runtime": ^7.25.6 - "@floating-ui/react": ^0.26.24 - "@floating-ui/react-dom": ^2.1.2 + "@babel/runtime": ^7.26.0 + "@floating-ui/react": ^0.27.2 "@floating-ui/utils": ^0.2.8 - "@mui/types": ^7.2.17 - "@mui/utils": ^6.1.1 - clsx: ^2.1.1 prop-types: ^15.8.1 - use-sync-external-store: ^1.2.2 + use-sync-external-store: ^1.4.0 peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0 || ^19.0.0-rc + react: ^17.0.0 || ^18.0.0 || ^19.0 || ^19.0.0-rc + react-dom: ^17.0.0 || ^18.0.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: c725386d8a6cb351742751a115dc3f06d6bf910470912457bb184646dc3890e3a3a971a1364ca2219192524a9cfbb96adc57339c2d54b931342ce705ce5ac220 + checksum: 243423587ed8149d18c0af62e95d3401118efb37066b5fd69353c454a3f90f9112398f816bddbd9f56eb03ae89202adec71ae99bfbf3a808bd4f79f430ffedc3 languageName: node linkType: hard @@ -8996,11 +9093,11 @@ __metadata: languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^7.0.6": - version: 7.0.6 - resolution: "@changesets/apply-release-plan@npm:7.0.6" +"@changesets/apply-release-plan@npm:^7.0.7": + version: 7.0.7 + resolution: "@changesets/apply-release-plan@npm:7.0.7" dependencies: - "@changesets/config": ^3.0.4 + "@changesets/config": ^3.0.5 "@changesets/get-version-range-type": ^0.4.0 "@changesets/git": ^3.0.2 "@changesets/should-skip-package": ^0.1.1 @@ -9013,7 +9110,7 @@ __metadata: prettier: ^2.7.1 resolve-from: ^5.0.0 semver: ^7.5.3 - checksum: d84049b0874fe86db35a18b3959eee5ccb0e1be095a4d4718495e47e1123580c219bbaf4522190394ce3c40380c03b4e83d00e15070f0df77887b15c69fab14c + checksum: 775e8f86ab8b82ebdb44471dfbdf14e669144e63b6c972bc8502d608247ef909baca63973f71b8d15acd4fff8740a61802256bc261de12b956e4c2b8fd34d929 languageName: node linkType: hard @@ -9041,16 +9138,16 @@ __metadata: linkType: hard "@changesets/cli@npm:^2.14.0": - version: 2.27.10 - resolution: "@changesets/cli@npm:2.27.10" + version: 2.27.11 + resolution: "@changesets/cli@npm:2.27.11" dependencies: - "@changesets/apply-release-plan": ^7.0.6 + "@changesets/apply-release-plan": ^7.0.7 "@changesets/assemble-release-plan": ^6.0.5 "@changesets/changelog-git": ^0.2.0 - "@changesets/config": ^3.0.4 + "@changesets/config": ^3.0.5 "@changesets/errors": ^0.2.0 "@changesets/get-dependents-graph": ^2.1.2 - "@changesets/get-release-plan": ^4.0.5 + "@changesets/get-release-plan": ^4.0.6 "@changesets/git": ^3.0.2 "@changesets/logger": ^0.1.1 "@changesets/pre": ^2.0.1 @@ -9061,7 +9158,7 @@ __metadata: "@manypkg/get-packages": ^1.1.3 ansi-colors: ^4.1.3 ci-info: ^3.7.0 - enquirer: ^2.3.0 + enquirer: ^2.4.1 external-editor: ^3.1.0 fs-extra: ^7.0.1 mri: ^1.2.0 @@ -9074,13 +9171,13 @@ __metadata: term-size: ^2.1.0 bin: changeset: bin.js - checksum: 9927bd57299d8b26c49ed48b2380cd19eb7b8a4fafd6babd5ec0d92d3b68cc7a54305201ce63142723de48bc5a9e75f611dd747d5a7c6ac80a934a3c4a83399b + checksum: 0c9d1f03ad113494ad3091caa7eca1ee167761af8257911f74c64bff670fb8a542fe9f84921b1e7e29c584b2f5883b8a6287c4f42afe59007369f4fd1cc94cec languageName: node linkType: hard -"@changesets/config@npm:^3.0.4": - version: 3.0.4 - resolution: "@changesets/config@npm:3.0.4" +"@changesets/config@npm:^3.0.5": + version: 3.0.5 + resolution: "@changesets/config@npm:3.0.5" dependencies: "@changesets/errors": ^0.2.0 "@changesets/get-dependents-graph": ^2.1.2 @@ -9089,7 +9186,7 @@ __metadata: "@manypkg/get-packages": ^1.1.3 fs-extra: ^7.0.1 micromatch: ^4.0.8 - checksum: 43763d930e7fc4f24f9bb7b974708cc72f13d1a3dca10ace21d63135b7ff47dbfa3461cc9842171ae0564e37b17da2cc2e6e3f69a3f180a28efce2389eceb7de + checksum: 75cdb5c4965656935277c69591336dd3aa825eef91d971c1d3e37777d181b6e3c1f1d78bf7ec826bbae9d70841af28c4a9cb1ea477808b3d9101413bd9f04fcf languageName: node linkType: hard @@ -9114,17 +9211,17 @@ __metadata: languageName: node linkType: hard -"@changesets/get-release-plan@npm:^4.0.5": - version: 4.0.5 - resolution: "@changesets/get-release-plan@npm:4.0.5" +"@changesets/get-release-plan@npm:^4.0.6": + version: 4.0.6 + resolution: "@changesets/get-release-plan@npm:4.0.6" dependencies: "@changesets/assemble-release-plan": ^6.0.5 - "@changesets/config": ^3.0.4 + "@changesets/config": ^3.0.5 "@changesets/pre": ^2.0.1 "@changesets/read": ^0.6.2 "@changesets/types": ^6.0.0 "@manypkg/get-packages": ^1.1.3 - checksum: 3e06ea36b814e9a36aaac3ab46102c01802d2cd262e9ec2705a63c461f43af44be48bd55bb6d86e6753b51aaac81d7c6e2a13bc2e8a86d60fe6bce481dbd2e27 + checksum: 1aabe351e39ce0b0a057f96eb3ac4183907ad0458cffe1a7e0b5651ae1ef3aefb22cc6021df5114d646a2b5dc2a665bc670f9b705a85dca0bd31f7792b22403c languageName: node linkType: hard @@ -9231,8 +9328,8 @@ __metadata: linkType: hard "@chromatic-com/storybook@npm:^3.2.2": - version: 3.2.2 - resolution: "@chromatic-com/storybook@npm:3.2.2" + version: 3.2.3 + resolution: "@chromatic-com/storybook@npm:3.2.3" dependencies: chromatic: ^11.15.0 filesize: ^10.0.12 @@ -9241,7 +9338,7 @@ __metadata: strip-ansi: ^7.1.0 peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 8f1d03b32e131d391d41913b346d3898e5f2661c54dbe057f05fb1bce2d9b94581942bc5f90efe599b819d1f05d92c50a9be1e0cba2962be797f9a9551b568da + checksum: ead039d77231da736eda2077aae84e6cc009976cbd373849ec0dd40ba7c5a81dace0b2916677c78417d66d034f5016ddb1a049a557a0fc2d02cb42316fb6fb32 languageName: node linkType: hard @@ -9275,8 +9372,8 @@ __metadata: linkType: hard "@codemirror/language@npm:^6.0.0": - version: 6.10.6 - resolution: "@codemirror/language@npm:6.10.6" + version: 6.10.8 + resolution: "@codemirror/language@npm:6.10.8" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.23.0 @@ -9284,7 +9381,7 @@ __metadata: "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 style-mod: ^4.0.0 - checksum: 0bd5e4da0c714b4d2aad2e2ad19bb803d9992e5f0d56da3fb2534e63b03b8a562bd8b9ac4439509c687b589e3eaa5a33339eda13d91e54a5d5a99e032d1be981 + checksum: 679b69d69faa94f028f996a7005d0c6c2a2e4cd7a7a2614f615c23d7b642c31fc1837915248e864cb1ad59a2f032d1a7a8ef486b5f9904e5f6fbe6f7d2882c38 languageName: node linkType: hard @@ -9319,10 +9416,12 @@ __metadata: languageName: node linkType: hard -"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.1, @codemirror/state@npm:^6.4.0": - version: 6.4.0 - resolution: "@codemirror/state@npm:6.4.0" - checksum: c5236fe5786f1b85d17273a5c17fa8aeb063658c1404ab18caeb6e7591663ec96b65d453ab8162f75839c3801b04cd55ba4bc48f44cb61ebfeeee383f89553c7 +"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.1, @codemirror/state@npm:^6.5.0": + version: 6.5.0 + resolution: "@codemirror/state@npm:6.5.0" + dependencies: + "@marijn/find-cluster-break": ^1.0.0 + checksum: f7fbed072cc67bf250f7d231668a00b988748cacaaa2ce3ea74ff13c7c392db76000e7d517933521cc6ad9dc3651c7b6d33accab3e3d4b9816cd3c5714661a84 languageName: node linkType: hard @@ -9339,13 +9438,13 @@ __metadata: linkType: hard "@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.23.0": - version: 6.35.0 - resolution: "@codemirror/view@npm:6.35.0" + version: 6.36.1 + resolution: "@codemirror/view@npm:6.36.1" dependencies: - "@codemirror/state": ^6.4.0 + "@codemirror/state": ^6.5.0 style-mod: ^4.1.0 w3c-keyname: ^2.2.4 - checksum: 8584d354df2147f07bb184a2443d6451db25f7a63c09644fc705c695e100042141f5162058718c495eb1c51fbab5eb37814bb72fc1ddf968e855def669a43193 + checksum: 77728cbc6f07f16abc4b98c487b6fad522781c928e4b31597b28d54364da6aa5542ed7c9b5c77b90bec5095527c3c062450f156f54fc8ddbcacdf86b4b32c608 languageName: node linkType: hard @@ -9448,7 +9547,7 @@ __metadata: languageName: node linkType: hard -"@emotion/cache@npm:^11.11.0, @emotion/cache@npm:^11.13.5": +"@emotion/cache@npm:^11.13.5": version: 11.13.5 resolution: "@emotion/cache@npm:11.13.5" dependencies: @@ -9468,7 +9567,7 @@ __metadata: languageName: node linkType: hard -"@emotion/hash@npm:^0.9.0, @emotion/hash@npm:^0.9.1, @emotion/hash@npm:^0.9.2": +"@emotion/hash@npm:^0.9.1, @emotion/hash@npm:^0.9.2": version: 0.9.2 resolution: "@emotion/hash@npm:0.9.2" checksum: 379bde2830ccb0328c2617ec009642321c0e009a46aa383dfbe75b679c6aea977ca698c832d225a893901f29d7b3eef0e38cf341f560f6b2b56f1ff23c172387 @@ -9619,16 +9718,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/aix-ppc64@npm:0.23.1" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/aix-ppc64@npm:0.24.0" +"@esbuild/aix-ppc64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/aix-ppc64@npm:0.24.2" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard @@ -9640,16 +9732,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-arm64@npm:0.23.1" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/android-arm64@npm:0.24.0" +"@esbuild/android-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/android-arm64@npm:0.24.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -9661,16 +9746,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-arm@npm:0.23.1" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/android-arm@npm:0.24.0" +"@esbuild/android-arm@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/android-arm@npm:0.24.2" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -9682,16 +9760,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-x64@npm:0.23.1" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/android-x64@npm:0.24.0" +"@esbuild/android-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/android-x64@npm:0.24.2" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -9703,16 +9774,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/darwin-arm64@npm:0.23.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/darwin-arm64@npm:0.24.0" +"@esbuild/darwin-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/darwin-arm64@npm:0.24.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -9724,16 +9788,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/darwin-x64@npm:0.23.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/darwin-x64@npm:0.24.0" +"@esbuild/darwin-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/darwin-x64@npm:0.24.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -9745,16 +9802,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/freebsd-arm64@npm:0.23.1" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/freebsd-arm64@npm:0.24.0" +"@esbuild/freebsd-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/freebsd-arm64@npm:0.24.2" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -9766,16 +9816,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/freebsd-x64@npm:0.23.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/freebsd-x64@npm:0.24.0" +"@esbuild/freebsd-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/freebsd-x64@npm:0.24.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -9787,16 +9830,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-arm64@npm:0.23.1" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-arm64@npm:0.24.0" +"@esbuild/linux-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-arm64@npm:0.24.2" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -9808,16 +9844,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-arm@npm:0.23.1" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-arm@npm:0.24.0" +"@esbuild/linux-arm@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-arm@npm:0.24.2" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -9829,16 +9858,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-ia32@npm:0.23.1" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-ia32@npm:0.24.0" +"@esbuild/linux-ia32@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-ia32@npm:0.24.2" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -9850,16 +9872,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-loong64@npm:0.23.1" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-loong64@npm:0.24.0" +"@esbuild/linux-loong64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-loong64@npm:0.24.2" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -9871,16 +9886,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-mips64el@npm:0.23.1" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-mips64el@npm:0.24.0" +"@esbuild/linux-mips64el@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-mips64el@npm:0.24.2" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -9892,16 +9900,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-ppc64@npm:0.23.1" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-ppc64@npm:0.24.0" +"@esbuild/linux-ppc64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-ppc64@npm:0.24.2" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -9913,16 +9914,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-riscv64@npm:0.23.1" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-riscv64@npm:0.24.0" +"@esbuild/linux-riscv64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-riscv64@npm:0.24.2" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -9934,16 +9928,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-s390x@npm:0.23.1" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-s390x@npm:0.24.0" +"@esbuild/linux-s390x@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-s390x@npm:0.24.2" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -9955,17 +9942,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-x64@npm:0.23.1" +"@esbuild/linux-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-x64@npm:0.24.2" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-x64@npm:0.24.0" - conditions: os=linux & cpu=x64 +"@esbuild/netbsd-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/netbsd-arm64@npm:0.24.2" + conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard @@ -9976,30 +9963,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/netbsd-x64@npm:0.23.1" +"@esbuild/netbsd-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/netbsd-x64@npm:0.24.2" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/netbsd-x64@npm:0.24.0" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/openbsd-arm64@npm:0.23.1" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/openbsd-arm64@npm:0.24.0" +"@esbuild/openbsd-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/openbsd-arm64@npm:0.24.2" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard @@ -10011,16 +9984,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/openbsd-x64@npm:0.23.1" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/openbsd-x64@npm:0.24.0" +"@esbuild/openbsd-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/openbsd-x64@npm:0.24.2" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -10032,16 +9998,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/sunos-x64@npm:0.23.1" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/sunos-x64@npm:0.24.0" +"@esbuild/sunos-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/sunos-x64@npm:0.24.2" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -10053,16 +10012,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-arm64@npm:0.23.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/win32-arm64@npm:0.24.0" +"@esbuild/win32-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/win32-arm64@npm:0.24.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -10074,16 +10026,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-ia32@npm:0.23.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/win32-ia32@npm:0.24.0" +"@esbuild/win32-ia32@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/win32-ia32@npm:0.24.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -10095,16 +10040,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-x64@npm:0.23.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/win32-x64@npm:0.24.0" +"@esbuild/win32-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/win32-x64@npm:0.24.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -10120,10 +10058,30 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.8.1 - resolution: "@eslint-community/regexpp@npm:4.8.1" - checksum: 82d62c845ef42b810f268cfdc84d803a2da01735fb52e902fd34bdc09f92464a094fd8e4802839874b000b2f73f67c972859e813ba705233515d3e954f234bf2 +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 0d628680e204bc316d545b4993d3658427ca404ae646ce541fcc65306b8c712c340e5e573e30fb9f85f4855c0c5f6dca9868931f2fcced06417fbe1a0c6cd2d6 + languageName: node + linkType: hard + +"@eslint/config-array@npm:^0.19.0": + version: 0.19.1 + resolution: "@eslint/config-array@npm:0.19.1" + dependencies: + "@eslint/object-schema": ^2.1.5 + debug: ^4.3.1 + minimatch: ^3.1.2 + checksum: 421aad712a5ef1a3d118b5e0857f79c080f9dd619a76ce19d20105d381521583786f7abb1195744af9e62a5124e6657066eb6780e920f4001846bd91c1a665f0 + languageName: node + linkType: hard + +"@eslint/core@npm:^0.9.0": + version: 0.9.1 + resolution: "@eslint/core@npm:0.9.1" + dependencies: + "@types/json-schema": ^7.0.15 + checksum: 33c8159842cc3a646caa267c008cb567ca60e0220bcdcf6e426128409953b8f6a9b142246db616c71d06331edf769c192d7e2792b3f19c2a6b8179e491512d89 languageName: node linkType: hard @@ -10144,6 +10102,23 @@ __metadata: languageName: node linkType: hard +"@eslint/eslintrc@npm:^3.2.0": + version: 3.2.0 + resolution: "@eslint/eslintrc@npm:3.2.0" + dependencies: + ajv: ^6.12.4 + debug: ^4.3.2 + espree: ^10.0.1 + globals: ^14.0.0 + ignore: ^5.2.0 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 + strip-json-comments: ^3.1.1 + checksum: c898e4d12f4c9a79a61ee3c91e38eea5627a04e021cb749191e8537445858bfe32f810eca0cb2dc9902b8ad8b65ca07ef7221dc4bad52afe60cbbf50ec56c236 + languageName: node + linkType: hard + "@eslint/js@npm:8.57.1": version: 8.57.1 resolution: "@eslint/js@npm:8.57.1" @@ -10151,6 +10126,29 @@ __metadata: languageName: node linkType: hard +"@eslint/js@npm:9.17.0": + version: 9.17.0 + resolution: "@eslint/js@npm:9.17.0" + checksum: b68a14ff518ffa12e3b85fa9c72b818faeff092285acfbf02da2d0fb12a681b76651638881e98845f2df2ed346ed0d33faeb1d9caac163daf232c223b7efe89c + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.5": + version: 2.1.5 + resolution: "@eslint/object-schema@npm:2.1.5" + checksum: 5facffc832bae93c510f4d38f0f1cbfebd3d7ec772ece6b801bd09bf2dce52e781f4dea500aa133d02257e04ed6a3958fa18cbaed1f9623974a804ee60a8ca54 + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.2.3": + version: 0.2.4 + resolution: "@eslint/plugin-kit@npm:0.2.4" + dependencies: + levn: ^0.4.1 + checksum: 5693465dca5fc6f27b090f987b51bc738f48c6a6b5678dcc1791522921834206388b462578edd362d458e8de6dcd21cce1a2e8cff47d1512411ba0389112c231 + languageName: node + linkType: hard + "@faker-js/faker@npm:5.5.3": version: 5.5.3 resolution: "@faker-js/faker@npm:5.5.3" @@ -10196,17 +10194,17 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react@npm:^0.26.24": - version: 0.26.28 - resolution: "@floating-ui/react@npm:0.26.28" +"@floating-ui/react@npm:^0.27.2": + version: 0.27.2 + resolution: "@floating-ui/react@npm:0.27.2" dependencies: "@floating-ui/react-dom": ^2.1.2 "@floating-ui/utils": ^0.2.8 tabbable: ^6.0.0 peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: 1bfcccdb1f388ceb0075dc3e46934f4f04ef10bff2f971e1bf79067391c8729b366025caca0a42f5ca80854820a621a9edecbacdc046c33eb428f508fd6ce1f3 + react: ">=17.0.0" + react-dom: ">=17.0.0" + checksum: 4ef76a1ed29229b4775efd978259055c7eb24565b603e74b37e4b5faaf2ca1fd74fc332d4d5a0d29ec1fa4f047699815535ce115786e8651b8ed09ed1ee3e9b7 languageName: node linkType: hard @@ -10249,14 +10247,14 @@ __metadata: languageName: node linkType: hard -"@gitbeaker/core@npm:^41.2.0": - version: 41.2.0 - resolution: "@gitbeaker/core@npm:41.2.0" +"@gitbeaker/core@npm:^41.3.0": + version: 41.3.0 + resolution: "@gitbeaker/core@npm:41.3.0" dependencies: - "@gitbeaker/requester-utils": ^41.2.0 + "@gitbeaker/requester-utils": ^41.3.0 qs: ^6.12.2 xcase: ^2.0.1 - checksum: a702542061f2881ff5b931bdf713a89429b2d6420e2ed153e8365a93e8584f623ef2af0b3525fed719f3ee6835c8b33d546a34e776527a1777883be32d1ecb43 + checksum: 7b42c2af717002a54a1a6fdaa4056f2dbf6b52c6c33de68d1ad035b301609322f5b980d0da48918518dde105f4d88b39976cf4510a3d19a34e11b991c111e8fc languageName: node linkType: hard @@ -10296,15 +10294,15 @@ __metadata: languageName: node linkType: hard -"@gitbeaker/requester-utils@npm:^41.2.0": - version: 41.2.0 - resolution: "@gitbeaker/requester-utils@npm:41.2.0" +"@gitbeaker/requester-utils@npm:^41.3.0": + version: 41.3.0 + resolution: "@gitbeaker/requester-utils@npm:41.3.0" dependencies: picomatch-browser: ^2.2.6 qs: ^6.12.2 rate-limiter-flexible: ^4.0.1 xcase: ^2.0.1 - checksum: a50eb054d656b8f1940557919fa1abe06ca3a05b21b59297dcdc976ffcd539654f4349094a878b00749b70c75bd5e3fecc1997acc8d82e98b938a08936ae23f0 + checksum: 28dc17e995450988e62f9e76557bf0a2fe0a41db2ffc3e088ed5c71009daaa1f26563ad67b61738c6ca5bfde9d25f067a189f4bc0a7e097d5ffa49991d24cd38 languageName: node linkType: hard @@ -10319,24 +10317,24 @@ __metadata: linkType: hard "@gitbeaker/rest@npm:^41.2.0": - version: 41.2.0 - resolution: "@gitbeaker/rest@npm:41.2.0" + version: 41.3.0 + resolution: "@gitbeaker/rest@npm:41.3.0" dependencies: - "@gitbeaker/core": ^41.2.0 - "@gitbeaker/requester-utils": ^41.2.0 - checksum: f2c39daa758f82a154ba1af8d946712909daca85b42304ccca7880f2dbd7b8c9efdf5d3ca69bd902f95717aa0cde19417bceef6197495b8f5e897fe79a32ded3 + "@gitbeaker/core": ^41.3.0 + "@gitbeaker/requester-utils": ^41.3.0 + checksum: 96aa8d5e7ff3ca0e27f874df8b435fb12d20e6975d2291de26c90b7c2e201c286ffd241884b609b2200ddc4e28a331563b1b2d6767a1dd0160fc341f88761016 languageName: node linkType: hard "@google-cloud/cloud-sql-connector@npm:^1.4.0": - version: 1.4.0 - resolution: "@google-cloud/cloud-sql-connector@npm:1.4.0" + version: 1.5.0 + resolution: "@google-cloud/cloud-sql-connector@npm:1.5.0" dependencies: "@googleapis/sqladmin": ^24.0.0 gaxios: ^6.1.1 google-auth-library: ^9.2.0 - p-throttle: ^5.1.0 - checksum: c4ac2cc8cc24cc5966f146fe5686493fdb0bb4fc43a27ec086bd116f5ce475ca88f5e5e5fb79d17e6c31fb1a752d2f7e94433db17eea787696556c45415a31a1 + p-throttle: ^7.0.0 + checksum: c228f726af580c3592bfdb04dc47657b5a823c44b7411b7eb73c5c05c06ae9780e7fd0abcfe5881ff7524b24dd41a9946947bc4072fba18bab1227e4694fc871 languageName: node linkType: hard @@ -10350,15 +10348,15 @@ __metadata: linkType: hard "@google-cloud/firestore@npm:^7.0.0": - version: 7.10.0 - resolution: "@google-cloud/firestore@npm:7.10.0" + version: 7.11.0 + resolution: "@google-cloud/firestore@npm:7.11.0" dependencies: "@opentelemetry/api": ^1.3.0 fast-deep-equal: ^3.1.1 functional-red-black-tree: ^1.0.1 google-gax: ^4.3.3 protobufjs: ^7.2.6 - checksum: c534e49c6b52b7b46366eba009e3f56e8ee10ca0501896a7794470cab32513c6a314f364ff5a3fe5a44b832ba39d1afc86d38b42be3826a615c0a59108185c7d + checksum: b926123db5e3f37704c0aa51baee1726b72910a37c7fe99bbfe048afb1fba7fa40d7e5f7c017c7284ebd9273c0237da5c00fac81772ba0de1bed97dc9b71e709 languageName: node linkType: hard @@ -10848,6 +10846,23 @@ __metadata: languageName: node linkType: hard +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 611e0545146f55ddfdd5c20239cfb7911f9d0e28258787c4fc1a1f6214250830c9367aaaeace0096ed90b6739bee1e9c52ad5ba8adaf74ab8b449119303babfe + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" + dependencies: + "@humanfs/core": ^0.19.1 + "@humanwhocodes/retry": ^0.3.0 + checksum: f9cb52bb235f8b9c6fcff43a7e500669a38f8d6ce26593404a9b56365a1644e0ed60c720dc65ff6a696b1f85f3563ab055bb554ec8674f2559085ba840e47710 + languageName: node + linkType: hard + "@humanwhocodes/config-array@npm:^0.13.0": version: 0.13.0 resolution: "@humanwhocodes/config-array@npm:0.13.0" @@ -10873,6 +10888,20 @@ __metadata: languageName: node linkType: hard +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 7e5517bb51dbea3e02ab6cacef59a8f4b0ca023fc4b0b8cbc40de0ad29f46edd50b897c6e7fba79366a0217e3f48e2da8975056f6c35cfe19d9cc48f1d03c1dd + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.1": + version: 0.4.1 + resolution: "@humanwhocodes/retry@npm:0.4.1" + checksum: f11167c28e8266faba470fd273cbaafe2827523492bc18c5623015adb7ed66f46b2e542e3d756fed9ca614300249267814220c2f5f03a59e07fdfa64fc14ad52 + languageName: node + linkType: hard + "@improbable-eng/grpc-web@npm:^0.14.0": version: 0.14.1 resolution: "@improbable-eng/grpc-web@npm:0.14.1" @@ -11392,7 +11421,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -11481,43 +11510,44 @@ __metadata: linkType: hard "@keyv/redis@npm:^4.0.1": - version: 4.0.2 - resolution: "@keyv/redis@npm:4.0.2" + version: 4.1.0 + resolution: "@keyv/redis@npm:4.1.0" dependencies: - keyv: "*" + cluster-key-slot: ^1.1.2 + keyv: ^5.2.1 redis: ^4.7.0 - checksum: 356dcf125072b35be45649fcf5af5e5400b0227b25013d2f7494176a920654a1de63cb95e2a4a661b7db4c1cef8b7553d6e33603ace03d5fbe0a7e22955c9f2b + checksum: 71508c7a51f1c6eddd2a103e1f8271de8ab7fbd3c10a0163dabeebd4621632a9b04c158529d08518350e21def55ff931cf96cc20efd0855c75a18e2a10c52b7f languageName: node linkType: hard -"@keyv/serialize@npm:*": - version: 1.0.1 - resolution: "@keyv/serialize@npm:1.0.1" +"@keyv/serialize@npm:*, @keyv/serialize@npm:^1.0.2": + version: 1.0.2 + resolution: "@keyv/serialize@npm:1.0.2" dependencies: buffer: ^6.0.3 - checksum: ff3dd9a6246b17fca3d1b0aba312dea931059fdecc36027f4d8133e59dbb3554a0a516b1f3dfc7fb2b3ca7a3d6fa307804f299566ab214febd3fb9d0502eebed + checksum: c1788186d490521d67f3f6367effe2a2ccf2804960f449d728dc50a65ff2840501865f95ed5181c4b773cdeed61ebedb01c0f781a881034c8f3dafc1b98fef12 languageName: node linkType: hard -"@kubernetes-models/apimachinery@npm:^2.0.0, @kubernetes-models/apimachinery@npm:^2.0.1": - version: 2.0.1 - resolution: "@kubernetes-models/apimachinery@npm:2.0.1" +"@kubernetes-models/apimachinery@npm:^2.0.0, @kubernetes-models/apimachinery@npm:^2.0.2": + version: 2.0.2 + resolution: "@kubernetes-models/apimachinery@npm:2.0.2" dependencies: - "@kubernetes-models/base": ^5.0.0 + "@kubernetes-models/base": ^5.0.1 "@kubernetes-models/validate": ^4.0.0 "@swc/helpers": ^0.5.8 - checksum: 4e9d8773e7e313b09d1a81f86cfaa65eefb52dd35fc84b4fbbe13ce02836797739c7c864f82de30f6d1eb8ea25cb2b1cd820be056cfd48fdb80bfa02aa302935 + checksum: f99c50fc3c8446e6b525b74970c7dafe217fe3ffb944078c70b6c21ca0138040b44d094b57fb9218b1e52a5e4c802f1ea93d57c776b08eee59874be286f5545d languageName: node linkType: hard -"@kubernetes-models/base@npm:^5.0.0": - version: 5.0.0 - resolution: "@kubernetes-models/base@npm:5.0.0" +"@kubernetes-models/base@npm:^5.0.0, @kubernetes-models/base@npm:^5.0.1": + version: 5.0.1 + resolution: "@kubernetes-models/base@npm:5.0.1" dependencies: "@kubernetes-models/validate": ^4.0.0 is-plain-object: ^5.0.0 tslib: ^2.4.0 - checksum: 3ac064e6c18d88f356b8e91d320e08ee31a12a3ecd47d6d86e23566203125640b88223bc9003d02d420b6a9a86f2990f65e4a26c32ed075ef0753d8599549c0b + checksum: 9d0506b9b4b4ac366feb97f574e84f59d957377bb5c4c929332c3db8bd58bb70bcb1045d007d89369a73521591f7d0d5f651c43fca0779ed65d157258b6fd59a languageName: node linkType: hard @@ -11666,6 +11696,13 @@ __metadata: languageName: node linkType: hard +"@marijn/find-cluster-break@npm:^1.0.0": + version: 1.0.2 + resolution: "@marijn/find-cluster-break@npm:1.0.2" + checksum: 0d836de25e04d58325813401ef3c2d34caf040da985a5935fcbc9d84e7b47a21bdb15f57d70c2bf0960bd29ed3dbbb1afd00cdd0fc4fafbee7fd0ffe7d508ae1 + languageName: node + linkType: hard + "@material-table/core@npm:^3.1.0": version: 3.2.5 resolution: "@material-table/core@npm:3.2.5" @@ -11980,39 +12017,39 @@ __metadata: languageName: node linkType: hard -"@module-federation/bridge-react-webpack-plugin@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/bridge-react-webpack-plugin@npm:0.7.7" +"@module-federation/bridge-react-webpack-plugin@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/bridge-react-webpack-plugin@npm:0.8.7" dependencies: - "@module-federation/sdk": 0.7.7 + "@module-federation/sdk": 0.8.7 "@types/semver": 7.5.8 semver: 7.6.3 - checksum: 4f023e718e02195fb1555fd43e2ddbe88b71a1df29903d1f76297fe0a388421a6819a8d0375d8f4459e259388ee8fd6f00f7701d02d11b1fc6a6300a846b8d31 + checksum: de47a0bc01830138afafffcb093886dec175f1bee8f0c6ffe3d62744de2e34b379afdc50193520b9613a7b942a0729d31d204c1f2e04044e85613527b2cbeeb5 languageName: node linkType: hard -"@module-federation/data-prefetch@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/data-prefetch@npm:0.7.7" +"@module-federation/data-prefetch@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/data-prefetch@npm:0.8.7" dependencies: - "@module-federation/runtime": 0.7.7 - "@module-federation/sdk": 0.7.7 + "@module-federation/runtime": 0.8.7 + "@module-federation/sdk": 0.8.7 fs-extra: 9.1.0 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 9701f1ba3d50b4e5739c9ef76c55ca0ed7c7d66060fd79fed599612673fafd766681987fedfb8e7e0f0c435e86db79bfbc56d4aeadc461a400d845a7a7b61e78 + checksum: 208e9cb08de88bfd6fad13dbc97f582d3be6c3a7245dd963e82e35810bfa441d07aeb53f2a3cdee693146d21d9fdf7b7df550c9e138c417db285f0bd285376e2 languageName: node linkType: hard -"@module-federation/dts-plugin@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/dts-plugin@npm:0.7.7" +"@module-federation/dts-plugin@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/dts-plugin@npm:0.8.7" dependencies: - "@module-federation/error-codes": 0.7.7 - "@module-federation/managers": 0.7.7 - "@module-federation/sdk": 0.7.7 - "@module-federation/third-party-dts-extractor": 0.7.7 + "@module-federation/error-codes": 0.8.7 + "@module-federation/managers": 0.8.7 + "@module-federation/sdk": 0.8.7 + "@module-federation/third-party-dts-extractor": 0.8.7 adm-zip: ^0.5.10 ansi-colors: ^4.1.3 axios: ^1.7.4 @@ -12031,22 +12068,24 @@ __metadata: peerDependenciesMeta: vue-tsc: optional: true - checksum: d5cbd4c552673e0b561cba0ffbc92086c8e6102a0cf18df0131f16c8c7f63371e90dba6b3a65c765cf515af61cf31611d6773f9bbada436f1fa74e5ed0c8e95f + checksum: 82d0bccb7f1f159b57faa55d80a5ebff411439271b5dc60823558118a9106a6dc9195f5b0cd23a6018533903f7bf5ee0578cfcb3d6f212a8c448e93c53b1570e languageName: node linkType: hard -"@module-federation/enhanced@npm:^0.7.0": - version: 0.7.7 - resolution: "@module-federation/enhanced@npm:0.7.7" +"@module-federation/enhanced@npm:^0.8.0": + version: 0.8.7 + resolution: "@module-federation/enhanced@npm:0.8.7" dependencies: - "@module-federation/bridge-react-webpack-plugin": 0.7.7 - "@module-federation/data-prefetch": 0.7.7 - "@module-federation/dts-plugin": 0.7.7 - "@module-federation/managers": 0.7.7 - "@module-federation/manifest": 0.7.7 - "@module-federation/rspack": 0.7.7 - "@module-federation/runtime-tools": 0.7.7 - "@module-federation/sdk": 0.7.7 + "@module-federation/bridge-react-webpack-plugin": 0.8.7 + "@module-federation/data-prefetch": 0.8.7 + "@module-federation/dts-plugin": 0.8.7 + "@module-federation/error-codes": 0.8.7 + "@module-federation/inject-external-runtime-core-plugin": 0.8.7 + "@module-federation/managers": 0.8.7 + "@module-federation/manifest": 0.8.7 + "@module-federation/rspack": 0.8.7 + "@module-federation/runtime-tools": 0.8.7 + "@module-federation/sdk": 0.8.7 btoa: ^1.2.1 upath: 2.0.1 peerDependencies: @@ -12060,52 +12099,63 @@ __metadata: optional: true webpack: optional: true - checksum: 3b22c92072265cfd63d1f8a3ef2f3b8cdf1bfe6379eb893d7f6a771da2d56102aac0e4acb80b6dc08708ba33a6db95f0e14fb1fba24727d9ee79996aef54d6a8 + checksum: 6438b023bc56dea85dad5c5b840778bda75508976bba7d922ae8692a331b1b98041f3cd8f4a8a1189ea21ec2731d061b97b6644e2611437e90411efe90abda50 languageName: node linkType: hard -"@module-federation/error-codes@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/error-codes@npm:0.7.7" - checksum: 05762cafcc7346d9693bd8f815023325e46d35e8a5fbedcca4365bc9c1e0867d1020fe662f24a3681a09e992089194cd7a7fe49dae2f2fe3c64315609daba24d +"@module-federation/error-codes@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/error-codes@npm:0.8.7" + checksum: e2d0448a85881d824fd2ca3ef9a04523d06eff4dd421962e8f86c34ef46a1cd48602d917eac3d57ecdc22ee5373232bb599a2ab66bd48a9b50b885d01f77053c languageName: node linkType: hard -"@module-federation/managers@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/managers@npm:0.7.7" +"@module-federation/inject-external-runtime-core-plugin@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/inject-external-runtime-core-plugin@npm:0.8.7" + peerDependencies: + "@module-federation/runtime-tools": 0.8.7 + checksum: 28e4e447a79bb0de2ae270e0aabacaf1f2533a9d30d5cc445a81bddc796895c1f1fe895da611689d18912e52a0aba1b4b605bb2f54d517e8ce81bf44e5d8f7ac + languageName: node + linkType: hard + +"@module-federation/managers@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/managers@npm:0.8.7" dependencies: - "@module-federation/sdk": 0.7.7 + "@module-federation/sdk": 0.8.7 find-pkg: 2.0.0 fs-extra: 9.1.0 - checksum: 5e4a310530368a164e8b8a4d41f11d49d1b83f9e8fbafac3b09d1287d54e90708a00449d0ce6d961fe4634279ce132623b32d8a489e59807ed6ff520f020596d + checksum: 1b38ba2dcde89a268b2f4de8fcdc4ddbf2efd5c1f1ba641e58be2f72aa62b27584c01b46261dc65747301a238f4fafbc22ac2c8ede071e11172318084a3a8522 languageName: node linkType: hard -"@module-federation/manifest@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/manifest@npm:0.7.7" +"@module-federation/manifest@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/manifest@npm:0.8.7" dependencies: - "@module-federation/dts-plugin": 0.7.7 - "@module-federation/managers": 0.7.7 - "@module-federation/sdk": 0.7.7 + "@module-federation/dts-plugin": 0.8.7 + "@module-federation/managers": 0.8.7 + "@module-federation/sdk": 0.8.7 chalk: 3.0.0 find-pkg: 2.0.0 - checksum: 95b7789bc7990aabdf0b57f685d6664233f6637019194bad28cebfe27494001cbfa345e8435aa967936c87105a4b6589e1c555dee6d4d9a316b92c2a691a4c58 + checksum: 702b721308d938758f1d57d5f0d3ef42bc2005e5441f6ccfdc92c7171fa6fdfcbd268f7054dc530dbf3d60b187ba394c4bfa38f3ba17baede5a492ef67b845e3 languageName: node linkType: hard -"@module-federation/rspack@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/rspack@npm:0.7.7" +"@module-federation/rspack@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/rspack@npm:0.8.7" dependencies: - "@module-federation/bridge-react-webpack-plugin": 0.7.7 - "@module-federation/dts-plugin": 0.7.7 - "@module-federation/managers": 0.7.7 - "@module-federation/manifest": 0.7.7 - "@module-federation/runtime-tools": 0.7.7 - "@module-federation/sdk": 0.7.7 + "@module-federation/bridge-react-webpack-plugin": 0.8.7 + "@module-federation/dts-plugin": 0.8.7 + "@module-federation/inject-external-runtime-core-plugin": 0.8.7 + "@module-federation/managers": 0.8.7 + "@module-federation/manifest": 0.8.7 + "@module-federation/runtime-tools": 0.8.7 + "@module-federation/sdk": 0.8.7 peerDependencies: + "@rspack/core": ">=0.7" typescript: ^4.9.0 || ^5.0.0 vue-tsc: ">=1.0.24" peerDependenciesMeta: @@ -12113,7 +12163,17 @@ __metadata: optional: true vue-tsc: optional: true - checksum: b974e6082c7a2b56b5ea3a3bc2ccc6dfc44d8bd65b7ff87601154c340ff808e70933ae5a240aa0d39208879ec2a426f12284b86ca73bba7cd6b9daeeef4b142c + checksum: 933adfab6b62885e57da33cf453d450eb7f7ce983e54e2ae10ef4cb1b8c3ce333fec41428defd389b722d5323b355e9c374d42db00fd51faf2609fb8cdc29511 + languageName: node + linkType: hard + +"@module-federation/runtime-core@npm:0.6.15": + version: 0.6.15 + resolution: "@module-federation/runtime-core@npm:0.6.15" + dependencies: + "@module-federation/error-codes": 0.8.7 + "@module-federation/sdk": 0.8.7 + checksum: 6a2acbdfd2fdb39dc9c8e6e0edaf371437405eb25800709ed94b2a3c5f36e3918d77da6bd17751635a9fe9ead6993aa343d4a9590d0797d28d9c017293782865 languageName: node linkType: hard @@ -12127,13 +12187,13 @@ __metadata: languageName: node linkType: hard -"@module-federation/runtime-tools@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/runtime-tools@npm:0.7.7" +"@module-federation/runtime-tools@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/runtime-tools@npm:0.8.7" dependencies: - "@module-federation/runtime": 0.7.7 - "@module-federation/webpack-bundler-runtime": 0.7.7 - checksum: dab2e0e9a49ca2e00c34991d4af59ca07cf212c3f7c670d4577b9825e2cd516c2487d6199e6fa09f9fa47966649f3afce21eba9ec4f0a887112e965950d1930b + "@module-federation/runtime": 0.8.7 + "@module-federation/webpack-bundler-runtime": 0.8.7 + checksum: 39ccdcdd6a178a3be2a574fe38ac063096a3c39ef5dc5f772120134205134ab0617c5d7f979dcf25f4bff18ed0538923544bc402231b19cf39d1912440473b8b languageName: node linkType: hard @@ -12146,13 +12206,14 @@ __metadata: languageName: node linkType: hard -"@module-federation/runtime@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/runtime@npm:0.7.7" +"@module-federation/runtime@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/runtime@npm:0.8.7" dependencies: - "@module-federation/error-codes": 0.7.7 - "@module-federation/sdk": 0.7.7 - checksum: 1b8c95e57496a40d056762434d9946a550300ae3bd5f2e9229d3a1ad0f808ce707932bf7aec458c76f0eacd61581f01a8c8d75133a622e0498741e75f00be52b + "@module-federation/error-codes": 0.8.7 + "@module-federation/runtime-core": 0.6.15 + "@module-federation/sdk": 0.8.7 + checksum: 033dff2955290c29023593314de463744bee0eacce0bc3d0d1b9223ce2356f5d92554703e9f46066b269f24e3f16caa0cb675362d0ad88dfd9cae3b2a0e8b54c languageName: node linkType: hard @@ -12163,23 +12224,23 @@ __metadata: languageName: node linkType: hard -"@module-federation/sdk@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/sdk@npm:0.7.7" +"@module-federation/sdk@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/sdk@npm:0.8.7" dependencies: - isomorphic-rslog: 0.0.6 - checksum: dc156ff0cf6dcc5f85eca80eeb3d0d576000803de158ef1c63887f662b46005a32ea21bdeef115a59f12533929cd0367827d8ec0d6d364ec0514c989faeb1311 + isomorphic-rslog: 0.0.7 + checksum: d78fffcf5413877047e05cc82bdf31810ad46f669a9393105280e4eae7fcaf80aaf29dd239ce6c7be61b59e31e93d6531a9afc6f89e4c9dcdb6a35e5cf01f408 languageName: node linkType: hard -"@module-federation/third-party-dts-extractor@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/third-party-dts-extractor@npm:0.7.7" +"@module-federation/third-party-dts-extractor@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/third-party-dts-extractor@npm:0.8.7" dependencies: find-pkg: 2.0.0 fs-extra: 9.1.0 resolve: 1.22.8 - checksum: c1fa64a740469fa7ca0bfbc280359e22768c8e01df8325b9eb36346e06b60061432fd1ebe5d38335480e1fce3b8308daf8f0cf9a82d91b78270db2c21b92980c + checksum: 50ba3a7b507029291567c0334b257c6ba7ffc502627da958ff2247571a01d013d209143fb76557c9817aa62cd56a4ede69663866742063c97d2e14b3decf22ec languageName: node linkType: hard @@ -12193,13 +12254,13 @@ __metadata: languageName: node linkType: hard -"@module-federation/webpack-bundler-runtime@npm:0.7.7": - version: 0.7.7 - resolution: "@module-federation/webpack-bundler-runtime@npm:0.7.7" +"@module-federation/webpack-bundler-runtime@npm:0.8.7": + version: 0.8.7 + resolution: "@module-federation/webpack-bundler-runtime@npm:0.8.7" dependencies: - "@module-federation/runtime": 0.7.7 - "@module-federation/sdk": 0.7.7 - checksum: c0caeb9a5a7d5fbb360813ee880760ed2f72ea3ae4e39b37ba20accdfd8c60cfb625ead09455c68808e8461b744315cbfe89a1203824e33d9dc8f1c14c60dbd6 + "@module-federation/runtime": 0.8.7 + "@module-federation/sdk": 0.8.7 + checksum: a32718e9ce51a8cc0c5a822b92507cfe087a75d9a979d12e1158018cb6abc469e5aee6c7d18bd0ded786600232056c57fc589101bda4f54b1708c6549ead7864 languageName: node linkType: hard @@ -12321,28 +12382,28 @@ __metadata: languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.16.8": - version: 5.16.8 - resolution: "@mui/core-downloads-tracker@npm:5.16.8" - checksum: 1d099442aabf0a17ae0045d370565fca9c8654a654f88a08595542e6566d159aa632cc7d73aefa247f2ae3ab853709ea2e37118a080891bfbd200c58212202ca +"@mui/core-downloads-tracker@npm:^5.16.14": + version: 5.16.14 + resolution: "@mui/core-downloads-tracker@npm:5.16.14" + checksum: a25658362a69a89f35cdc12ded01b998b7f02df43648029f2523813fc7f259cc85f62bd1877059359d462e7c163e82308bd4cc74fa2d35651d302c5d8bbbc7f4 languageName: node linkType: hard "@mui/material@npm:^5.12.2": - version: 5.16.8 - resolution: "@mui/material@npm:5.16.8" + version: 5.16.14 + resolution: "@mui/material@npm:5.16.14" dependencies: "@babel/runtime": ^7.23.9 - "@mui/core-downloads-tracker": ^5.16.8 - "@mui/system": ^5.16.8 + "@mui/core-downloads-tracker": ^5.16.14 + "@mui/system": ^5.16.14 "@mui/types": ^7.2.15 - "@mui/utils": ^5.16.8 + "@mui/utils": ^5.16.14 "@popperjs/core": ^2.11.8 "@types/react-transition-group": ^4.4.10 clsx: ^2.1.0 csstype: ^3.1.3 prop-types: ^15.8.1 - react-is: ^18.3.1 + react-is: ^19.0.0 react-transition-group: ^4.4.5 peerDependencies: "@emotion/react": ^11.5.0 @@ -12357,16 +12418,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: 37aa0bba0d64feb46b6c7ef71ed44010c0799c5ebb57b345cf364e43be748a5229abfe3f4b573de225369b9cac13b35f6d32ad9e3015ad152645296f52096584 + checksum: 0c09353099580ca4f4e214ef1251a5fb1328a5ec19b5195ec4dd628c0ae0b3fae47a8fcae39a807aac1ac8a26bf0109da07eb7eca183975f8cae583d7306de0f languageName: node linkType: hard -"@mui/private-theming@npm:^5.16.8": - version: 5.16.8 - resolution: "@mui/private-theming@npm:5.16.8" +"@mui/private-theming@npm:^5.16.14": + version: 5.16.14 + resolution: "@mui/private-theming@npm:5.16.14" dependencies: "@babel/runtime": ^7.23.9 - "@mui/utils": ^5.16.8 + "@mui/utils": ^5.16.14 prop-types: ^15.8.1 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -12374,16 +12435,16 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 576cf19188c236482a8a698978d3061c7e8d76ba9d891d323ce96d92d6b80d88e1aa2a67fe4698d76b8a43221ef0f8ed21be74971fc684ce1279dc73fd34316b + checksum: da762a6ccf5d12e2bfad4de29cdfbcfaf7d8229706e1063ecf41a0e724e0cd0317a847a83b0edc553f07e63566dbbb4e6aa15f6b295993224977f969769318be languageName: node linkType: hard -"@mui/styled-engine@npm:^5.16.8": - version: 5.16.8 - resolution: "@mui/styled-engine@npm:5.16.8" +"@mui/styled-engine@npm:^5.16.14": + version: 5.16.14 + resolution: "@mui/styled-engine@npm:5.16.14" dependencies: "@babel/runtime": ^7.23.9 - "@emotion/cache": ^11.11.0 + "@emotion/cache": ^11.13.5 csstype: ^3.1.3 prop-types: ^15.8.1 peerDependencies: @@ -12395,19 +12456,19 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: 8eab246e985bbe2707af4620a3193166bacefb029df65ac846cfc0ac5d7996fcb72c50327241f60913538f58a2ad9aa6de3ef12b72eb7750c71f8d3c284a420b + checksum: 5868683e6dd4004b34a0ce9de8842c180f7b7618c0b8cff904771659ef2da3aae574ea10b0c5ad6ffe59db396f699773ebb99f3f9d831d8b5adc398ecc618195 languageName: node linkType: hard "@mui/styles@npm:^5.14.18": - version: 5.16.8 - resolution: "@mui/styles@npm:5.16.8" + version: 5.16.14 + resolution: "@mui/styles@npm:5.16.14" dependencies: "@babel/runtime": ^7.23.9 "@emotion/hash": ^0.9.1 - "@mui/private-theming": ^5.16.8 + "@mui/private-theming": ^5.16.14 "@mui/types": ^7.2.15 - "@mui/utils": ^5.16.8 + "@mui/utils": ^5.16.14 clsx: ^2.1.0 csstype: ^3.1.3 hoist-non-react-statics: ^3.3.2 @@ -12426,19 +12487,19 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 05d6e5cec3492d26f0c0880a9881b05d520e90f69d74a814bd68d28e7eaed6a12af8e566c7cb8b58e9137fca59cf2ec9cf22445e0aa08515e5d3bc2c0bb5d778 + checksum: 1d579e005f26a76e39feeda8634cbf41d041dcfe85ca6cfa19180ca1e6477bc909966a4738a6a875bd9d18b4157272d60869bbf94546c4813db551df19c0e6aa languageName: node linkType: hard -"@mui/system@npm:^5.16.8": - version: 5.16.8 - resolution: "@mui/system@npm:5.16.8" +"@mui/system@npm:^5.16.14": + version: 5.16.14 + resolution: "@mui/system@npm:5.16.14" dependencies: "@babel/runtime": ^7.23.9 - "@mui/private-theming": ^5.16.8 - "@mui/styled-engine": ^5.16.8 + "@mui/private-theming": ^5.16.14 + "@mui/styled-engine": ^5.16.14 "@mui/types": ^7.2.15 - "@mui/utils": ^5.16.8 + "@mui/utils": ^5.16.14 clsx: ^2.1.0 csstype: ^3.1.3 prop-types: ^15.8.1 @@ -12454,11 +12515,11 @@ __metadata: optional: true "@types/react": optional: true - checksum: 8082b176009fa907cdb0391db59db6cd3589659ad92497caec998c01e1683978ab2eda4ece4d12e523d233b062aa5946d4a438d9a22bf172f0568be1db773e9c + checksum: 20b5d7c1cd1f163c6e28fb267ffb9705e61faf24b62bae5dde08904f2b42a2173ee714d72ae1b5f84a7d50356ad5fa7525a625f9e360d9a886c52b1a1bf6698e languageName: node linkType: hard -"@mui/types@npm:^7.2.15, @mui/types@npm:^7.2.17, @mui/types@npm:^7.2.19": +"@mui/types@npm:^7.2.15": version: 7.2.19 resolution: "@mui/types@npm:7.2.19" peerDependencies: @@ -12470,43 +12531,23 @@ __metadata: languageName: node linkType: hard -"@mui/utils@npm:^5.14.15, @mui/utils@npm:^5.16.8": - version: 5.16.8 - resolution: "@mui/utils@npm:5.16.8" +"@mui/utils@npm:^5.14.15, @mui/utils@npm:^5.16.14": + version: 5.16.14 + resolution: "@mui/utils@npm:5.16.14" dependencies: "@babel/runtime": ^7.23.9 "@mui/types": ^7.2.15 "@types/prop-types": ^15.7.12 clsx: ^2.1.1 prop-types: ^15.8.1 - react-is: ^18.3.1 + react-is: ^19.0.0 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: ed714c6aa583bdf17af9f523c9b9ba3789a47677aa6408bc2afd842fa9eaa6d111361c1309435d481ea03b8c695e22ead98c43dc13239c63a3da481c95e5ad72 - languageName: node - linkType: hard - -"@mui/utils@npm:^6.1.1": - version: 6.1.9 - resolution: "@mui/utils@npm:6.1.9" - dependencies: - "@babel/runtime": ^7.26.0 - "@mui/types": ^7.2.19 - "@types/prop-types": ^15.7.13 - clsx: ^2.1.1 - prop-types: ^15.8.1 - react-is: ^18.3.1 - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: a2c61c0537b312ab0faeb3f13e7f3b0736e11f29e7907ccd77b0643afc0dca3a0dceb3817371666f35ca8df723ddeac9b2bbb6b759206bde99e03514cfd4ebb9 + checksum: 311ca0c2c2aa315cdcb351805fc5be2c474492afb0b07ae88d99e7ad7d5ab5bbc477cc3d5f6cbde32e16b65588d52dcc53fbe70c026534134a5e3b942dcc444c languageName: node linkType: hard @@ -12651,6 +12692,19 @@ __metadata: languageName: node linkType: hard +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: ^7.1.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.1 + lru-cache: ^10.0.1 + socks-proxy-agent: ^8.0.3 + checksum: e8fc25d536250ed3e669813b36e8c6d805628b472353c57afd8c4fde0fcfcf3dda4ffe22f7af8c9070812ec2e7a03fb41d7151547cef3508efe661a5a3add20f + languageName: node + linkType: hard + "@npmcli/arborist@npm:^4.0.4": version: 4.3.1 resolution: "@npmcli/arborist@npm:4.3.1" @@ -12722,6 +12776,15 @@ __metadata: languageName: node linkType: hard +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: ^7.3.5 + checksum: 68951c589e9a4328698a35fd82fe71909a257d6f2ede0434d236fa55634f0fbcad9bb8755553ce5849bd25ee6f019f4d435921ac715c853582c4a7f5983c8d4a + languageName: node + linkType: hard + "@npmcli/git@npm:^2.1.0": version: 2.1.0 resolution: "@npmcli/git@npm:2.1.0" @@ -13639,16 +13702,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api-logs@npm:0.54.1": - version: 0.54.1 - resolution: "@opentelemetry/api-logs@npm:0.54.1" - dependencies: - "@opentelemetry/api": ^1.3.0 - checksum: da3d2bd36f138ec1a56ea34b1601c6bf30be22f443b3a24f5df2cf293ed3f2601fb01ff00cb34a4ef08bd955b78f8259243dc757195f9ace7af4196896d32291 - languageName: node - linkType: hard - -"@opentelemetry/api-logs@npm:0.54.2, @opentelemetry/api-logs@npm:^0.54.0": +"@opentelemetry/api-logs@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/api-logs@npm:0.54.2" dependencies: @@ -13657,6 +13711,15 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/api-logs@npm:0.56.0, @opentelemetry/api-logs@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/api-logs@npm:0.56.0" + dependencies: + "@opentelemetry/api": ^1.3.0 + checksum: a6bbad94e638316ef3a6e4835124e6a53c3675f0e9a29bb1a37e7905d38ecb72cba20b4289d0e740d6a7a4b16136ee1b393e55d8c14ade9808b44cfb2533eeea + languageName: node + linkType: hard + "@opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.4.0, @opentelemetry/api@npm:^1.9.0": version: 1.9.0 resolution: "@opentelemetry/api@npm:1.9.0" @@ -13664,60 +13727,60 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/auto-instrumentations-node@npm:^0.52.0": - version: 0.52.1 - resolution: "@opentelemetry/auto-instrumentations-node@npm:0.52.1" +"@opentelemetry/auto-instrumentations-node@npm:^0.54.0": + version: 0.54.0 + resolution: "@opentelemetry/auto-instrumentations-node@npm:0.54.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/instrumentation-amqplib": ^0.43.0 - "@opentelemetry/instrumentation-aws-lambda": ^0.47.0 - "@opentelemetry/instrumentation-aws-sdk": ^0.46.0 - "@opentelemetry/instrumentation-bunyan": ^0.42.0 - "@opentelemetry/instrumentation-cassandra-driver": ^0.42.0 - "@opentelemetry/instrumentation-connect": ^0.40.0 - "@opentelemetry/instrumentation-cucumber": ^0.10.0 - "@opentelemetry/instrumentation-dataloader": ^0.13.0 - "@opentelemetry/instrumentation-dns": ^0.40.0 - "@opentelemetry/instrumentation-express": ^0.44.0 - "@opentelemetry/instrumentation-fastify": ^0.41.0 - "@opentelemetry/instrumentation-fs": ^0.16.0 - "@opentelemetry/instrumentation-generic-pool": ^0.40.0 - "@opentelemetry/instrumentation-graphql": ^0.44.0 - "@opentelemetry/instrumentation-grpc": ^0.54.0 - "@opentelemetry/instrumentation-hapi": ^0.42.0 - "@opentelemetry/instrumentation-http": ^0.54.0 - "@opentelemetry/instrumentation-ioredis": ^0.44.0 - "@opentelemetry/instrumentation-kafkajs": ^0.4.0 - "@opentelemetry/instrumentation-knex": ^0.41.0 - "@opentelemetry/instrumentation-koa": ^0.44.0 - "@opentelemetry/instrumentation-lru-memoizer": ^0.41.0 - "@opentelemetry/instrumentation-memcached": ^0.40.0 - "@opentelemetry/instrumentation-mongodb": ^0.48.0 - "@opentelemetry/instrumentation-mongoose": ^0.43.0 - "@opentelemetry/instrumentation-mysql": ^0.42.0 - "@opentelemetry/instrumentation-mysql2": ^0.42.1 - "@opentelemetry/instrumentation-nestjs-core": ^0.41.0 - "@opentelemetry/instrumentation-net": ^0.40.0 - "@opentelemetry/instrumentation-pg": ^0.47.1 - "@opentelemetry/instrumentation-pino": ^0.43.0 - "@opentelemetry/instrumentation-redis": ^0.43.0 - "@opentelemetry/instrumentation-redis-4": ^0.43.0 - "@opentelemetry/instrumentation-restify": ^0.42.0 - "@opentelemetry/instrumentation-router": ^0.41.0 - "@opentelemetry/instrumentation-socket.io": ^0.43.0 - "@opentelemetry/instrumentation-tedious": ^0.15.0 - "@opentelemetry/instrumentation-undici": ^0.7.1 - "@opentelemetry/instrumentation-winston": ^0.41.0 - "@opentelemetry/resource-detector-alibaba-cloud": ^0.29.4 - "@opentelemetry/resource-detector-aws": ^1.7.0 - "@opentelemetry/resource-detector-azure": ^0.2.12 - "@opentelemetry/resource-detector-container": ^0.5.0 - "@opentelemetry/resource-detector-gcp": ^0.29.13 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/instrumentation-amqplib": ^0.45.0 + "@opentelemetry/instrumentation-aws-lambda": ^0.49.0 + "@opentelemetry/instrumentation-aws-sdk": ^0.48.0 + "@opentelemetry/instrumentation-bunyan": ^0.44.0 + "@opentelemetry/instrumentation-cassandra-driver": ^0.44.0 + "@opentelemetry/instrumentation-connect": ^0.42.0 + "@opentelemetry/instrumentation-cucumber": ^0.12.0 + "@opentelemetry/instrumentation-dataloader": ^0.15.0 + "@opentelemetry/instrumentation-dns": ^0.42.0 + "@opentelemetry/instrumentation-express": ^0.46.0 + "@opentelemetry/instrumentation-fastify": ^0.43.0 + "@opentelemetry/instrumentation-fs": ^0.18.0 + "@opentelemetry/instrumentation-generic-pool": ^0.42.0 + "@opentelemetry/instrumentation-graphql": ^0.46.0 + "@opentelemetry/instrumentation-grpc": ^0.56.0 + "@opentelemetry/instrumentation-hapi": ^0.44.0 + "@opentelemetry/instrumentation-http": ^0.56.0 + "@opentelemetry/instrumentation-ioredis": ^0.46.0 + "@opentelemetry/instrumentation-kafkajs": ^0.6.0 + "@opentelemetry/instrumentation-knex": ^0.43.0 + "@opentelemetry/instrumentation-koa": ^0.46.0 + "@opentelemetry/instrumentation-lru-memoizer": ^0.43.0 + "@opentelemetry/instrumentation-memcached": ^0.42.0 + "@opentelemetry/instrumentation-mongodb": ^0.50.0 + "@opentelemetry/instrumentation-mongoose": ^0.45.0 + "@opentelemetry/instrumentation-mysql": ^0.44.0 + "@opentelemetry/instrumentation-mysql2": ^0.44.0 + "@opentelemetry/instrumentation-nestjs-core": ^0.43.0 + "@opentelemetry/instrumentation-net": ^0.42.0 + "@opentelemetry/instrumentation-pg": ^0.49.0 + "@opentelemetry/instrumentation-pino": ^0.45.0 + "@opentelemetry/instrumentation-redis": ^0.45.0 + "@opentelemetry/instrumentation-redis-4": ^0.45.0 + "@opentelemetry/instrumentation-restify": ^0.44.0 + "@opentelemetry/instrumentation-router": ^0.43.0 + "@opentelemetry/instrumentation-socket.io": ^0.45.0 + "@opentelemetry/instrumentation-tedious": ^0.17.0 + "@opentelemetry/instrumentation-undici": ^0.9.0 + "@opentelemetry/instrumentation-winston": ^0.43.0 + "@opentelemetry/resource-detector-alibaba-cloud": ^0.29.6 + "@opentelemetry/resource-detector-aws": ^1.9.0 + "@opentelemetry/resource-detector-azure": ^0.4.0 + "@opentelemetry/resource-detector-container": ^0.5.2 + "@opentelemetry/resource-detector-gcp": ^0.31.0 "@opentelemetry/resources": ^1.24.0 - "@opentelemetry/sdk-node": ^0.54.0 + "@opentelemetry/sdk-node": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.4.1 - checksum: bcff9f9f9c2d118c4cb18b5bb671257a5ec2c445dd8663f4184919488203b672c18085bf7121541c01a29dcbf2f96cbac7248d986d779f694f59abd06c7158ab + checksum: a8f5fe11d4b5090de584b9780dd8358834db8e4ea9dfa12b21c3fe021471b198354f3416a1cf7c6621cae95199d1d1553b7ae7d5f69044d44f767942a90492dc languageName: node linkType: hard @@ -13730,7 +13793,16 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/core@npm:1.27.0, @opentelemetry/core@npm:^1.0.0, @opentelemetry/core@npm:^1.1.0, @opentelemetry/core@npm:^1.25.0, @opentelemetry/core@npm:^1.25.1, @opentelemetry/core@npm:^1.26.0, @opentelemetry/core@npm:^1.8.0": +"@opentelemetry/context-async-hooks@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/context-async-hooks@npm:1.29.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: edbd8d20cee2adaec276e4ec723dca023036c004eccc8bfbfff59e9a8a25a196b05540ed33813f30f9b6e51bc8e51b3de95c927157e874cfaa6510af00d9cf0e + languageName: node + linkType: hard + +"@opentelemetry/core@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/core@npm:1.27.0" dependencies: @@ -13741,6 +13813,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/core@npm:1.29.0, @opentelemetry/core@npm:^1.0.0, @opentelemetry/core@npm:^1.1.0, @opentelemetry/core@npm:^1.25.0, @opentelemetry/core@npm:^1.25.1, @opentelemetry/core@npm:^1.26.0, @opentelemetry/core@npm:^1.8.0": + version: 1.29.0 + resolution: "@opentelemetry/core@npm:1.29.0" + dependencies: + "@opentelemetry/semantic-conventions": 1.28.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: bf025473175ceee9a64c6d31f01f7d9924b54ebcb603b38dae56d2ef664acb5fe43f393ae9b0aff41deb3a80b7222b74b9fd2764712db30ee2547280aecff509 + languageName: node + linkType: hard + "@opentelemetry/exporter-logs-otlp-grpc@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/exporter-logs-otlp-grpc@npm:0.54.2" @@ -13756,6 +13839,21 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-logs-otlp-grpc@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-logs-otlp-grpc@npm:0.56.0" + dependencies: + "@grpc/grpc-js": ^1.7.1 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-grpc-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/sdk-logs": 0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 107336fd62fc917bc75b745b219bff7ea5410e4688f2621c1f8bf05af57275113e64ecc3af23ff843afb1cc44fb4112f96c79b135b5246a6bad2a01c93c7938d + languageName: node + linkType: hard + "@opentelemetry/exporter-logs-otlp-http@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/exporter-logs-otlp-http@npm:0.54.2" @@ -13771,6 +13869,21 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-logs-otlp-http@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-logs-otlp-http@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/sdk-logs": 0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 538c05f27821c447fe0463e159ee526baae6978393fe630943d415c115e6db8132c028ed82eaa0f4001e7418697870919b641696b89e355f2567b16323eff732 + languageName: node + linkType: hard + "@opentelemetry/exporter-logs-otlp-proto@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/exporter-logs-otlp-proto@npm:0.54.2" @@ -13788,6 +13901,23 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-logs-otlp-proto@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-logs-otlp-proto@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-logs": 0.56.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 77737c7007ee6f062f854b267044bca6d2fd8a19128771834fe943a3e1597aba5931f83ceb6c9ff2375ddc8a6b94ed67a92132396ef3ddd9e7e4db2c1f2864f3 + languageName: node + linkType: hard + "@opentelemetry/exporter-prometheus@npm:^0.54.0": version: 0.54.2 resolution: "@opentelemetry/exporter-prometheus@npm:0.54.2" @@ -13817,6 +13947,22 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-trace-otlp-grpc@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.56.0" + dependencies: + "@grpc/grpc-js": ^1.7.1 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-grpc-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 90501836c2c300ef47fcbe3fa5af46f6868de658f0f64a72f2fd115639c6673bf8fd7a24a537ba7a402313727136deeeefe8f97ff93453370f0f1ee7d80ef1e5 + languageName: node + linkType: hard + "@opentelemetry/exporter-trace-otlp-http@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.54.2" @@ -13832,6 +13978,21 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-trace-otlp-http@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.56.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 4d436ab37c0c5a35e602fa418d69d8830bf4d8e99487206b178e1351a2db7f2a83fd31407e1517ed6dba8c7589d336604d7f44f5f3d30394a13956188d15fee5 + languageName: node + linkType: hard + "@opentelemetry/exporter-trace-otlp-proto@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.54.2" @@ -13847,6 +14008,21 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-trace-otlp-proto@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.56.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: e0e94aa50326fa78fd6fa1b8f2c05ad15b6a3a920fd61a13895a9cef935359221b87af233a053cbc3bbc7296ca96aa5dc242dda0aa93b70d291db7fe5580fc8a + languageName: node + linkType: hard + "@opentelemetry/exporter-zipkin@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/exporter-zipkin@npm:1.27.0" @@ -13861,514 +14037,512 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation-amqplib@npm:^0.43.0": - version: 0.43.0 - resolution: "@opentelemetry/instrumentation-amqplib@npm:0.43.0" +"@opentelemetry/exporter-zipkin@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/exporter-zipkin@npm:1.29.0" dependencies: - "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/semantic-conventions": ^1.27.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + "@opentelemetry/semantic-conventions": 1.28.0 peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 5eb17469d5c3ce2e8495d7e97684cd3b85d1e6aed4081ec1e4103f90bb5ef64633a6913844c5f0afecc2485f77c5b1adfe34c80ed5b7ea48873d9f92b9d04ef2 + "@opentelemetry/api": ^1.0.0 + checksum: 6455c96f28a1f6275459c513fab905c602cc60921cccd4b506050a242145bff5ce2a81268cc1c5531eb238de565cfa54c320231cdfa4bc1a6be6eb31517780a5 languageName: node linkType: hard -"@opentelemetry/instrumentation-aws-lambda@npm:^0.47.0": - version: 0.47.0 - resolution: "@opentelemetry/instrumentation-aws-lambda@npm:0.47.0" +"@opentelemetry/instrumentation-amqplib@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-amqplib@npm:0.45.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/semantic-conventions": ^1.27.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 3b009e67974f25c37265cbff30ab39e66b46852778e038197c228178f3ac5e6dfab647a24621f5f8aa9f4f1633ad6257c9f7a3638d957d9d81503c1f43179023 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-aws-lambda@npm:^0.49.0": + version: 0.49.0 + resolution: "@opentelemetry/instrumentation-aws-lambda@npm:0.49.0" + dependencies: + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@types/aws-lambda": 8.10.143 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 72925ac1c5d5de107342bf859e0aa5c43b4cda7191b2b0489a7a17ddb3fd7e831a53ee2d20c9d4331918ecf290563d6e4927fa445091b2828d27c2254de05ba3 + checksum: 8f18748d606bd6d6a32fadcee5e127e939a48e8aac49de0edbe1dac61094c4dcabce6457f306c81c527c5c014abdbeb736b95be43c6312e77dffff5c90a68592 languageName: node linkType: hard -"@opentelemetry/instrumentation-aws-sdk@npm:^0.46.0": - version: 0.46.0 - resolution: "@opentelemetry/instrumentation-aws-sdk@npm:0.46.0" +"@opentelemetry/instrumentation-aws-sdk@npm:^0.48.0": + version: 0.48.0 + resolution: "@opentelemetry/instrumentation-aws-sdk@npm:0.48.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/propagation-utils": ^0.30.12 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/propagation-utils": ^0.30.14 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 8e797ab8e8e976c7a87f7ac44c8e132079bbd0e0822b2a1a9596ca62ddfccffb2feb18b0cb63c52a3eeca83fcf0c03fc6cd3210d1bbf07138e6aee2ac273d2c3 + checksum: 0538f38b42a6cd7279ab6f9c85af19525b463a9873fd429163c30ddf817ed17916ab6a53ea05c034d8e6861d10bb031c7ebcbf607b49e3e3c4b89e589a381576 languageName: node linkType: hard -"@opentelemetry/instrumentation-bunyan@npm:^0.42.0": - version: 0.42.0 - resolution: "@opentelemetry/instrumentation-bunyan@npm:0.42.0" +"@opentelemetry/instrumentation-bunyan@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-bunyan@npm:0.44.0" dependencies: - "@opentelemetry/api-logs": ^0.54.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/api-logs": ^0.56.0 + "@opentelemetry/instrumentation": ^0.56.0 "@types/bunyan": 1.8.9 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 476850eff4e5c2864b0512c014db71a01372e5cce97e870b915450193f5eaee2cec294cdd32340cf5394cf40de3209ccfb47298630d8e3131572e6f0f568a964 + checksum: 4d176289ffbc26e268c24995c385349d4a817abdc1104eea8bc97d5abd7d6e105cc3dd9f69ac568d1094ec33992597a2b8666b94dbfc1e3d9d3e8f103dafb007 languageName: node linkType: hard -"@opentelemetry/instrumentation-cassandra-driver@npm:^0.42.0": - version: 0.42.0 - resolution: "@opentelemetry/instrumentation-cassandra-driver@npm:0.42.0" +"@opentelemetry/instrumentation-cassandra-driver@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-cassandra-driver@npm:0.44.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: fa9139efc7cb10702cc71aba388d8efdd8a08bbab37864c28f61fb20c1cfa47dd79131a02571231ae14245b2d37bd53877fd359ffe61f86db99117532910f213 + checksum: b4c809a3abd7ddefe14345da1a287958cc80de1470e72232363cf03467e1dbd4a99dc081361fea1472040e5e9ca9c377f997af3782c1ba32121bdb76a5966b60 languageName: node linkType: hard -"@opentelemetry/instrumentation-connect@npm:^0.40.0": - version: 0.40.0 - resolution: "@opentelemetry/instrumentation-connect@npm:0.40.0" +"@opentelemetry/instrumentation-connect@npm:^0.42.0": + version: 0.42.0 + resolution: "@opentelemetry/instrumentation-connect@npm:0.42.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@types/connect": 3.4.36 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 3fe2f82105abc740c813765594f0cce37cbcced2610ac2d48d97311e2bc853695c4953cedb88ed620c163e39492f4549476b3fa1b2b65034abd0fd5b2a1bb1b2 + checksum: 45c749871feedf8af72de48968027005ab560d73054e55da3426f3091a422b9646fd0170ea5b597d4abd4efc585e2e2a6f9e91253d7fb38dccd42f486cb3ea30 languageName: node linkType: hard -"@opentelemetry/instrumentation-cucumber@npm:^0.10.0": - version: 0.10.0 - resolution: "@opentelemetry/instrumentation-cucumber@npm:0.10.0" +"@opentelemetry/instrumentation-cucumber@npm:^0.12.0": + version: 0.12.0 + resolution: "@opentelemetry/instrumentation-cucumber@npm:0.12.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: a6c516b7a301141741a1e74d1e674434bdc99fa381217889dbcf2a03a2d8269a92cdb8517f25bda80b73019d30970980a98f859eb23e5ba10fbb5c899cdc7bf1 + checksum: 2976f1b5ac2b6d218db4b64c173c25ccc4f2230ecfdc934223f1e27ba0cab2aeee8a0ed344646b001610898bf60aa0cd94ada3e1a05a688b6a4980db2d94b11b languageName: node linkType: hard -"@opentelemetry/instrumentation-dataloader@npm:^0.13.0": - version: 0.13.0 - resolution: "@opentelemetry/instrumentation-dataloader@npm:0.13.0" +"@opentelemetry/instrumentation-dataloader@npm:^0.15.0": + version: 0.15.0 + resolution: "@opentelemetry/instrumentation-dataloader@npm:0.15.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: f423888d71c9b15c02dce863cccb5fa677c625bd3b864ba545be368275e3f88b03284073a24f7f3cb4c0c1f3544c92580b53abdf15dd098fd33c60c6d8326c24 + checksum: a1f217be8064be3cbd116c0fb58feef46b6e05fe9ac3c0333d5cc43ac9df182550bb8f5b084e9557f73e0af7fe917a81d79d69f640009ef64624b97e17f1bb85 languageName: node linkType: hard -"@opentelemetry/instrumentation-dns@npm:^0.40.0": - version: 0.40.0 - resolution: "@opentelemetry/instrumentation-dns@npm:0.40.0" - dependencies: - "@opentelemetry/instrumentation": ^0.54.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: dbc1a4b31b3fe78c46cd19c76162dedec175d07d09d6a553d9b31560ceab4ee6781ca88e5246fd9b371260bfa48c8ab26640d3e5ac914d4d6e8284214a7f86de - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-express@npm:^0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/instrumentation-express@npm:0.44.0" - dependencies: - "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/semantic-conventions": ^1.27.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 0ab8be80c817021b7a96fa94bf55c635fa664d2c03058e1485311f4f4bf964e5cf7756185c9003a4d59ac6fc766eff52a7b390a91ca3946ce3d371f3135ea4d5 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-fastify@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-fastify@npm:0.41.0" - dependencies: - "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/semantic-conventions": ^1.27.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: dc790cd6ee7ea2322be2e35ce259e10a1f42827970b0b83a6ca7a5a934a986dea7239fe1a29cc772529c1504f24d3afe91c0923a87efc12e8ea1b1321df18514 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-fs@npm:^0.16.0": - version: 0.16.0 - resolution: "@opentelemetry/instrumentation-fs@npm:0.16.0" - dependencies: - "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: d74b3ab430c909b7840322540ab51664c29e8ff43fd4eaa77edf11828e5b2234b519771f8d64d051d6a508c1c20c377e606f032fa758ef08eb23e0336e3746bc - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-generic-pool@npm:^0.40.0": - version: 0.40.0 - resolution: "@opentelemetry/instrumentation-generic-pool@npm:0.40.0" - dependencies: - "@opentelemetry/instrumentation": ^0.54.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 665d687191983bd756db1e510b604e244100c42fa6667d7512d42d58a2d319d114d41c96ada15cfa3344763022774138acaee1bec43fdbbfae5aa5bc65a72e0a - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-graphql@npm:^0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/instrumentation-graphql@npm:0.44.0" - dependencies: - "@opentelemetry/instrumentation": ^0.54.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: c4f0f771e1d939de844a97b0e5c0416d5c0d12d2d94e369566b61ec3819193c7eb113c9b3101581c83bb44bdb2b289a33623488ab7446be370e3577ebe37a198 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-grpc@npm:^0.54.0": - version: 0.54.1 - resolution: "@opentelemetry/instrumentation-grpc@npm:0.54.1" - dependencies: - "@opentelemetry/instrumentation": 0.54.1 - "@opentelemetry/semantic-conventions": 1.27.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: fc85c6d1f93f4e0a9368c458b4569c0e60f86976f22c9e9a9d903f79079f93b5a280f3ab14b548149984241e5efd6d04f9b5018709e1377159c3cd41d3a08495 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-hapi@npm:^0.42.0": +"@opentelemetry/instrumentation-dns@npm:^0.42.0": version: 0.42.0 - resolution: "@opentelemetry/instrumentation-hapi@npm:0.42.0" + resolution: "@opentelemetry/instrumentation-dns@npm:0.42.0" dependencies: - "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/semantic-conventions": ^1.27.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 4e755b3ad4426820d6172f01cd603f14ac75a4521292d912cd31eeaef3e5aa0b9caad5a617b2543a07824b5e385c9bbf256a45acc8a66127096cae03fc48a20d + checksum: 4717331b7429c5a427eb48d7ebd210584806bf672b71dde0bacf677488e39a201a593f3ac16ef7a7ce1ed75cc37e6ea5daff9dccfcd2ec79f09808b77ad55352 languageName: node linkType: hard -"@opentelemetry/instrumentation-http@npm:^0.54.0": - version: 0.54.1 - resolution: "@opentelemetry/instrumentation-http@npm:0.54.1" +"@opentelemetry/instrumentation-express@npm:^0.46.0": + version: 0.46.0 + resolution: "@opentelemetry/instrumentation-express@npm:0.46.0" dependencies: - "@opentelemetry/core": 1.27.0 - "@opentelemetry/instrumentation": 0.54.1 - "@opentelemetry/semantic-conventions": 1.27.0 + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/semantic-conventions": ^1.27.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 799938a06ded695d9e5f32f902d5f6d960e6756ec2d09f34b2373d74a441ea0b9dfeed6f0c1668cf97c9b33991a724fe5be8dec328f0c8cacc0ac8507df10687 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-fastify@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation-fastify@npm:0.43.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/semantic-conventions": ^1.27.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 008c6f2567ecabe69552f78f8fbcefdf2492d85b0e3e0ac36bd47e6f13a8d02680e7cee1748cd4a70ca9f27213abd30c28bf14d7791ead8a06bf1c85986ef7f9 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-fs@npm:^0.18.0": + version: 0.18.0 + resolution: "@opentelemetry/instrumentation-fs@npm:0.18.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 2fe2694f5dd4ef9bfe7b75e66655cbde93afe2bb4f55731841b8ec5ac5af18912d4428edfe6901806452442060262edef14e46719f1faf85e5f11bb0274a054b + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-generic-pool@npm:^0.42.0": + version: 0.42.0 + resolution: "@opentelemetry/instrumentation-generic-pool@npm:0.42.0" + dependencies: + "@opentelemetry/instrumentation": ^0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 5f35a30b76705f4527f0ab8ec83d83014615612f40a7bd16a87a75f922a7aeff113042ae99d30f7ab809853841d2769ddee2e03ce304de80251f1d8370ec2d89 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-graphql@npm:^0.46.0": + version: 0.46.0 + resolution: "@opentelemetry/instrumentation-graphql@npm:0.46.0" + dependencies: + "@opentelemetry/instrumentation": ^0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: b8c9faa2c002846bf85a4ccf4e9aba343d8f38a08e85d8c4e77a016da2d0b84291d6b8505aec7de70088761d4a341192a26163aafc23a2fc04a918c94c1686b6 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-grpc@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/instrumentation-grpc@npm:0.56.0" + dependencies: + "@opentelemetry/instrumentation": 0.56.0 + "@opentelemetry/semantic-conventions": 1.28.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 8bb00759e74d05bc7ca3ba7c46fe6ab01ff16adcb5c658a3e1679c5ea6d10b0f381ffae970a694b014881cbaa707ec24076967fa47643187365b765f34f4094e + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-hapi@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-hapi@npm:0.44.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/semantic-conventions": ^1.27.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 0ee7610e9a1149d087dc8883f6d20ed7d0a15c7b1da273fc170220daec5e68a1240e0624743b000c8d263bb8b21615ecf84b8a179508763523108de88fedadb4 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-http@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/instrumentation-http@npm:0.56.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/instrumentation": 0.56.0 + "@opentelemetry/semantic-conventions": 1.28.0 forwarded-parse: 2.1.2 semver: ^7.5.2 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 49a1bda0417ef5866398b89114a7f61d9eb040faa338603746af074dab315eca791443b35b9a1fa00d3b176f807b4a88f9003323570d50ee174f8c86cd3614d6 + checksum: f8033d8410d8b06bb222090959479fe4f24c8d52281ce3e240458a449eab8009cb889d09240f67135699b7a543a4708c2f401060cbf1bfa0663ee8687c451a15 languageName: node linkType: hard -"@opentelemetry/instrumentation-ioredis@npm:^0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/instrumentation-ioredis@npm:0.44.0" +"@opentelemetry/instrumentation-ioredis@npm:^0.46.0": + version: 0.46.0 + resolution: "@opentelemetry/instrumentation-ioredis@npm:0.46.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/redis-common": ^0.36.2 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 774e7cfdf6cd96e6f88a671fdd2d43fdf4591b5e821820971d91cc2b3a83b01c8cf56297fbd5d4578c2b2b8e404c4426222de09198da9915eb6cc9e4b3489636 + checksum: 02a816026d950726562104be37a434b13174fea5120639462a43d70dc011a4c334f402ff5d763a986aa3795d0c9ee9fc200d41ae77b57ea55a4eca14068216f4 languageName: node linkType: hard -"@opentelemetry/instrumentation-kafkajs@npm:^0.4.0": - version: 0.4.0 - resolution: "@opentelemetry/instrumentation-kafkajs@npm:0.4.0" +"@opentelemetry/instrumentation-kafkajs@npm:^0.6.0": + version: 0.6.0 + resolution: "@opentelemetry/instrumentation-kafkajs@npm:0.6.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 23d8d8aa2945f372aaab8ab9a583821339c523d8203090e29652eb90c9600fc273e131d5a0b9464fe09cacde6b35f44e3046effa1b20f936a064872ba18352ec + checksum: 169877945296fa042b5468e25759a67dc81d169a7a4f22ee142e8e9bf0a9d82219397500596060554324f1a9a89c9843ac68633830cec11c99e838fd37d997f5 languageName: node linkType: hard -"@opentelemetry/instrumentation-knex@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-knex@npm:0.41.0" +"@opentelemetry/instrumentation-knex@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation-knex@npm:0.43.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: c3b463e2b909a1d82a789f7cb5477efd60857f18ffb088903bf4bc06cd237f249e16b29338bebd7c16f72dd49ed61251f57cf81af2cc7708ebf37e628f27eafd + checksum: e31af57cb7f3f24ec5ac0748eba0e785e3bb2bb7ad5cdaec2af1f37a077a73ea4b545521450fb5ddfceff3dd8388abbe660959a43222bb2252a155354c346c0b languageName: node linkType: hard -"@opentelemetry/instrumentation-koa@npm:^0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/instrumentation-koa@npm:0.44.0" +"@opentelemetry/instrumentation-koa@npm:^0.46.0": + version: 0.46.0 + resolution: "@opentelemetry/instrumentation-koa@npm:0.46.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 09d8a87e874d9d5050a5f866fbd9ac90bc432c3934f99f68acc11a3936dc594097c31ba9622afeb4b5fc379a255f6e331b978935b360f918e784b27e1de70234 + checksum: b22a6cc9036b0766b5ea2fd8078944877d22cac916d310123af12f317a78b898039dd3ca788cccfce018ec2f6e6220850573ea006cdce1205dc858526fb6a6f9 languageName: node linkType: hard -"@opentelemetry/instrumentation-lru-memoizer@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-lru-memoizer@npm:0.41.0" +"@opentelemetry/instrumentation-lru-memoizer@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation-lru-memoizer@npm:0.43.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 409c13e0e095fbbfdef0d001b4b881fc1cf470eab97e9c391e51b0f0e185ecfebf2b03487b30aed3aab77ad600944525375fdd276e5b763be7bb1b1903e8a553 + checksum: a7c52fe37c25acab54d64d9d8944477925bce311d08794eb5fbe5e75e7d66ee00585f37c331a489f62947b511b3089b8848ff2de2954a49cc7a1c3cb58dd7ede languageName: node linkType: hard -"@opentelemetry/instrumentation-memcached@npm:^0.40.0": - version: 0.40.0 - resolution: "@opentelemetry/instrumentation-memcached@npm:0.40.0" +"@opentelemetry/instrumentation-memcached@npm:^0.42.0": + version: 0.42.0 + resolution: "@opentelemetry/instrumentation-memcached@npm:0.42.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@types/memcached": ^2.2.6 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: e33438c31ea6482382013603c0a81b2247757fe46fc433dbf7ca9c9577ef61175a7ff7d9a2d1560c0a4b6382616fa3a6bce3c21f82a7072cc5d27b4bb2a14efc + checksum: 80bd1c3d5d14fb738b061dd61ff41950e146797ad18775da862d8e35401335e7506b33d3f9682235e5dcfed2371e4b2fe7cddad3b22aa1db588f47b6356325f9 languageName: node linkType: hard -"@opentelemetry/instrumentation-mongodb@npm:^0.48.0": - version: 0.48.0 - resolution: "@opentelemetry/instrumentation-mongodb@npm:0.48.0" +"@opentelemetry/instrumentation-mongodb@npm:^0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/instrumentation-mongodb@npm:0.50.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 910925d26cf7af63001c483c790deb75365bdeb314ecbf8d84b908eea4d3ecb1025a53b0f86a903c367a538a47756e423d6f697418782dc84d06dff49b483494 + checksum: 4d7c1823a3de297f8c68e1669792fa007028346eeb005103dc66d70a7f0cdb5bce323b97e4e247b7aa50e2a830b1c645ab718da432b319c31f3d714f85f1e629 languageName: node linkType: hard -"@opentelemetry/instrumentation-mongoose@npm:^0.43.0": - version: 0.43.0 - resolution: "@opentelemetry/instrumentation-mongoose@npm:0.43.0" +"@opentelemetry/instrumentation-mongoose@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-mongoose@npm:0.45.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 2eced33f6262e7eb47113cdbe2d518e719bcfb5f570a195d70f0cdf916baf87165bb527487c9bef8c2d67ae6f963bfb50c98f706b3724d0ebae6c27ec576e965 + checksum: 3288fdaa0bc141609f54fad75275d8e1bfaf55dafdce63dd54db76cf0eb955fdcf1788d475c577156138880120fcc179f55f55b7849636b228d8f482b2aa024c languageName: node linkType: hard -"@opentelemetry/instrumentation-mysql2@npm:^0.42.1": - version: 0.42.1 - resolution: "@opentelemetry/instrumentation-mysql2@npm:0.42.1" +"@opentelemetry/instrumentation-mysql2@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-mysql2@npm:0.44.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@opentelemetry/sql-common": ^0.40.1 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 421f5c44102f74e3439c72bb58a341a69956e8f8f9ea04eb1d5f951003119d4124a23a75509ea2264380bc8c9321579fc24a8424a313c961b5b16365305c0644 + checksum: 72d5b5658d39d5f92ff5b8c1771d8d6ed28979b4d7fb16121dd5a6d76fd231cae364d162bf04a83de3682e149f829766a61c2715eb9959b34ee8ac303cb724c2 languageName: node linkType: hard -"@opentelemetry/instrumentation-mysql@npm:^0.42.0": - version: 0.42.0 - resolution: "@opentelemetry/instrumentation-mysql@npm:0.42.0" +"@opentelemetry/instrumentation-mysql@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-mysql@npm:0.44.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@types/mysql": 2.15.26 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 27ed48852ede4380499c6fde38103c9e9775b59e3f7f08ff48757eea93308c9305fb5d441bb17ddcd8003bbc35179a4da9a5fd8e6dfcfc855a0dbb83c5e38929 + checksum: a1c55777fef8b8aa349f16a0c5f511bc06f553e6ac1d316a0cd768f49d92d1f75cdabce73d5a2e5590588773bae93521953eb27bf04444105a3727dfd8e10788 languageName: node linkType: hard -"@opentelemetry/instrumentation-nestjs-core@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-nestjs-core@npm:0.41.0" +"@opentelemetry/instrumentation-nestjs-core@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation-nestjs-core@npm:0.43.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 2fb0365dbc6c6aa83953039698e2df339517bcf797d376e6a0bde2b857dccb1dd5799559cf7f2532f8d794227069663f7fbe0cab2f2e0cddaccc5ad99e74148c + checksum: f967f3f96ce6bf402f5acd9cedefca6f0548bbc786fc849e07a6229c3a7b16ce7b05cd864657ec1af2a8285ea9ea58c4199e8ec2610d115b85db7e4c50a5c1e6 languageName: node linkType: hard -"@opentelemetry/instrumentation-net@npm:^0.40.0": - version: 0.40.0 - resolution: "@opentelemetry/instrumentation-net@npm:0.40.0" +"@opentelemetry/instrumentation-net@npm:^0.42.0": + version: 0.42.0 + resolution: "@opentelemetry/instrumentation-net@npm:0.42.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 88821c24332532f1100fe2b2dd80a5ac5246595a4e5b8d51a8d2909918f8c4cab52a7bba2f9db616ffac268ff44e30a111bc20ac7cc94dd8f55b918b81723383 + checksum: ebad2b908081f1c69a07b14ee273958216845e197d7059bee51eb1a12701c2c1406d6a0ad989c27300b7563166808bb1557a54419850f7c40fecf602ee1132ac languageName: node linkType: hard -"@opentelemetry/instrumentation-pg@npm:^0.47.1": - version: 0.47.1 - resolution: "@opentelemetry/instrumentation-pg@npm:0.47.1" +"@opentelemetry/instrumentation-pg@npm:^0.49.0": + version: 0.49.0 + resolution: "@opentelemetry/instrumentation-pg@npm:0.49.0" dependencies: "@opentelemetry/core": ^1.26.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": 1.27.0 "@opentelemetry/sql-common": ^0.40.1 "@types/pg": 8.6.1 "@types/pg-pool": 2.0.6 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: eec188f1c41456e044842d7aa89f9bb4ba7755906292666949ccb4add37ecad3b28abb17f4f736f72be78ec99b68ad797ba4a57dbfb4c1e07eb18ce5283b8e1d + checksum: a91ab43d5cc3e1ead331125207b1447edcfb9cfc13a7b3eced2b9965236b3b76bdbe43dc91a634c0253afdfc7996f6286b7e1748c63d82848b64a4d060df19d8 languageName: node linkType: hard -"@opentelemetry/instrumentation-pino@npm:^0.43.0": - version: 0.43.0 - resolution: "@opentelemetry/instrumentation-pino@npm:0.43.0" +"@opentelemetry/instrumentation-pino@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-pino@npm:0.45.0" dependencies: - "@opentelemetry/api-logs": ^0.54.0 + "@opentelemetry/api-logs": ^0.56.0 "@opentelemetry/core": ^1.25.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 76efd25275edb0159057ac90fc3152dd9e76640a4e4986bbd6065c0d3dd2ece043817260e4230e203dffcf9f962f11f379bb4e35aed95c537679d6c0b026f4d3 + checksum: 4c3393b9bfd60b04baf9640763aa5f2873926384ec243d075fcd5f4000025453aa310cc523f946bc12a464c7aa084f6b8f88dd4bd257450486bd8603b0d2c6d6 languageName: node linkType: hard -"@opentelemetry/instrumentation-redis-4@npm:^0.43.0": - version: 0.43.0 - resolution: "@opentelemetry/instrumentation-redis-4@npm:0.43.0" +"@opentelemetry/instrumentation-redis-4@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-redis-4@npm:0.45.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/redis-common": ^0.36.2 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: eb0dbedcccaca2a98cdefe741f14613a2de89c53dfd4393bbbfd97b341a2754c7c88d868429754bb9bf3dbcf17c2610d0070898bfe14b4dd9e5830d0f0c2e5f7 + checksum: d6a3f657d4c81c80b83b3c7f95d4d59fcb65dfd56ccc4da12bbe32d67837b6a91aa87d49373302a82dccc9c62a6090fefbcb1bc650e2858a70f3667df7a8ded7 languageName: node linkType: hard -"@opentelemetry/instrumentation-redis@npm:^0.43.0": - version: 0.43.0 - resolution: "@opentelemetry/instrumentation-redis@npm:0.43.0" +"@opentelemetry/instrumentation-redis@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-redis@npm:0.45.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/redis-common": ^0.36.2 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: ce0032edec122cd4feb0cfa5c365098c66858dc462dbb3cf95f36a24321460a1eddbe93552249bc9f43ce1b0692f88e971a2a432c26843d40776340debae48db + checksum: 7e0c9de80bc785c5e8bf83cb21a5647d24b512cd50d82f6b6e7b64267e49cfa02557dddb40eba13ca722dcb634a49ce82e1c9898d17f5fffe7bc3dd768cbb507 languageName: node linkType: hard -"@opentelemetry/instrumentation-restify@npm:^0.42.0": - version: 0.42.0 - resolution: "@opentelemetry/instrumentation-restify@npm:0.42.0" +"@opentelemetry/instrumentation-restify@npm:^0.44.0": + version: 0.44.0 + resolution: "@opentelemetry/instrumentation-restify@npm:0.44.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 19ae0540538b1150b802c03ea4e4cf65c66230518b4396d75e4abf570350ca69b591eb45bc30a3282df4a157057ac5eb85614715d49c7b225f3ae90b6c43e740 + checksum: 98ef2da10c5faa03db17032399565343dd2fbfbb70788cb7112653ed8ebe2a7920ec50416c9a7b406f239b9363e5ec49e8e56519f224ece6e63f4aaa193fc5ed languageName: node linkType: hard -"@opentelemetry/instrumentation-router@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-router@npm:0.41.0" - dependencies: - "@opentelemetry/instrumentation": ^0.54.0 - "@opentelemetry/semantic-conventions": ^1.27.0 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 2291f8f7ab314e0e12d5dcc1ec6efcade2ce662a5e9214390a89689513b6742a4be71227c7076ff49061049a622ba924cb0905198bdd3343a7bb1c02ed3c1a46 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-socket.io@npm:^0.43.0": +"@opentelemetry/instrumentation-router@npm:^0.43.0": version: 0.43.0 - resolution: "@opentelemetry/instrumentation-socket.io@npm:0.43.0" + resolution: "@opentelemetry/instrumentation-router@npm:0.43.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 1805d39201cb2f00e9765017c4e037faf1fa54d6f6cef2dcbbb5f07e90dc94d694736bbddb8c41b3bc8db0411b7e43b2d1d008342aaaa27302620617622b0ff5 + checksum: c1045bd51631a5d1c4654a0b7c3c4a2ab2c2bca331e840bf16ab31ecf2a34effd3366db44e679c534b51232120f1ae0ea7bf4d04cbdfd3e6ea736a9133d4f348 languageName: node linkType: hard -"@opentelemetry/instrumentation-tedious@npm:^0.15.0": - version: 0.15.0 - resolution: "@opentelemetry/instrumentation-tedious@npm:0.15.0" +"@opentelemetry/instrumentation-socket.io@npm:^0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation-socket.io@npm:0.45.0" dependencies: - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 + "@opentelemetry/semantic-conventions": ^1.27.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 0849eb3118ba223aaff324eda86d5b519e85ba24d66c1027dbd2e669fe94ee05d7f292f10e9ef8aa85b96e7e4bcb6934d796a3380c3e2835240d772df69806ce + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-tedious@npm:^0.17.0": + version: 0.17.0 + resolution: "@opentelemetry/instrumentation-tedious@npm:0.17.0" + dependencies: + "@opentelemetry/instrumentation": ^0.56.0 "@opentelemetry/semantic-conventions": ^1.27.0 "@types/tedious": ^4.0.14 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 75ece9a359c81cdf31eb3e16be570418775817ff2b7b315e49fcc5d2365f635e0fb2af734de029f4d2faa720c3d977325d5e636d69008fb64b53afb6544bb67f + checksum: d4179b6d2010455cb00abf4a64d2276b10db8d572bf15454d62d458a9ca4b54a9df29d16fb455b3936868f5f64b2f69c8112d467efcf02e447172c0d2caa6f22 languageName: node linkType: hard -"@opentelemetry/instrumentation-undici@npm:^0.7.1": - version: 0.7.1 - resolution: "@opentelemetry/instrumentation-undici@npm:0.7.1" +"@opentelemetry/instrumentation-undici@npm:^0.9.0": + version: 0.9.0 + resolution: "@opentelemetry/instrumentation-undici@npm:0.9.0" dependencies: "@opentelemetry/core": ^1.8.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.7.0 - checksum: a086224407d814c3a7476a09be8ec5b46ea743d21583821381a8efc4e12a05091c5bab4a6738b8019a01df71026afdd4243830615ec21ba261d3b1df07444cf8 + checksum: f64615394a511e1aeb88a2095940832b9f6bfa1244c8736234b9a4108da81d227cf8a7218216df30333918cc07b336fe8559fb127de6afc2cbfaa5ed7a49ee86 languageName: node linkType: hard -"@opentelemetry/instrumentation-winston@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/instrumentation-winston@npm:0.41.0" +"@opentelemetry/instrumentation-winston@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation-winston@npm:0.43.0" dependencies: - "@opentelemetry/api-logs": ^0.54.0 - "@opentelemetry/instrumentation": ^0.54.0 + "@opentelemetry/api-logs": ^0.56.0 + "@opentelemetry/instrumentation": ^0.56.0 peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10d2769925ae9a9982c8da9bb81c6e121f9c1c3437ac99216eb8c68fddea8a3527b5f9acfb09275646e3bc05183bf5bd2b719576756fa40ea3b98a6950a7533f + checksum: f8eafb7d943956f8daf0b432fce421fd85ac910f499f9bb6ec6fe048caafa33705d793c6fe8c6c969ba22951f888553f8862bef13f1cae78ef43d8f402173785 languageName: node linkType: hard -"@opentelemetry/instrumentation@npm:0.54.1": - version: 0.54.1 - resolution: "@opentelemetry/instrumentation@npm:0.54.1" - dependencies: - "@opentelemetry/api-logs": 0.54.1 - "@types/shimmer": ^1.2.0 - import-in-the-middle: ^1.8.1 - require-in-the-middle: ^7.1.1 - semver: ^7.5.2 - shimmer: ^1.2.1 - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 3109540b953aa8d06c8e57882c9af240be475a28d7a3245de8d93667997e70c2a528b72f75af8faaa82436690068aa8a6caaa65ca0aa329429d0b3c9ae6e703e - languageName: node - linkType: hard - -"@opentelemetry/instrumentation@npm:0.54.2, @opentelemetry/instrumentation@npm:^0.54.0": +"@opentelemetry/instrumentation@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/instrumentation@npm:0.54.2" dependencies: @@ -14384,6 +14558,22 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/instrumentation@npm:0.56.0, @opentelemetry/instrumentation@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/instrumentation@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@types/shimmer": ^1.2.0 + import-in-the-middle: ^1.8.1 + require-in-the-middle: ^7.1.1 + semver: ^7.5.2 + shimmer: ^1.2.1 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 2c0cf2c91a5ac36a9e95978bfcc92ed9e770d93346fb87cc6e62ca7e028b219695e921142eef3ff5541bdfb9045996817bd7cefdb668e0419a27abde4854d2e0 + languageName: node + linkType: hard + "@opentelemetry/otlp-exporter-base@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/otlp-exporter-base@npm:0.54.2" @@ -14396,6 +14586,18 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/otlp-exporter-base@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/otlp-exporter-base@npm:0.56.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-transformer": 0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 19537be39eed2969003f244de9f0616af5fae4dbfceaf24918b9f051ab906817f1c32a657d9b548c4c24742eb45c48a21b75cd2bee0b33068cedb0b592a002ae + languageName: node + linkType: hard + "@opentelemetry/otlp-grpc-exporter-base@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.54.2" @@ -14410,6 +14612,20 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/otlp-grpc-exporter-base@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.56.0" + dependencies: + "@grpc/grpc-js": ^1.7.1 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/otlp-exporter-base": 0.56.0 + "@opentelemetry/otlp-transformer": 0.56.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: d2188bd77c192df2a72cdf2bc3e219da26b599e03eb4ca32ab76eac83419ddb0729efe472e756a0c00500a071e10940d0f06e63ff879ced5204cce4213ba2598 + languageName: node + linkType: hard + "@opentelemetry/otlp-transformer@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/otlp-transformer@npm:0.54.2" @@ -14427,12 +14643,29 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/propagation-utils@npm:^0.30.12": - version: 0.30.12 - resolution: "@opentelemetry/propagation-utils@npm:0.30.12" +"@opentelemetry/otlp-transformer@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/otlp-transformer@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-logs": 0.56.0 + "@opentelemetry/sdk-metrics": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + protobufjs: ^7.3.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 3b95605194f126be450fd7b5a7522a08bb563f716a43c863e21f7c5e4175101833a94d8f0955e1181ce75211e2b2acfe8691efd0302afa7b41d8b26ddaba3a10 + languageName: node + linkType: hard + +"@opentelemetry/propagation-utils@npm:^0.30.14": + version: 0.30.14 + resolution: "@opentelemetry/propagation-utils@npm:0.30.14" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 1bf6b1a9d00ab0950768f4acb2ccf888592aecfcffde1554b55ffd28c50025920de2725c20f07307b8f4c189c95c413f74b84edb088df3e1d8ce182e83b5cf36 + checksum: 2f7ddc71d39b4d095973087b437191d276fea341750d8e1843da230f83bef9779ca61fe70515bb7a8b8e45671d069ce910ad0d578110860cf08b211fc514801a languageName: node linkType: hard @@ -14447,6 +14680,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/propagator-b3@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/propagator-b3@npm:1.29.0" + dependencies: + "@opentelemetry/core": 1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 36720d2f4572c45d80149dda1cf1000cd6da8baf7bf1679fa4a58b000668837133b9ab9d8fad93af4752bcc14946364a41ad5e71c0262e4dcdcb43926132df6d + languageName: node + linkType: hard + "@opentelemetry/propagator-jaeger@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/propagator-jaeger@npm:1.27.0" @@ -14458,6 +14702,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/propagator-jaeger@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/propagator-jaeger@npm:1.29.0" + dependencies: + "@opentelemetry/core": 1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: eb19ad74c16ef2bd7805f06cf3c6e5ab654889c49221678be75933c45f47d6b496343947b364ec57860d8d9432ce5542d6ac43f8bd0d153b9b47f251abff6653 + languageName: node + linkType: hard + "@opentelemetry/redis-common@npm:^0.36.2": version: 0.36.2 resolution: "@opentelemetry/redis-common@npm:0.36.2" @@ -14465,61 +14720,61 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/resource-detector-alibaba-cloud@npm:^0.29.4": - version: 0.29.4 - resolution: "@opentelemetry/resource-detector-alibaba-cloud@npm:0.29.4" +"@opentelemetry/resource-detector-alibaba-cloud@npm:^0.29.6": + version: 0.29.6 + resolution: "@opentelemetry/resource-detector-alibaba-cloud@npm:0.29.6" dependencies: "@opentelemetry/core": ^1.26.0 "@opentelemetry/resources": ^1.10.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 78d4100e8dfb814a6ea35c2b9ef12fd93d402ffab93d7a592f3c2d486392e281cd751c2312482e75440eab3a6cd235866c5b14993bf6f6a12a9f3ade91ed3539 + checksum: d8cef13063b0e674fb581312c4fdeab41c95829d72f8a0971e49a8ea667fcd0bd235fb6e44f248412205bf9dfb8c307aeb3af11ade482f19864e0b4eb16d863d languageName: node linkType: hard -"@opentelemetry/resource-detector-aws@npm:^1.7.0": - version: 1.7.0 - resolution: "@opentelemetry/resource-detector-aws@npm:1.7.0" +"@opentelemetry/resource-detector-aws@npm:^1.9.0": + version: 1.9.0 + resolution: "@opentelemetry/resource-detector-aws@npm:1.9.0" dependencies: "@opentelemetry/core": ^1.0.0 "@opentelemetry/resources": ^1.10.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: cbe754b5ea525064478e572a73d05979f6bc8d9bf5b063d3ea104545f0e50e04fbc0ae1376bb2543262d20ef2aad9388b1ff0e485d96ac1446efbc542ab8d818 + checksum: 11d8a3a4ffb66124f420f800488dfb1e46eed3ff9328693ee47b5ba65638c4f2ac16ac2b6e9edcd271d1a35bcc9044766daa17754d9f95f1ebbba10ec63507e4 languageName: node linkType: hard -"@opentelemetry/resource-detector-azure@npm:^0.2.12": - version: 0.2.12 - resolution: "@opentelemetry/resource-detector-azure@npm:0.2.12" +"@opentelemetry/resource-detector-azure@npm:^0.4.0": + version: 0.4.0 + resolution: "@opentelemetry/resource-detector-azure@npm:0.4.0" dependencies: "@opentelemetry/core": ^1.25.1 "@opentelemetry/resources": ^1.10.1 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: b0a170ac928248021ea6b63bea1f25d670bb3c2a0260eae115097d84461732ff602a65f56ef84651ae1e70be3e9729ae5068c3038732a009ec2e3a2d1eccce40 + checksum: 1dce98349bc0bcaaf933f8e243026bb7d93f872ce08f3bd214ecc0125dad27afd84b607f0aae50c18316d10efa755c7e8c0b71a5a728408dacee71df2c8f02f6 languageName: node linkType: hard -"@opentelemetry/resource-detector-container@npm:^0.5.0": - version: 0.5.0 - resolution: "@opentelemetry/resource-detector-container@npm:0.5.0" +"@opentelemetry/resource-detector-container@npm:^0.5.2": + version: 0.5.2 + resolution: "@opentelemetry/resource-detector-container@npm:0.5.2" dependencies: "@opentelemetry/core": ^1.26.0 "@opentelemetry/resources": ^1.10.0 "@opentelemetry/semantic-conventions": ^1.27.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 912762621d55ddffe69b6ba3f5c470cbb9bf3a465303d9f3ab542d9fd2dbe660927cb173783397b47f11588f60c66ec06ff1572d7bcf72ff6da10bc4f1fdd4d0 + checksum: 7d09a68f0e6f3f455f075e499eb5229f8f561124813b55a727e17d7de7c430470906634d97265a365971ffec67c70f0a3271b4e6c25ade8a65a48f9668c67c68 languageName: node linkType: hard -"@opentelemetry/resource-detector-gcp@npm:^0.29.13": - version: 0.29.13 - resolution: "@opentelemetry/resource-detector-gcp@npm:0.29.13" +"@opentelemetry/resource-detector-gcp@npm:^0.31.0": + version: 0.31.0 + resolution: "@opentelemetry/resource-detector-gcp@npm:0.31.0" dependencies: "@opentelemetry/core": ^1.0.0 "@opentelemetry/resources": ^1.10.0 @@ -14527,11 +14782,11 @@ __metadata: gcp-metadata: ^6.0.0 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 64d6995f3775a599985e5787276d81f1aeefa3352017965a797c3b33196f155eb3886633d1b22974aa1cae7425eff9229b4b8c0eb9ed7a454e50e1f94f1fed31 + checksum: d62de94728ca67f03d9aa75a8a291285061cb058a8f245c2ca7b4a8e92e8c480e9958cc9dfd4550ba39475c5f06e0a692e19f6c0762f02005b617622082e3cc1 languageName: node linkType: hard -"@opentelemetry/resources@npm:1.27.0, @opentelemetry/resources@npm:^1.10.0, @opentelemetry/resources@npm:^1.10.1, @opentelemetry/resources@npm:^1.24.0": +"@opentelemetry/resources@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/resources@npm:1.27.0" dependencies: @@ -14543,6 +14798,18 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/resources@npm:1.29.0, @opentelemetry/resources@npm:^1.10.0, @opentelemetry/resources@npm:^1.10.1, @opentelemetry/resources@npm:^1.24.0": + version: 1.29.0 + resolution: "@opentelemetry/resources@npm:1.29.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/semantic-conventions": 1.28.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: dfa68245089fe4eb8983503539e2109753fd232d769f8bba675c3277ababde88b4e7d60af7ed34a7529a021af0f0df457e3782563597a58ba0599f0161b502b2 + languageName: node + linkType: hard + "@opentelemetry/sdk-logs@npm:0.54.2": version: 0.54.2 resolution: "@opentelemetry/sdk-logs@npm:0.54.2" @@ -14556,6 +14823,19 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-logs@npm:0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/sdk-logs@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/resources": 1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.4.0 <1.10.0" + checksum: f0aed974f93a1b4e21a8d8a4fdc1ae87defe1f7b45dc58f56bb5d7bd41d0dc400ca9bb28af72b193baa4ddef4a1ec1168aee17aa4bf62c58caf1070e521ddfe2 + languageName: node + linkType: hard + "@opentelemetry/sdk-metrics@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/sdk-metrics@npm:1.27.0" @@ -14568,6 +14848,18 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-metrics@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/sdk-metrics@npm:1.29.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/resources": 1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.10.0" + checksum: 036f2da0adff7ffd69cd2b7892b81ef4dcd0caa0c3d176dbfec9282a004f56af46956b66949f8e3ce27db589c99fa56a996e3854599979fa35dab876109f533a + languageName: node + linkType: hard + "@opentelemetry/sdk-node@npm:^0.54.0": version: 0.54.2 resolution: "@opentelemetry/sdk-node@npm:0.54.2" @@ -14594,6 +14886,32 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-node@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/sdk-node@npm:0.56.0" + dependencies: + "@opentelemetry/api-logs": 0.56.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/exporter-logs-otlp-grpc": 0.56.0 + "@opentelemetry/exporter-logs-otlp-http": 0.56.0 + "@opentelemetry/exporter-logs-otlp-proto": 0.56.0 + "@opentelemetry/exporter-trace-otlp-grpc": 0.56.0 + "@opentelemetry/exporter-trace-otlp-http": 0.56.0 + "@opentelemetry/exporter-trace-otlp-proto": 0.56.0 + "@opentelemetry/exporter-zipkin": 1.29.0 + "@opentelemetry/instrumentation": 0.56.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/sdk-logs": 0.56.0 + "@opentelemetry/sdk-metrics": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + "@opentelemetry/sdk-trace-node": 1.29.0 + "@opentelemetry/semantic-conventions": 1.28.0 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.10.0" + checksum: f3261c1bf8a43f4a45bdc08fc80abf2abc9e0f59fbe557f7b6109078cfbd4bebfdd7c4289a907d02d0d2ef944efb72647718a68a3feb6c9676345ffbfe4e90bb + languageName: node + linkType: hard + "@opentelemetry/sdk-trace-base@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/sdk-trace-base@npm:1.27.0" @@ -14607,6 +14925,19 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-trace-base@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/sdk-trace-base@npm:1.29.0" + dependencies: + "@opentelemetry/core": 1.29.0 + "@opentelemetry/resources": 1.29.0 + "@opentelemetry/semantic-conventions": 1.28.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 750aa58f5323bda8391213d5bdabadbf2dfb28462198b87f7f41586fa7825cccfd04bdb1c199d3fd368f9837ba7d5f890cae1f7f5d29ec2aeb9e2b7f6a88ba37 + languageName: node + linkType: hard + "@opentelemetry/sdk-trace-node@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/sdk-trace-node@npm:1.27.0" @@ -14623,13 +14954,36 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:1.27.0, @opentelemetry/semantic-conventions@npm:^1.27.0": +"@opentelemetry/sdk-trace-node@npm:1.29.0": + version: 1.29.0 + resolution: "@opentelemetry/sdk-trace-node@npm:1.29.0" + dependencies: + "@opentelemetry/context-async-hooks": 1.29.0 + "@opentelemetry/core": 1.29.0 + "@opentelemetry/propagator-b3": 1.29.0 + "@opentelemetry/propagator-jaeger": 1.29.0 + "@opentelemetry/sdk-trace-base": 1.29.0 + semver: ^7.5.2 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: f55a0ca916482d97227529783aa8506ab569a8835c0d39baadf93451e06b5eb44dbe8399be78ff080a89b24ab9a582d0fc1c5163bba641cbc4383a0f3da5f8b3 + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:1.27.0": version: 1.27.0 resolution: "@opentelemetry/semantic-conventions@npm:1.27.0" checksum: 26d85f8d13c8c64024f7a84528cff41d56afc9829e7ff8a654576404f8b2c1a9c264adcc6fa5a9551bacdd938a4a464041fa9493e0a722e5605f2c2ae6752398 languageName: node linkType: hard +"@opentelemetry/semantic-conventions@npm:1.28.0, @opentelemetry/semantic-conventions@npm:^1.27.0": + version: 1.28.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.28.0" + checksum: 1d708afa654990236cdb6b5da84f7ab899b70bff9f753bc49d93616a5c7f7f339ba1eba6a9fbb57dee596995334f4e7effa57a4624741882ab5b3c419c3511e2 + languageName: node + linkType: hard + "@opentelemetry/sql-common@npm:^0.40.1": version: 0.40.1 resolution: "@opentelemetry/sql-common@npm:0.40.1" @@ -14641,14 +14995,16 @@ __metadata: languageName: node linkType: hard -"@oriflame/backstage-plugin-score-card@npm:^0.8.0": - version: 0.8.0 - resolution: "@oriflame/backstage-plugin-score-card@npm:0.8.0" +"@oriflame/backstage-plugin-score-card@npm:^0.9.0": + version: 0.9.1 + resolution: "@oriflame/backstage-plugin-score-card@npm:0.9.1" dependencies: "@backstage/catalog-model": ^1.4.3 "@backstage/config": ^1.1.1 "@backstage/core-components": ^0.13.10 "@backstage/core-plugin-api": ^1.8.2 + "@backstage/integration": ^1.9.0 + "@backstage/integration-react": ^1.1.24 "@backstage/plugin-catalog-common": ^1.0.20 "@backstage/plugin-catalog-react": ^1.9.3 "@backstage/theme": ^0.5.0 @@ -14657,13 +15013,13 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.11.2 "@material-ui/lab": ^4.0.0-alpha.57 - "@types/react": ^18.0.0 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 react-use: ^17.2.4 peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - react-router-dom: ^6.4.3 - checksum: 4d1bf78b3fc6cce80b3cbc1abef5613bb609d2262e0d410aa57cc7e175eaf5cb727796ab61b44507f5c826b1f059f4ec03c280ce6cdbf7291d4461d745a9b5b6 + 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 + checksum: cebd9fd9f7d31e1b96765a02eefa2c817e401654bc28a40fe40236e0d79589760188e460797dbaf23ab56478120a60604403339267fb9ae9a9d23fcdfdb674a1 languageName: node linkType: hard @@ -14675,13 +15031,13 @@ __metadata: linkType: hard "@playwright/test@npm:^1.32.3": - version: 1.49.0 - resolution: "@playwright/test@npm:1.49.0" + version: 1.49.1 + resolution: "@playwright/test@npm:1.49.1" dependencies: - playwright: 1.49.0 + playwright: 1.49.1 bin: playwright: cli.js - checksum: f8477aa61d59fd22c6161c48221ab246340dc37bbe2804e1a7d1be8cbd0fd861747fcb7ca559f4bc7328226ff2c90ccb7efa588a7d7d7829f3e57902b28fe39a + checksum: cdbd16df3d773dc8e522d79b4b961e25c2e1b1d4f3ec45eb711078ab5d11bca47caafe833e2be2f923328fbd012405a9ee31d9b449d184077598546a36847e69 languageName: node linkType: hard @@ -15470,11 +15826,11 @@ __metadata: linkType: hard "@remixicon/react@npm:^4.5.0": - version: 4.5.0 - resolution: "@remixicon/react@npm:4.5.0" + version: 4.6.0 + resolution: "@remixicon/react@npm:4.6.0" peerDependencies: react: ">=18.2.0" - checksum: e37b61090954954601d35367a740b7be30c105a49f67eaa5a697db16d4668d71d9fd94b339da6d449a254736d5af3b567d3694021b79d3c82fe28afb818830bc + checksum: 81127617eff78fb97aff01dc392ebbafb69fbfe835270b4db8ee68844d02d8c47a42d312d72104708f7266d8ad005405ea1245a536e35b66305d00d56f20b9eb languageName: node linkType: hard @@ -15485,9 +15841,9 @@ __metadata: languageName: node linkType: hard -"@rjsf/core@npm:5.23.1": - version: 5.23.1 - resolution: "@rjsf/core@npm:5.23.1" +"@rjsf/core@npm:5.23.2": + version: 5.23.2 + resolution: "@rjsf/core@npm:5.23.2" dependencies: lodash: ^4.17.21 lodash-es: ^4.17.21 @@ -15497,26 +15853,26 @@ __metadata: peerDependencies: "@rjsf/utils": ^5.23.x react: ^16.14.0 || >=17 - checksum: acb5b1541b7e6f9911dce33455c297402fc1b2278b0c688073decdea977efae7d4227962eaadeb48fd14c2a8e4bba73a80df975b1c49aa2e2b933c2646ab4904 + checksum: 36b2505afd5402368a31a06a4b9d2264f63cab9766f2060cd3c3ecf8b4c08fc7fc8b1b82dd00788f357a2ca649d76c5b6e324152572dbf333bd2b93a0bcc99fd languageName: node linkType: hard -"@rjsf/material-ui@npm:5.23.1": - version: 5.23.1 - resolution: "@rjsf/material-ui@npm:5.23.1" +"@rjsf/material-ui@npm:5.23.2": + version: 5.23.2 + resolution: "@rjsf/material-ui@npm:5.23.2" peerDependencies: "@material-ui/core": ^4.12.3 "@material-ui/icons": ^4.11.2 "@rjsf/core": ^5.23.x "@rjsf/utils": ^5.23.x react: ^16.14.0 || >=17 - checksum: ae0d401edd407c534406cce60fda2725fc246286cbedd8a8e4031097d4d318761fd8a4f35339d0f3f857a3dc863b88a75002d6900176052913bb629d0ebde4f9 + checksum: 3c41a4d3133bfb1ddf2a9f96fdf6b44de7d16688133a5a69833b8a99044b499f1466d361e6e92e04b88d281ca9b1819905bafd01fee6f4e0329d111de0eb5c0a languageName: node linkType: hard -"@rjsf/utils@npm:5.23.1": - version: 5.23.1 - resolution: "@rjsf/utils@npm:5.23.1" +"@rjsf/utils@npm:5.23.2": + version: 5.23.2 + resolution: "@rjsf/utils@npm:5.23.2" dependencies: json-schema-merge-allof: ^0.8.1 jsonpointer: ^5.0.1 @@ -15525,13 +15881,13 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: 7580419cf07416fe1e608ed171c30b25b3a78cfebba7d97e3120fe2e40f702fd0e61494e6c823281091522b053a39a83ab31ceb97c078cfb39ac636dc2d997c1 + checksum: 16980013258bab7accaff961c533e4bb8e3326c37a84670a7667b2a10c1ca395451eb51a6cf819ccbafb1aa8838df325ff1f314b410bb186fef98856135e1a06 languageName: node linkType: hard -"@rjsf/validator-ajv8@npm:5.23.1": - version: 5.23.1 - resolution: "@rjsf/validator-ajv8@npm:5.23.1" +"@rjsf/validator-ajv8@npm:5.23.2": + version: 5.23.2 + resolution: "@rjsf/validator-ajv8@npm:5.23.2" dependencies: ajv: ^8.12.0 ajv-formats: ^2.1.1 @@ -15539,7 +15895,7 @@ __metadata: lodash-es: ^4.17.21 peerDependencies: "@rjsf/utils": ^5.23.x - checksum: 3eca428bd682ea8226558e0c719f263912ad8d6fde2c3ee817c5c106070fd3142f614dc35e15819000f8f00f9c00aa654c2dab5fd3a7318164ad6420d53068f5 + checksum: da6328ac6ddc448141dd183fa6447a0ff5b0bcc7c77c8fa4d9d0a35b59727095da72fb15b16ded6c1d3769ca19cadb781da6ebc23c7cb79f87c83bca5d58a0fb languageName: node linkType: hard @@ -15593,8 +15949,8 @@ __metadata: linkType: hard "@rollup/plugin-node-resolve@npm:^15.0.0": - version: 15.3.0 - resolution: "@rollup/plugin-node-resolve@npm:15.3.0" + version: 15.3.1 + resolution: "@rollup/plugin-node-resolve@npm:15.3.1" dependencies: "@rollup/pluginutils": ^5.0.1 "@types/resolve": 1.20.2 @@ -15606,7 +15962,7 @@ __metadata: peerDependenciesMeta: rollup: optional: true - checksum: 90e4e94b173e7edd57e374ac0cc0a69cc6f1b4507e83731132ac6fa1747d96a5648a48441e4452728429b6db5e67561439b7b2f4d2c6a941a33d38be56d871b4 + checksum: 2973db4da0e7ed97c35a8dd8878ed6b6781bcb03d72039f064d878f711b0290446348c5268aa1359d064787adc0d5cc35f662d35ea5a4fa9b0b3f9f17c678f41 languageName: node linkType: hard @@ -15778,82 +16134,82 @@ __metadata: languageName: node linkType: hard -"@rspack/binding-darwin-arm64@npm:1.1.5": - version: 1.1.5 - resolution: "@rspack/binding-darwin-arm64@npm:1.1.5" +"@rspack/binding-darwin-arm64@npm:1.1.8": + version: 1.1.8 + resolution: "@rspack/binding-darwin-arm64@npm:1.1.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-darwin-x64@npm:1.1.5": - version: 1.1.5 - resolution: "@rspack/binding-darwin-x64@npm:1.1.5" +"@rspack/binding-darwin-x64@npm:1.1.8": + version: 1.1.8 + resolution: "@rspack/binding-darwin-x64@npm:1.1.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rspack/binding-linux-arm64-gnu@npm:1.1.5": - version: 1.1.5 - resolution: "@rspack/binding-linux-arm64-gnu@npm:1.1.5" +"@rspack/binding-linux-arm64-gnu@npm:1.1.8": + version: 1.1.8 + resolution: "@rspack/binding-linux-arm64-gnu@npm:1.1.8" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-arm64-musl@npm:1.1.5": - version: 1.1.5 - resolution: "@rspack/binding-linux-arm64-musl@npm:1.1.5" +"@rspack/binding-linux-arm64-musl@npm:1.1.8": + version: 1.1.8 + resolution: "@rspack/binding-linux-arm64-musl@npm:1.1.8" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rspack/binding-linux-x64-gnu@npm:1.1.5": - version: 1.1.5 - resolution: "@rspack/binding-linux-x64-gnu@npm:1.1.5" +"@rspack/binding-linux-x64-gnu@npm:1.1.8": + version: 1.1.8 + resolution: "@rspack/binding-linux-x64-gnu@npm:1.1.8" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-x64-musl@npm:1.1.5": - version: 1.1.5 - resolution: "@rspack/binding-linux-x64-musl@npm:1.1.5" +"@rspack/binding-linux-x64-musl@npm:1.1.8": + version: 1.1.8 + resolution: "@rspack/binding-linux-x64-musl@npm:1.1.8" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rspack/binding-win32-arm64-msvc@npm:1.1.5": - version: 1.1.5 - resolution: "@rspack/binding-win32-arm64-msvc@npm:1.1.5" +"@rspack/binding-win32-arm64-msvc@npm:1.1.8": + version: 1.1.8 + resolution: "@rspack/binding-win32-arm64-msvc@npm:1.1.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-win32-ia32-msvc@npm:1.1.5": - version: 1.1.5 - resolution: "@rspack/binding-win32-ia32-msvc@npm:1.1.5" +"@rspack/binding-win32-ia32-msvc@npm:1.1.8": + version: 1.1.8 + resolution: "@rspack/binding-win32-ia32-msvc@npm:1.1.8" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rspack/binding-win32-x64-msvc@npm:1.1.5": - version: 1.1.5 - resolution: "@rspack/binding-win32-x64-msvc@npm:1.1.5" +"@rspack/binding-win32-x64-msvc@npm:1.1.8": + version: 1.1.8 + resolution: "@rspack/binding-win32-x64-msvc@npm:1.1.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rspack/binding@npm:1.1.5": - version: 1.1.5 - resolution: "@rspack/binding@npm:1.1.5" +"@rspack/binding@npm:1.1.8": + version: 1.1.8 + resolution: "@rspack/binding@npm:1.1.8" dependencies: - "@rspack/binding-darwin-arm64": 1.1.5 - "@rspack/binding-darwin-x64": 1.1.5 - "@rspack/binding-linux-arm64-gnu": 1.1.5 - "@rspack/binding-linux-arm64-musl": 1.1.5 - "@rspack/binding-linux-x64-gnu": 1.1.5 - "@rspack/binding-linux-x64-musl": 1.1.5 - "@rspack/binding-win32-arm64-msvc": 1.1.5 - "@rspack/binding-win32-ia32-msvc": 1.1.5 - "@rspack/binding-win32-x64-msvc": 1.1.5 + "@rspack/binding-darwin-arm64": 1.1.8 + "@rspack/binding-darwin-x64": 1.1.8 + "@rspack/binding-linux-arm64-gnu": 1.1.8 + "@rspack/binding-linux-arm64-musl": 1.1.8 + "@rspack/binding-linux-x64-gnu": 1.1.8 + "@rspack/binding-linux-x64-musl": 1.1.8 + "@rspack/binding-win32-arm64-msvc": 1.1.8 + "@rspack/binding-win32-ia32-msvc": 1.1.8 + "@rspack/binding-win32-x64-msvc": 1.1.8 dependenciesMeta: "@rspack/binding-darwin-arm64": optional: true @@ -15873,16 +16229,16 @@ __metadata: optional: true "@rspack/binding-win32-x64-msvc": optional: true - checksum: 6fe7d4cd04613c8c25d1e5eabf97abd82c721ec68f787150eab3026ef01830043e9c062851a286618106cadca759fc55929ec39b85b12e21025cffd39655dfc6 + checksum: 5cd8334d20bd02ccc269a72e960ff01722eb6cc38e0b5b000c9a5d97e6ea7fcf599d8367a08fa7bfc1ddb2745630b0459ef53bc450b66f930e25df2d9b90d5b2 languageName: node linkType: hard "@rspack/core@npm:^1.0.10": - version: 1.1.5 - resolution: "@rspack/core@npm:1.1.5" + version: 1.1.8 + resolution: "@rspack/core@npm:1.1.8" dependencies: "@module-federation/runtime-tools": 0.5.1 - "@rspack/binding": 1.1.5 + "@rspack/binding": 1.1.8 "@rspack/lite-tapable": 1.0.1 caniuse-lite: ^1.0.30001616 peerDependencies: @@ -15890,13 +16246,13 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 795da019b01555f7f3035ee1c80f39d808ddd1a6043aa2ab8caa3c42e3f73f966fb581bcb9c959852fd31d52ea8f89e2a135c8fa29c31cb7effa7d237a854520 + checksum: be6a4fcb887bc5fb3b9723d9600d295ea322cd8201c1ddd105a8574b4633fe5c504fb7d7841173a5bebddd2e88f87a09944e1b515c62fd9ec8496bcad4d23e1c languageName: node linkType: hard "@rspack/dev-server@npm:^1.0.9": - version: 1.0.9 - resolution: "@rspack/dev-server@npm:1.0.9" + version: 1.0.10 + resolution: "@rspack/dev-server@npm:1.0.10" dependencies: chokidar: ^3.6.0 connect-history-api-fallback: ^2.0.0 @@ -15909,7 +16265,7 @@ __metadata: ws: ^8.16.0 peerDependencies: "@rspack/core": "*" - checksum: 46b6ad1e8f52a44c178042b6b9306fe54ad28ab24b86015f118d03a69628b04bf9563201686e0738b8c06ee8c5dedbc0bb4d6705c7f2d7d3959f2a449ff95cd6 + checksum: 0df53d1a655e5eb95c3a84b8ef34bcab6d32f8c7b23ba080f9691aa15edeee6dd79236c3942c1d55834ff9ae9f427b6e5f58cbf5e10aae015979f3d171bd65ef languageName: node linkType: hard @@ -15921,17 +16277,17 @@ __metadata: linkType: hard "@rspack/plugin-react-refresh@npm:^1.0.0": - version: 1.0.0 - resolution: "@rspack/plugin-react-refresh@npm:1.0.0" + version: 1.0.1 + resolution: "@rspack/plugin-react-refresh@npm:1.0.1" dependencies: - error-stack-parser: ^2.0.6 - html-entities: ^2.1.0 + error-stack-parser: ^2.1.4 + html-entities: ^2.5.2 peerDependencies: react-refresh: ">=0.10.0 <1.0.0" peerDependenciesMeta: react-refresh: optional: true - checksum: 88212e66da7e51d99228c7d77b683ef020ba2f70ea7ed546158167eaa4d6e3fa228da2f7d660c3f7a74ad69a47bc98c67a2d11e4a403f3e1ff8523cded67c6c0 + checksum: 876e75b28cbafa0b405cc68768cb9fd4e394531e5c8e1515dc20fb4bd72e1bef23cb055475fc286f5d215f16ab38e4c571731c38398a85e5066b8fbee86449b0 languageName: node linkType: hard @@ -16237,13 +16593,13 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^3.1.2, @smithy/abort-controller@npm:^3.1.8": - version: 3.1.8 - resolution: "@smithy/abort-controller@npm:3.1.8" +"@smithy/abort-controller@npm:^3.1.2, @smithy/abort-controller@npm:^3.1.9": + version: 3.1.9 + resolution: "@smithy/abort-controller@npm:3.1.9" dependencies: - "@smithy/types": ^3.7.1 + "@smithy/types": ^3.7.2 tslib: ^2.6.2 - checksum: edfe448be34e33120dfb11a564e87362288ed76d69eaae3449d5f1ee806def1fc844c35421caf2cf579e3bc45df97340e74e36927ec439c8c8aca5c5edf8fb85 + checksum: 0d15ce236a14cc5193b76e6990a224957926404dd683c23000b9370a230d9331b36a4cb805521b0d713aec80b2ea78b22e0c44b03d52aa77c8d998915aafd2ac languageName: node linkType: hard @@ -16528,15 +16884,15 @@ __metadata: linkType: hard "@smithy/node-http-handler@npm:^3.0.0, @smithy/node-http-handler@npm:^3.2.0": - version: 3.3.1 - resolution: "@smithy/node-http-handler@npm:3.3.1" + version: 3.3.3 + resolution: "@smithy/node-http-handler@npm:3.3.3" dependencies: - "@smithy/abort-controller": ^3.1.8 - "@smithy/protocol-http": ^4.1.7 - "@smithy/querystring-builder": ^3.0.10 - "@smithy/types": ^3.7.1 + "@smithy/abort-controller": ^3.1.9 + "@smithy/protocol-http": ^4.1.8 + "@smithy/querystring-builder": ^3.0.11 + "@smithy/types": ^3.7.2 tslib: ^2.6.2 - checksum: 483766a6f7d9625b254a1e88f54c0bd89e83bb0c3a3518d3b298dcd9bbc2160bca2e867a859654c483aed78e8578e0c3c65ae4e0c4aa6e5e50bc04cdb7af1b37 + checksum: a1d13594d622a2cf7bbecabbc02f5ad2cb824a2363a02b08b89f1815f25b0516c408897def26834c9b85190eb2eb8ac6de8a20e4d19cca7e7a0eef1d29b568ee languageName: node linkType: hard @@ -16550,24 +16906,24 @@ __metadata: languageName: node linkType: hard -"@smithy/protocol-http@npm:^4.1.1, @smithy/protocol-http@npm:^4.1.7": - version: 4.1.7 - resolution: "@smithy/protocol-http@npm:4.1.7" +"@smithy/protocol-http@npm:^4.1.1, @smithy/protocol-http@npm:^4.1.8": + version: 4.1.8 + resolution: "@smithy/protocol-http@npm:4.1.8" dependencies: - "@smithy/types": ^3.7.1 + "@smithy/types": ^3.7.2 tslib: ^2.6.2 - checksum: 3d78a52558edb712e7b399535fcb9de5960610dc4b81ce15f1b52c7ac3ea96f47c53132974ce9e1108378dc1c5ee90333828dfa1a071dff7b49cf7b687537452 + checksum: 43cdc163137f09dc5f2419ab75c9f31ca7c1da9210023c027be5fa29455543bdc10ab886449dc1399d7ea21ab4b83ba828714f31d06c1638999fa17d5bba0626 languageName: node linkType: hard -"@smithy/querystring-builder@npm:^3.0.10, @smithy/querystring-builder@npm:^3.0.4": - version: 3.0.10 - resolution: "@smithy/querystring-builder@npm:3.0.10" +"@smithy/querystring-builder@npm:^3.0.11, @smithy/querystring-builder@npm:^3.0.4": + version: 3.0.11 + resolution: "@smithy/querystring-builder@npm:3.0.11" dependencies: - "@smithy/types": ^3.7.1 + "@smithy/types": ^3.7.2 "@smithy/util-uri-escape": ^3.0.0 tslib: ^2.6.2 - checksum: a789b6f43392247880d71a4d88a89309d2da0c66e2c0f1708c9befd19db66151b8653e6ba3a13cb9aae2a9ed3889245ad394ecdb1076c25b447296b0a4d83877 + checksum: 168f3104b2db0b704f211e18a318dffdbaaa9675b62ca44c892267c7825295e10041c1c82086cdcd1a7a05f1db95c0a1c74540d8b6d9c9504b13bb89387186fd languageName: node linkType: hard @@ -16639,12 +16995,12 @@ __metadata: languageName: node linkType: hard -"@smithy/types@npm:^3.4.0, @smithy/types@npm:^3.7.1": - version: 3.7.1 - resolution: "@smithy/types@npm:3.7.1" +"@smithy/types@npm:^3.4.0, @smithy/types@npm:^3.7.2": + version: 3.7.2 + resolution: "@smithy/types@npm:3.7.2" dependencies: tslib: ^2.6.2 - checksum: 8db4393211db97aec515cc06748fa23acfc0c26a19c5ed6d009add623e1b1b7a470603a71f55b9de31a15696a2918e4a0913cb3531bfc7951b80bc7872f594f0 + checksum: f3ae277d2f81eeb67c12e651b2e999225cda115dff8fab257a77fbe3739d32c515dbd19218590dd2c33d203259b00c80c9fc6027f8484c50725390a8fc0f1e3e languageName: node linkType: hard @@ -17172,9 +17528,9 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-actions@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-actions@npm:8.4.5" +"@storybook/addon-actions@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-actions@npm:8.4.7" dependencies: "@storybook/global": ^5.0.0 "@types/uuid": ^9.0.1 @@ -17182,121 +17538,121 @@ __metadata: polished: ^4.2.2 uuid: ^9.0.0 peerDependencies: - storybook: ^8.4.5 - checksum: 7bc9b3091b62419170aa841d2006b88cffa111557f3451b96f9f61310c83138a131f3e400b05fbd5c774d5e93b15ebd629844844b6ba099ee968fed2e5085d54 + storybook: ^8.4.7 + checksum: 7cc48f1ebd137f815b907255e8201e49df5a5fa37fade9fa1a8d2bcaeaf4922e777a20e5e2b84500b85a4976a95b81ab960d6208e1c1d44be1e6fb7a6b93fc6c languageName: node linkType: hard -"@storybook/addon-backgrounds@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-backgrounds@npm:8.4.5" +"@storybook/addon-backgrounds@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-backgrounds@npm:8.4.7" dependencies: "@storybook/global": ^5.0.0 memoizerific: ^1.11.3 ts-dedent: ^2.0.0 peerDependencies: - storybook: ^8.4.5 - checksum: a8b68fc20463087cc66d52c933825c9ba73f81c4ab14eea607271f20ad0e108581bb75dddd06fd01a8a55637b48a14342543174bbacbc7609388c659f0257906 + storybook: ^8.4.7 + checksum: 67cf32c3f9d2797158679156fb7250b94e72d692375505aa641d856b89c6340501d8c62653c1bb613aa1920d9115ae56566e1d2866a454515d2a6b639df94856 languageName: node linkType: hard -"@storybook/addon-controls@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-controls@npm:8.4.5" +"@storybook/addon-controls@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-controls@npm:8.4.7" dependencies: "@storybook/global": ^5.0.0 dequal: ^2.0.2 ts-dedent: ^2.0.0 peerDependencies: - storybook: ^8.4.5 - checksum: 673cdec1c5b174a317c295bcbbcb464f0d2778e6c403b3ae591a96d59510a96b9a97121b250d13e83886168396e5ee6877104e04da957950c3d87145ec76007b + storybook: ^8.4.7 + checksum: 5d91916bfc767c119b4d938bf8ecaee8a8d661068f11b5f8d73027626340a972eaa503d8ef75c64aa61da4e8b846c3bc3f66529e75f76d830811ce04b17bc367 languageName: node linkType: hard -"@storybook/addon-docs@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-docs@npm:8.4.5" +"@storybook/addon-docs@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-docs@npm:8.4.7" dependencies: "@mdx-js/react": ^3.0.0 - "@storybook/blocks": 8.4.5 - "@storybook/csf-plugin": 8.4.5 - "@storybook/react-dom-shim": 8.4.5 + "@storybook/blocks": 8.4.7 + "@storybook/csf-plugin": 8.4.7 + "@storybook/react-dom-shim": 8.4.7 react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 ts-dedent: ^2.0.0 peerDependencies: - storybook: ^8.4.5 - checksum: 04b15137c082e5b6f6d55f5a251a4a34a08c44f7ad926615f5a99093bd26b044ad40cbdb314a3a76154de00dd2434c61f893ca2ce697193addd03e0650c6d4da + storybook: ^8.4.7 + checksum: b4442198f6931b8d1be15b3846898d1e1bda7c36f331f7f5b75dd36b69c1f22eee755633343ba78b7decc5aec45dd50a88375686b10462c0dc79fead9cf66309 languageName: node linkType: hard -"@storybook/addon-essentials@npm:^8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-essentials@npm:8.4.5" +"@storybook/addon-essentials@npm:^8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-essentials@npm:8.4.7" dependencies: - "@storybook/addon-actions": 8.4.5 - "@storybook/addon-backgrounds": 8.4.5 - "@storybook/addon-controls": 8.4.5 - "@storybook/addon-docs": 8.4.5 - "@storybook/addon-highlight": 8.4.5 - "@storybook/addon-measure": 8.4.5 - "@storybook/addon-outline": 8.4.5 - "@storybook/addon-toolbars": 8.4.5 - "@storybook/addon-viewport": 8.4.5 + "@storybook/addon-actions": 8.4.7 + "@storybook/addon-backgrounds": 8.4.7 + "@storybook/addon-controls": 8.4.7 + "@storybook/addon-docs": 8.4.7 + "@storybook/addon-highlight": 8.4.7 + "@storybook/addon-measure": 8.4.7 + "@storybook/addon-outline": 8.4.7 + "@storybook/addon-toolbars": 8.4.7 + "@storybook/addon-viewport": 8.4.7 ts-dedent: ^2.0.0 peerDependencies: - storybook: ^8.4.5 - checksum: a00c0e13763076b2bdf9923b75ff57b3f88c9ef64cebc405bb129f02fb9e69a4e69aa0d277a4d98cb181c11681eb8db488585a1dcf8f92f1ff8b371b4c6810fb + storybook: ^8.4.7 + checksum: d8731c18935fbc130beee7236b4e80c1621c6964a4109741512b50f065cd8d322446f8ecd84b4120ad1ce2ea829d0d3b5b764cca19c1bd8b73fc77d04dc13f17 languageName: node linkType: hard -"@storybook/addon-highlight@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-highlight@npm:8.4.5" +"@storybook/addon-highlight@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-highlight@npm:8.4.7" dependencies: "@storybook/global": ^5.0.0 peerDependencies: - storybook: ^8.4.5 - checksum: 8caa57aaee1a6704e757d4711899683d83778ad426015871f93cbb4e44ffb07a7a5e81a1bed7c36b335fa3687ce36f7a6f41738aa040bfbeea623100ed831090 + storybook: ^8.4.7 + checksum: 8b4ad5df3227441e3442d6c49a0be7b14b9b12f722897d45d90ee405ac791e549a41b30f9f6ab3c89f39c89294f7933449338ddcf3c4bdc1e6f3f42a48093826 languageName: node linkType: hard -"@storybook/addon-interactions@npm:^8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-interactions@npm:8.4.5" +"@storybook/addon-interactions@npm:^8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-interactions@npm:8.4.7" dependencies: "@storybook/global": ^5.0.0 - "@storybook/instrumenter": 8.4.5 - "@storybook/test": 8.4.5 + "@storybook/instrumenter": 8.4.7 + "@storybook/test": 8.4.7 polished: ^4.2.2 ts-dedent: ^2.2.0 peerDependencies: - storybook: ^8.4.5 - checksum: ded85ef9b78e657a919bfaf7de4b616419e28d89ea74d9990016f699194ad02bb65116a950d6a5b6de6127c44932066ad020898be0fdf50a19dea4e9a662f2bd + storybook: ^8.4.7 + checksum: 9130d38a49cfc858b262faf19214eee83c1a89c012477821bd8371fa0ea952e3de0317d7e1bab78e4945a64b977bbf1b4092bbfe1d1d29bed5d6a117861cdba8 languageName: node linkType: hard -"@storybook/addon-measure@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-measure@npm:8.4.5" +"@storybook/addon-measure@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-measure@npm:8.4.7" dependencies: "@storybook/global": ^5.0.0 tiny-invariant: ^1.3.1 peerDependencies: - storybook: ^8.4.5 - checksum: c6e177f8c2ae68984cde8502cf303c4ee69798cd3b9453aea9a8df5c30d42f4ec8b58d416ee8fdd2f5110c3d837c871e96953bf62225b13476da0dc8cfe6e7e0 + storybook: ^8.4.7 + checksum: 16bc6a5ece783a99eb14cfd705c7664582b640dc81c0226d7f8e649c611082c00b348cc834b43cb5be26b478afc16f3673607f07cccdd04b6dfde7faae99c220 languageName: node linkType: hard -"@storybook/addon-outline@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-outline@npm:8.4.5" +"@storybook/addon-outline@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-outline@npm:8.4.7" dependencies: "@storybook/global": ^5.0.0 ts-dedent: ^2.0.0 peerDependencies: - storybook: ^8.4.5 - checksum: 41567f91cee84920d66f657b40f262c95a9a046aed6e9db161624d6adcf77ce9acb7d433c7f9e929da4dee048e0842015d0bc51a63fb8468f69f560067e5234f + storybook: ^8.4.7 + checksum: caea4da246bca6d31a217b2f004daa416998c505648f9ed3768d094d4950d1b9f014da70e0f31b92cb6851e92e171cec55ebccf80600902019102c8c997c1228 languageName: node linkType: hard @@ -17311,50 +17667,50 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-themes@npm:^8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-themes@npm:8.4.5" +"@storybook/addon-themes@npm:^8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-themes@npm:8.4.7" dependencies: ts-dedent: ^2.0.0 peerDependencies: - storybook: ^8.4.5 - checksum: 0f76936ce687d126d886cc8f7080a15717cee3fe4ff7286f4a0a5da302edf38c14d5feb9c536078d982d268b118a9f38ea97ad310ce43326da959210450995f7 + storybook: ^8.4.7 + checksum: a9ba38e765564b20691525d78354ee135c3722ffffb8735df21da8afa33a529f82dd59ae1041f21c3572bf066784f58529ab0a96e1414b2eb61d7916528f9ba1 languageName: node linkType: hard -"@storybook/addon-toolbars@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-toolbars@npm:8.4.5" +"@storybook/addon-toolbars@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-toolbars@npm:8.4.7" peerDependencies: - storybook: ^8.4.5 - checksum: fa914838d23b68199c355672674ad6f84bd3db0f2b961fd05ebba916a8c1dd1026ed9568ae97b34e9b0d657d4d4d9d64d69431d6c6a04b2e4bb39d4ddc93446c + storybook: ^8.4.7 + checksum: e94f2a47d7c59f19f43b2f345a39e7a0071f80e2b9c636e82b814707b92c86578dba8e0b82a31a8f62806bbfb16d5491f3e784b6ed27a9b5af76c6723bcdfd59 languageName: node linkType: hard -"@storybook/addon-viewport@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/addon-viewport@npm:8.4.5" +"@storybook/addon-viewport@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/addon-viewport@npm:8.4.7" dependencies: memoizerific: ^1.11.3 peerDependencies: - storybook: ^8.4.5 - checksum: 72d70129e8d4c223608a66a7e6630be21ee05f403ef54afc72344489655e38256d644503f74ed9f363a18d967f22fa9da36ce4bc082b6a464c4fdb5e50d598ce + storybook: ^8.4.7 + checksum: 87c4384293d2adea8a3267560fd72070d2185dfa5e4dc3c5325ccb412d6d5c0bcc6d2c825d92c83e099a8187bddcb7db7f635107308952ad120b057f1a099443 languageName: node linkType: hard "@storybook/addon-webpack5-compiler-swc@npm:^1.0.5": - version: 1.0.5 - resolution: "@storybook/addon-webpack5-compiler-swc@npm:1.0.5" + version: 1.0.6 + resolution: "@storybook/addon-webpack5-compiler-swc@npm:1.0.6" dependencies: "@swc/core": ^1.7.3 swc-loader: ^0.2.3 - checksum: ed3177427f528cb1842bc57c9bc32501140c9a5bdf14926959cba024d38e5d6a24bccb6c977666e3a0a58dc7890feb92c616ec1f43bed33e691cbb1c5a575bd0 + checksum: c70389a664f1862d4939dca645e0f5680f759bcd15d629004a7a7186e2a96993a84f41535f63a610b753c1a625427bc5af5a0a7976f31f0aac81fb80f47523af languageName: node linkType: hard -"@storybook/blocks@npm:8.4.5, @storybook/blocks@npm:^8.4.5": - version: 8.4.5 - resolution: "@storybook/blocks@npm:8.4.5" +"@storybook/blocks@npm:8.4.7, @storybook/blocks@npm:^8.4.7": + version: 8.4.7 + resolution: "@storybook/blocks@npm:8.4.7" dependencies: "@storybook/csf": ^0.1.11 "@storybook/icons": ^1.2.12 @@ -17362,21 +17718,21 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.5 + storybook: ^8.4.7 peerDependenciesMeta: react: optional: true react-dom: optional: true - checksum: f80d320d75fc74cd15c7b3a4d58de286f617120829bb5c319f845d2e2310ef2f2e159e69cf3fd3906c8be47e34cd95e879c565d09f0bfe360e73df694c90bd79 + checksum: 4fd794e48efd809dd7588c65f721f3d3674554d18ffef380a0b8431af654e995f54a4a2ab6e7a1b6f092ddf614a4701db361175912d61ece9599a1e1cbce6c83 languageName: node linkType: hard -"@storybook/builder-webpack5@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/builder-webpack5@npm:8.4.5" +"@storybook/builder-webpack5@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/builder-webpack5@npm:8.4.7" dependencies: - "@storybook/core-webpack": 8.4.5 + "@storybook/core-webpack": 8.4.7 "@types/node": ^22.0.0 "@types/semver": ^7.3.4 browser-assert: ^1.2.1 @@ -17402,38 +17758,38 @@ __metadata: webpack-hot-middleware: ^2.25.1 webpack-virtual-modules: ^0.6.0 peerDependencies: - storybook: ^8.4.5 + storybook: ^8.4.7 peerDependenciesMeta: typescript: optional: true - checksum: 7cc0ae634687d75a0a955b9182ddf3341c4eb3197c8e9e772029a5a3c7da8018da9484361fa2a44e1fcaa43728432cd1bc842b05acb7595e929c6850d48d09f7 + checksum: e1a48c3b03a4bac12ec99d41de3107246f4940bf7c67f2294db49b3b4e92cb65166bfde32184372bde758a4386206b2013b2b56683e684a2f2d096814bd4120a languageName: node linkType: hard -"@storybook/components@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/components@npm:8.4.5" +"@storybook/components@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/components@npm:8.4.7" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: dd14e0a2d40f6590fd92204f3b40d4437403b7be311fa797250bd71fe4b38ade78389d41d2617fa5e75cfa0e1538366ca1154149c0894433245c23cebc4dfc73 + checksum: e39fb81e8386db4f3f76cbf4f82e50512fed2f65a581951c0b61e00c9834c20cfff7f717e936353275dadfe6a25ffaac5d47151adbe1e3be85e709f8a64f6a15 languageName: node linkType: hard -"@storybook/core-webpack@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/core-webpack@npm:8.4.5" +"@storybook/core-webpack@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/core-webpack@npm:8.4.7" dependencies: "@types/node": ^22.0.0 ts-dedent: ^2.0.0 peerDependencies: - storybook: ^8.4.5 - checksum: 72760a54f3b6c7e87889e773e062ea8d7543375a950396f03e8a979fa586ebbe766b9d629432cbc8a07f74e24b0d9fdbe4bbdc39fe1269d706fce0ce3c0aeeae + storybook: ^8.4.7 + checksum: 9b89842f51f391502e8e466747f68bcfb285691d958b8cbf6e57e691108c9c199430d43be90a558987c88e95bff6daa5129af6ad0b785752e2538c09f0d1a438 languageName: node linkType: hard -"@storybook/core@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/core@npm:8.4.5" +"@storybook/core@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/core@npm:8.4.7" dependencies: "@storybook/csf": ^0.1.11 better-opn: ^3.0.2 @@ -17451,18 +17807,18 @@ __metadata: peerDependenciesMeta: prettier: optional: true - checksum: cfc7c93508befaed12314c61a64d892f543c16cff61b841ab5d74f666b88f6778aa3dd84095325074d4bc85bfde99a69ffc674e93200b457e33784b3ceccf730 + checksum: 969cde2203c9c2c744f2a1d2858b2adeb7d57fc75e703f64187fcf0056eb7da48d0507d919718c0866952dda084eb51d79e65a90abec8bb0dcb404b542a6872f languageName: node linkType: hard -"@storybook/csf-plugin@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/csf-plugin@npm:8.4.5" +"@storybook/csf-plugin@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/csf-plugin@npm:8.4.7" dependencies: unplugin: ^1.3.1 peerDependencies: - storybook: ^8.4.5 - checksum: df59430f3f212ad8a11efdfa3ef01d8fa73322233338488fb97a9e2e031c4846a6b307acbf16edd72ab8edb02e86740b5a0fff0e0dec4dd15850573a92831c98 + storybook: ^8.4.7 + checksum: d9006d1a506796717528ee81948be89c8ca7e4a4ad463e024936d828b8e91e12940a41f054db4d5b1f1b058146113aaeb415eca87ca94142c3ef1ef501aead17 languageName: node linkType: hard @@ -17492,24 +17848,24 @@ __metadata: languageName: node linkType: hard -"@storybook/instrumenter@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/instrumenter@npm:8.4.5" +"@storybook/instrumenter@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/instrumenter@npm:8.4.7" dependencies: "@storybook/global": ^5.0.0 "@vitest/utils": ^2.1.1 peerDependencies: - storybook: ^8.4.5 - checksum: 14093e36b14871e74331074b7261f9103ddfe1233dffa7f722a8e36c955cb5812d7e3a202b8a7673dbdceb10853d0989cef1ff8e928b058635b2032188905842 + storybook: ^8.4.7 + checksum: 8e3316a42c172099b3a27bedbfde4da45e76d2f7508ff20e9a259322a35a52c69cc0fb74a3611d10f5963ff165e83c6ae0b78b1e0e5f77a1aa0d70ac16f7be83 languageName: node linkType: hard -"@storybook/manager-api@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/manager-api@npm:8.4.5" +"@storybook/manager-api@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/manager-api@npm:8.4.7" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: f6bc0ef3703afceedb862b77f22e169a173525c6d0483ba4ae5d1daf5b19c8077b33ef3fd634571e3ded93b2d4bd4a9e182c23d4395d1bfe8fdb6c98bdcc119f + checksum: 2b826ec55de7ea0b5b5151dfa896f3e7eddfd36ede61f8a7ad14a37733d5d5645565f863dbde7e2272f1e9b5717f26de7802ae60e297a2647ee2c4c072ed3069 languageName: node linkType: hard @@ -17522,12 +17878,12 @@ __metadata: languageName: node linkType: hard -"@storybook/preset-react-webpack@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/preset-react-webpack@npm:8.4.5" +"@storybook/preset-react-webpack@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/preset-react-webpack@npm:8.4.7" dependencies: - "@storybook/core-webpack": 8.4.5 - "@storybook/react": 8.4.5 + "@storybook/core-webpack": 8.4.7 + "@storybook/react": 8.4.7 "@storybook/react-docgen-typescript-plugin": 1.0.6--canary.9.0c3f3b7.0 "@types/node": ^22.0.0 "@types/semver": ^7.3.4 @@ -17541,20 +17897,20 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.5 + storybook: ^8.4.7 peerDependenciesMeta: typescript: optional: true - checksum: 059e35135c7770daf49338bf72d999b277cadec1c7f21175eac962448789fc1c2964e37973d8c18bf4a374a8838bdf369e0c2935cb188ffbd860d60cadda3c2e + checksum: 0e2a3934e0b1b225adaa12ab1a44822a8dd3b0ce23be0fbcf923bdf555e6ff3008123f55d31825548cbc4a5f76a7adadd3b4d933289aaa94f7d2e2404d761f51 languageName: node linkType: hard -"@storybook/preview-api@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/preview-api@npm:8.4.5" +"@storybook/preview-api@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/preview-api@npm:8.4.7" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 832bee373583fb55102459445ae7f3e8bca0ff80a4220aa656bf6baf8661e0c65184f080b1e10695f8fbb948fd8d48cc9728d19d1bc6993418251126380d4818 + checksum: 1c467bb2c16c5998b9bc4c2c013e6786936d5f6a373ad8d8ab1beb626616c3187329fdfc3a709663b4af963c7e5789a1401166c6e2a3a66a12f66e858aa94e91 languageName: node linkType: hard @@ -17576,86 +17932,86 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/react-dom-shim@npm:8.4.5" +"@storybook/react-dom-shim@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/react-dom-shim@npm:8.4.7" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.5 - checksum: b1f176b85783bfa9c43f49a7ef69c04ff92079e5ba8ca76b1b9f46b814c19db6e882137c35ebd91424e2e51bfa0d34eb3f0b84d4ed9e8a2b93875b7f5563b310 + storybook: ^8.4.7 + checksum: 4de29cbb990bfb2f310440aa995b024faa93fd1d5c7c942d6d661d590693eb56e0567a141c14faca63e8b24fc2f6b6b44c02af37cd2d5b469c1129b0e78fc79d languageName: node linkType: hard -"@storybook/react-webpack5@npm:^8.4.5": - version: 8.4.5 - resolution: "@storybook/react-webpack5@npm:8.4.5" +"@storybook/react-webpack5@npm:^8.4.7": + version: 8.4.7 + resolution: "@storybook/react-webpack5@npm:8.4.7" dependencies: - "@storybook/builder-webpack5": 8.4.5 - "@storybook/preset-react-webpack": 8.4.5 - "@storybook/react": 8.4.5 + "@storybook/builder-webpack5": 8.4.7 + "@storybook/preset-react-webpack": 8.4.7 + "@storybook/react": 8.4.7 "@types/node": ^22.0.0 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.5 + storybook: ^8.4.7 typescript: ">= 4.2.x" peerDependenciesMeta: typescript: optional: true - checksum: d15986993f0353b7a4a88945f560e47b24849cc202f16e5ab7ce469bfdc507377d58d638f1ae04c34a506ec6343327920fdb225be5621b44f659ca4073da3d24 + checksum: 5be2491f5fe2525dee96a86d1fe7775bbaaf5352cfb538aa8e91bab7bdbea47597670761921436ea7041fc6277cb33ee680bad6efd7bfd84fc38d66942aa4001 languageName: node linkType: hard -"@storybook/react@npm:8.4.5, @storybook/react@npm:^8.4.5": - version: 8.4.5 - resolution: "@storybook/react@npm:8.4.5" +"@storybook/react@npm:8.4.7, @storybook/react@npm:^8.4.7": + version: 8.4.7 + resolution: "@storybook/react@npm:8.4.7" dependencies: - "@storybook/components": 8.4.5 + "@storybook/components": 8.4.7 "@storybook/global": ^5.0.0 - "@storybook/manager-api": 8.4.5 - "@storybook/preview-api": 8.4.5 - "@storybook/react-dom-shim": 8.4.5 - "@storybook/theming": 8.4.5 + "@storybook/manager-api": 8.4.7 + "@storybook/preview-api": 8.4.7 + "@storybook/react-dom-shim": 8.4.7 + "@storybook/theming": 8.4.7 peerDependencies: - "@storybook/test": 8.4.5 + "@storybook/test": 8.4.7 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.5 + storybook: ^8.4.7 typescript: ">= 4.2.x" peerDependenciesMeta: "@storybook/test": optional: true typescript: optional: true - checksum: ea3f2008186d7b3556cdb1b0942ce2cb0b7d52ee322e3680f6f32f5a723a2d676fe4ba2bc2ea0060112453cd8652861c0b2d154a5c34e7d5b69ead9603c2ce68 + checksum: 5ad2137f8f5f0a34cb90e2582fd574aff888c544f0f9907472d930d4fb1f444124aa84188a0b5d661cc6c4c0bf7210b1e616a53b4be3f2df2479165571fa9085 languageName: node linkType: hard -"@storybook/test@npm:8.4.5, @storybook/test@npm:^8.4.5": - version: 8.4.5 - resolution: "@storybook/test@npm:8.4.5" +"@storybook/test@npm:8.4.7, @storybook/test@npm:^8.4.7": + version: 8.4.7 + resolution: "@storybook/test@npm:8.4.7" dependencies: "@storybook/csf": ^0.1.11 "@storybook/global": ^5.0.0 - "@storybook/instrumenter": 8.4.5 + "@storybook/instrumenter": 8.4.7 "@testing-library/dom": 10.4.0 "@testing-library/jest-dom": 6.5.0 "@testing-library/user-event": 14.5.2 "@vitest/expect": 2.0.5 "@vitest/spy": 2.0.5 peerDependencies: - storybook: ^8.4.5 - checksum: b04d3ee38cf60557d9ac1fe58f4cdbaee72d3fe2818530fc360fae7edfb18794e2b7be4748d00511c4682727743f8828efefe1bae7fffb28ad05b53f821bb5e9 + storybook: ^8.4.7 + checksum: ef1147edb55be9770004d3194dcbeef650768659af0704cd50e9d14f3c647f28855270e5151e609775770c30bf5d42fbd33ad3bc383d25846bc1e5e9e4f490f7 languageName: node linkType: hard -"@storybook/theming@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/theming@npm:8.4.5" +"@storybook/theming@npm:8.4.7": + version: 8.4.7 + resolution: "@storybook/theming@npm:8.4.7" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 0eefd3a3bea58e557f1e303270910046f05aa971ceba6ca6c1cd706c25b537243be6663dba5b2b3aa2edb7fc40279e93403131d76eae7da26da70f8a1c8d1c96 + checksum: 47d29993c33bb29994d227af30e099579b7cf760652ed743020f5d7e5a5974f59a6ebeb1cc8995e6158da9cf768a8d2f559d1d819cc082d0bcdb056d85fdcb29 languageName: node linkType: hard @@ -18337,90 +18693,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-darwin-arm64@npm:1.9.3" +"@swc/core-darwin-arm64@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-darwin-arm64@npm:1.10.6" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-darwin-x64@npm:1.9.3" +"@swc/core-darwin-x64@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-darwin-x64@npm:1.10.6" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.9.3" +"@swc/core-linux-arm-gnueabihf@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.6" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-linux-arm64-gnu@npm:1.9.3" +"@swc/core-linux-arm64-gnu@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-linux-arm64-gnu@npm:1.10.6" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-linux-arm64-musl@npm:1.9.3" +"@swc/core-linux-arm64-musl@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-linux-arm64-musl@npm:1.10.6" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-linux-x64-gnu@npm:1.9.3" +"@swc/core-linux-x64-gnu@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-linux-x64-gnu@npm:1.10.6" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-linux-x64-musl@npm:1.9.3" +"@swc/core-linux-x64-musl@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-linux-x64-musl@npm:1.10.6" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-win32-arm64-msvc@npm:1.9.3" +"@swc/core-win32-arm64-msvc@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-win32-arm64-msvc@npm:1.10.6" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-win32-ia32-msvc@npm:1.9.3" +"@swc/core-win32-ia32-msvc@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-win32-ia32-msvc@npm:1.10.6" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.9.3": - version: 1.9.3 - resolution: "@swc/core-win32-x64-msvc@npm:1.9.3" +"@swc/core-win32-x64-msvc@npm:1.10.6": + version: 1.10.6 + resolution: "@swc/core-win32-x64-msvc@npm:1.10.6" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46, @swc/core@npm:^1.7.3": - version: 1.9.3 - resolution: "@swc/core@npm:1.9.3" + version: 1.10.6 + resolution: "@swc/core@npm:1.10.6" dependencies: - "@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/core-darwin-arm64": 1.10.6 + "@swc/core-darwin-x64": 1.10.6 + "@swc/core-linux-arm-gnueabihf": 1.10.6 + "@swc/core-linux-arm64-gnu": 1.10.6 + "@swc/core-linux-arm64-musl": 1.10.6 + "@swc/core-linux-x64-gnu": 1.10.6 + "@swc/core-linux-x64-musl": 1.10.6 + "@swc/core-win32-arm64-msvc": 1.10.6 + "@swc/core-win32-ia32-msvc": 1.10.6 + "@swc/core-win32-x64-msvc": 1.10.6 "@swc/counter": ^0.1.3 "@swc/types": ^0.1.17 peerDependencies: @@ -18449,7 +18805,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 4d83aee0b4d9c543f247d680796e5b9cb69997369dcd81642c2603e185312dfb1674328a7ceb1d352c21275155a71789f76dafe8853055d076b6241d5760bbed + checksum: 574595e21c0b23904a8813b8c698aa32a66f47faa8c0e3b52c1cd2e2f764eb7cbc587d253a16070db18c518b55d9f88146ecf9a1b3e308471a8e2290078bc7e9 languageName: node linkType: hard @@ -18609,22 +18965,22 @@ __metadata: linkType: hard "@testing-library/react@npm:^16.0.0": - version: 16.0.1 - resolution: "@testing-library/react@npm:16.0.1" + version: 16.1.0 + resolution: "@testing-library/react@npm:16.1.0" dependencies: "@babel/runtime": ^7.12.5 peerDependencies: "@testing-library/dom": ^10.0.0 - "@types/react": ^18.0.0 - "@types/react-dom": ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + "@types/react": ^18.0.0 || ^19.0.0 + "@types/react-dom": ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@types/react": optional: true "@types/react-dom": optional: true - checksum: 1837db473ea018cf2b5d0cbfffb7a30d0d759e5a7f23aad431441c77bcc3d2533250cd003a61878fd908267df47404cedcb5914f12d79e413002c659652b37fd + checksum: 5dc8e7abda23d108c29f43cdacd43fad750e981ee87ee8902fb349a2683f2f774ef1136f2d3ef3d9efb87e8b04426c43d7b46e95511cd7c9d37b10c3bdd3e9e2 languageName: node linkType: hard @@ -19057,11 +19413,11 @@ __metadata: linkType: hard "@types/d3-shape@npm:^3.0.1": - version: 3.1.6 - resolution: "@types/d3-shape@npm:3.1.6" + version: 3.1.7 + resolution: "@types/d3-shape@npm:3.1.7" dependencies: "@types/d3-path": "*" - checksum: bd765be021019c43c8dca066a798a1de28a051d1213db6ca25f76c9e577da7ec40a592e3bda7628383ab48cb87164fe60b95eb5ec23761b2012bd0adb30c549a + checksum: 776b982e2c4fc04763782af5100993c02bca338632ff2c76d2423ace398300ba7c48cd745f95b5f51edefabbfd026c45829a146c411f8facde09ef92580b20ce languageName: node linkType: hard @@ -19102,13 +19458,13 @@ __metadata: linkType: hard "@types/dockerode@npm:^3.3.0, @types/dockerode@npm:^3.3.29": - version: 3.3.32 - resolution: "@types/dockerode@npm:3.3.32" + version: 3.3.33 + resolution: "@types/dockerode@npm:3.3.33" dependencies: "@types/docker-modem": "*" "@types/node": "*" "@types/ssh2": "*" - checksum: 17bfa92511cdc6ab51a67cb4678931b43670feffd737ba593c3ff90a6f71673aa04f8a81524690dddc08b483628d657a338a176171ff131de9e0efba4c3ecc11 + checksum: 4e3ed41f3b89a213c9ba923862b653f54ee7232b2c95553410d0c3846396efb592d0291fa2f50d4b47d42a2ae0b49f422e72efcdd845d0ebb60da2e8990e9293 languageName: node linkType: hard @@ -19473,7 +19829,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7, @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 @@ -19540,9 +19896,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.151": - version: 4.17.13 - resolution: "@types/lodash@npm:4.17.13" - checksum: d0bf8fbd950be71946e0076b30fd40d492293baea75f05931b6b5b906fd62583708c6229abdb95b30205ad24ce1ed2f48bc9d419364f682320edd03405cc0c7e + version: 4.17.14 + resolution: "@types/lodash@npm:4.17.14" + checksum: 2dbeaff92b31cb523f6bc4bb99a3d8c88fbb001d54f2367a888add85784fb213744a9b1600e1e98b6790ab191fdb6ec839eb0e3d63fcf6fb6cf1ebe4c3d21149 languageName: node linkType: hard @@ -19714,11 +20070,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=13.7.0, @types/node@npm:^22.0.0": - version: 22.10.1 - resolution: "@types/node@npm:22.10.1" + version: 22.10.5 + resolution: "@types/node@npm:22.10.5" dependencies: undici-types: ~6.20.0 - checksum: 5a9b81500f288a8fb757b61bd939f99f72b6cb59347a5bae52dd1c2c87100ebbaa9da4256ef3cb9add2090e8704cda1d9a1ffc14ccd5db47a6466c8bae10ebcb + checksum: 3b0e966df4e130edac3ad034f1cddbe134e70f11556062468c9fbd749a3b07a44445a3a75a7eec68a104930bf05d4899f1a418c4ae48493d2c8c1544d8594bcc languageName: node linkType: hard @@ -19744,20 +20100,20 @@ __metadata: linkType: hard "@types/node@npm:^18.11.18, @types/node@npm:^18.11.9, @types/node@npm:^18.17.15": - version: 18.19.67 - resolution: "@types/node@npm:18.19.67" + version: 18.19.70 + resolution: "@types/node@npm:18.19.70" dependencies: undici-types: ~5.26.4 - checksum: 700f92c6a0b63352ce6327286392adab30bb17623c2a788811e9cf092c4dc2fb5e36ca4727247a981b3f44185fdceef20950a3b7a8ab72721e514ac037022a08 + checksum: 6ce382b659a03fb694b8af4bbf3a397c0f8b6448ab4c0f17fc58de8fe649c474146b88c0317ab0ccb50ce9e251464498b0aa43227f1626d4f65bd196cbae6764 languageName: node linkType: hard "@types/node@npm:^20.1.1, @types/node@npm:^20.16.0": - version: 20.17.9 - resolution: "@types/node@npm:20.17.9" + version: 20.17.12 + resolution: "@types/node@npm:20.17.12" dependencies: undici-types: ~6.19.2 - checksum: 2fc67ba937d2c4e7a52f0ccf71b8b4c616dcfa1ad6cd5a726582fd3cbf4f409c2eb44595592580f782c2ade05f8130df072dd04ac064fe150cfcd7849e643500 + checksum: 0c0dbeb4e1480a23071ec38e97bb3d776e0ae9828174bf45f9edcf277caa955945cb10d31d84f7a73c66aaf92ae2e022be6331bd00a4bed1f2ad9639a411d17e languageName: node linkType: hard @@ -19940,10 +20296,10 @@ __metadata: languageName: node linkType: hard -"@types/prop-types@npm:*, @types/prop-types@npm:^15.0.0, @types/prop-types@npm:^15.7.12, @types/prop-types@npm:^15.7.13, @types/prop-types@npm:^15.7.3": - version: 15.7.13 - resolution: "@types/prop-types@npm:15.7.13" - checksum: 8935cad87c683c665d09a055919d617fe951cb3b2d5c00544e3a913f861a2bd8d2145b51c9aa6d2457d19f3107ab40784c40205e757232f6a80cc8b1c815513c +"@types/prop-types@npm:*, @types/prop-types@npm:^15.0.0, @types/prop-types@npm:^15.7.12, @types/prop-types@npm:^15.7.3": + version: 15.7.14 + resolution: "@types/prop-types@npm:15.7.14" + checksum: d0c5407b9ccc3dd5fae0ccf9b1007e7622ba5e6f1c18399b4f24dff33619d469da4b9fa918a374f19dc0d9fe6a013362aab0b844b606cfc10676efba3f5f736d languageName: node linkType: hard @@ -19980,11 +20336,11 @@ __metadata: linkType: hard "@types/react-dom@npm:^18": - version: 18.3.1 - resolution: "@types/react-dom@npm:18.3.1" - dependencies: - "@types/react": "*" - checksum: ad28ecce3915d30dc76adc2a1373fda1745ba429cea290e16c6628df9a05fd80b6403c8e87d78b45e6c60e51df7a67add389ab62b90070fbfdc9bda8307d9953 + version: 18.3.5 + resolution: "@types/react-dom@npm:18.3.5" + peerDependencies: + "@types/react": ^18.0.0 + checksum: 95c757684f71e761515c5a11299e5feec550c72bb52975487f360e6f0d359b26454c26eaf2ce45dd22748205aa9b2c2fe0abe7005ebcbd233a7615283ac39a7d languageName: node linkType: hard @@ -20082,12 +20438,12 @@ __metadata: linkType: hard "@types/react@npm:^18": - version: 18.3.12 - resolution: "@types/react@npm:18.3.12" + version: 18.3.18 + resolution: "@types/react@npm:18.3.18" dependencies: "@types/prop-types": "*" csstype: ^3.0.2 - checksum: 4ab1577a8c2105a5e316536f724117c90eee5f4bd5c137fc82a2253d8c1fd299dedaa07e8dfc95d6e2f04a4be3cb8b0e1b06098c6233ebd55c508d88099395b7 + checksum: 5933597bc9f53e282f0438f0bb76d0f0fab60faabe760ea806e05ffe6f5c61b9b4d363e1a03a8fea47c510d493c6cf926cdeeba9f7074fa97b61940c350245e7 languageName: node linkType: hard @@ -20183,7 +20539,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:7.5.8, @types/semver@npm:^7.1.0, @types/semver@npm:^7.3.12, @types/semver@npm:^7.3.4, @types/semver@npm:^7.5.0": +"@types/semver@npm:7.5.8, @types/semver@npm:^7.1.0, @types/semver@npm:^7.3.12, @types/semver@npm:^7.3.4": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 @@ -20604,46 +20960,44 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^6.12.0": - version: 6.21.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" +"@typescript-eslint/eslint-plugin@npm:^8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.17.0" dependencies: - "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/type-utils": 6.21.0 - "@typescript-eslint/utils": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - debug: ^4.3.4 + "@eslint-community/regexpp": ^4.10.0 + "@typescript-eslint/scope-manager": 8.17.0 + "@typescript-eslint/type-utils": 8.17.0 + "@typescript-eslint/utils": 8.17.0 + "@typescript-eslint/visitor-keys": 8.17.0 graphemer: ^1.4.0 - ignore: ^5.2.4 + ignore: ^5.3.1 natural-compare: ^1.4.0 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 + ts-api-utils: ^1.3.0 peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 5ef2c502255e643e98051e87eb682c2a257e87afd8ec3b9f6274277615e1c2caf3131b352244cfb1987b8b2c415645eeacb9113fa841fc4c9b2ac46e8aed6efd + checksum: 4743b5eefb87ee7dd95af67b32efc111a38decc19f9d11385092d210b3176c99a2b7a8af520347b34c01d65a91fe2eea22c19bbb7ea1d80d73be803f88abb69e languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.7.2": - version: 6.21.0 - resolution: "@typescript-eslint/parser@npm:6.21.0" +"@typescript-eslint/parser@npm:^8.16.0": + version: 8.17.0 + resolution: "@typescript-eslint/parser@npm:8.17.0" dependencies: - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/scope-manager": 8.17.0 + "@typescript-eslint/types": 8.17.0 + "@typescript-eslint/typescript-estree": 8.17.0 + "@typescript-eslint/visitor-keys": 8.17.0 debug: ^4.3.4 peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 + checksum: 3d330fc777cc34d8f21c7668a6ef48a1ce91905efde000f561cde76a630433c2a76d46857f7a62dc23c530e6441a5ea18b89c52e7fa5a099144c54bfe646dc35 languageName: node linkType: hard @@ -20657,40 +21011,40 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/scope-manager@npm:6.21.0" +"@typescript-eslint/scope-manager@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/scope-manager@npm:7.18.0" dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 + "@typescript-eslint/types": 7.18.0 + "@typescript-eslint/visitor-keys": 7.18.0 + checksum: b982c6ac13d8c86bb3b949c6b4e465f3f60557c2ccf4cc229799827d462df56b9e4d3eaed7711d79b875422fc3d71ec1ebcb5195db72134d07c619e3c5506b57 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/scope-manager@npm:8.16.0" +"@typescript-eslint/scope-manager@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/scope-manager@npm:8.17.0" dependencies: - "@typescript-eslint/types": 8.16.0 - "@typescript-eslint/visitor-keys": 8.16.0 - checksum: 12427e2a95a8b0cb49259be1a8a9a23f734fd0dbabbc5cebf1ba56b48812e2ca7ba32b71ededf24efa1a9da07a13b20ced004e2eea6f4b8c07003438f664ce30 + "@typescript-eslint/types": 8.17.0 + "@typescript-eslint/visitor-keys": 8.17.0 + checksum: c5f628e5b4793181a219fc8be4dc2653b2a2a158c4add645b3ba063b9618f5892e5bbf6726c9e674731e698a3df4f2ddb671494482e0f59b6625c43810f78eeb languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/type-utils@npm:6.21.0" +"@typescript-eslint/type-utils@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/type-utils@npm:8.17.0" dependencies: - "@typescript-eslint/typescript-estree": 6.21.0 - "@typescript-eslint/utils": 6.21.0 + "@typescript-eslint/typescript-estree": 8.17.0 + "@typescript-eslint/utils": 8.17.0 debug: ^4.3.4 - ts-api-utils: ^1.0.1 + ts-api-utils: ^1.3.0 peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 77025473f4d80acf1fafcce99c5c283e557686a61861febeba9c9913331f8a41e930bf5cd8b7a54db502a57b6eb8ea6d155cbd4f41349ed00e3d7aeb1f477ddc + checksum: 2619ffcfa1c2afaa71d20afec3ffaf08af9d4215767c39bb8af13c52bdc1d6985174721467d7373f5e3e6b723837980a2c29bcf1ad7a15c2ba1208d52a2c346c languageName: node linkType: hard @@ -20701,17 +21055,17 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/types@npm:6.21.0" - checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 +"@typescript-eslint/types@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/types@npm:7.18.0" + checksum: 7df2750cd146a0acd2d843208d69f153b458e024bbe12aab9e441ad2c56f47de3ddfeb329c4d1ea0079e2577fea4b8c1c1ce15315a8d49044586b04fedfe7a4d languageName: node linkType: hard -"@typescript-eslint/types@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/types@npm:8.16.0" - checksum: 1ed10343dc65c7fd493cfe789639f547f4c730e6e04472007fa92a00ff1fb77b31fc8016a350a10e553d38b12485f78c331d91c071dc08f69476076f5bbef5cd +"@typescript-eslint/types@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/types@npm:8.17.0" + checksum: 5f6933903ce4af536f180c9e326c18da715f6f400e6bc5b89828dcb5779ae5693bf95c59d253e105c9efe6ffd2046d0db868bcfb1c5288c5e194bae4ebaa9976 languageName: node linkType: hard @@ -20733,31 +21087,31 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" +"@typescript-eslint/typescript-estree@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/types": 7.18.0 + "@typescript-eslint/visitor-keys": 7.18.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 - minimatch: 9.0.3 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 + minimatch: ^9.0.4 + semver: ^7.6.0 + ts-api-utils: ^1.3.0 peerDependenciesMeta: typescript: optional: true - checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 + checksum: c82d22ec9654973944f779eb4eb94c52f4a6eafaccce2f0231ff7757313f3a0d0256c3252f6dfe6d43f57171d09656478acb49a629a9d0c193fb959bc3f36116 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.16.0" +"@typescript-eslint/typescript-estree@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.17.0" dependencies: - "@typescript-eslint/types": 8.16.0 - "@typescript-eslint/visitor-keys": 8.16.0 + "@typescript-eslint/types": 8.17.0 + "@typescript-eslint/visitor-keys": 8.17.0 debug: ^4.3.4 fast-glob: ^3.3.2 is-glob: ^4.0.3 @@ -20767,24 +21121,24 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 047ae08a7774e4be4307409970d7b8b27d46d10e302ed236199b1b7648242d2aa10b7d1dbeae1fed0f55f683c863f9d399e50108c215e35370fb6a3851bda427 + checksum: 35d3dca3cde7a1f3a7a1e4e5a25a69b6151338cd329dceeb52880e6f05048d10c9ac472a07e558fdfb7acc10dd60cd106284e834cfe40ced3d2c4527e8727335 languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.21.0, @typescript-eslint/utils@npm:^6.0.0": - version: 6.21.0 - resolution: "@typescript-eslint/utils@npm:6.21.0" +"@typescript-eslint/utils@npm:8.17.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/utils@npm:^8.8.1": + version: 8.17.0 + resolution: "@typescript-eslint/utils@npm:8.17.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 - "@types/json-schema": ^7.0.12 - "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0 - semver: ^7.5.4 + "@typescript-eslint/scope-manager": 8.17.0 + "@typescript-eslint/types": 8.17.0 + "@typescript-eslint/typescript-estree": 8.17.0 peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: b129b3a4aebec8468259f4589985cb59ea808afbfdb9c54f02fad11e17d185e2bf72bb332f7c36ec3c09b31f18fc41368678b076323e6e019d06f74ee93f7bf2 + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 67d8e390eb661e96b7782e6a900f7eb5825baae0b09e89e67159a576b157db4fd83f78887bbbb1778cd4097e0022f3ea2a9be12aab215320d47f13c03e1558d7 languageName: node linkType: hard @@ -20806,20 +21160,17 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/utils@npm:^8.8.1": - version: 8.16.0 - resolution: "@typescript-eslint/utils@npm:8.16.0" +"@typescript-eslint/utils@npm:^7.0.0": + version: 7.18.0 + resolution: "@typescript-eslint/utils@npm:7.18.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 - "@typescript-eslint/scope-manager": 8.16.0 - "@typescript-eslint/types": 8.16.0 - "@typescript-eslint/typescript-estree": 8.16.0 + "@typescript-eslint/scope-manager": 7.18.0 + "@typescript-eslint/types": 7.18.0 + "@typescript-eslint/typescript-estree": 7.18.0 peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 5e3c4b4d453bee6c38715f851d517ad3bbdb9335de5c2ef487e350eea97ae8b2e996046a1d8f3a93109e06a569d1e161b4ef8d33c530766931e4dbc43cb26ed7 + eslint: ^8.56.0 + checksum: 751dbc816dab8454b7dc6b26a56671dbec08e3f4ef94c2661ce1c0fc48fa2d05a64e03efe24cba2c22d03ba943cd3c5c7a5e1b7b03bbb446728aec1c640bd767 languageName: node linkType: hard @@ -20833,29 +21184,29 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" +"@typescript-eslint/visitor-keys@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" dependencies: - "@typescript-eslint/types": 6.21.0 - eslint-visitor-keys: ^3.4.1 - checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 + "@typescript-eslint/types": 7.18.0 + eslint-visitor-keys: ^3.4.3 + checksum: 6e806a7cdb424c5498ea187a5a11d0fef7e4602a631be413e7d521e5aec1ab46ba00c76cfb18020adaa0a8c9802354a163bfa0deb74baa7d555526c7517bb158 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.16.0" +"@typescript-eslint/visitor-keys@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.17.0" dependencies: - "@typescript-eslint/types": 8.16.0 + "@typescript-eslint/types": 8.17.0 eslint-visitor-keys: ^4.2.0 - checksum: e7444d3d57b4fcdebfa0d7effcdff9c928d77b6a6765da6980f0dbeb6438af707bd4c2c21e24e7ae1638f9c4a5697168f94027fff94ad663da57fa5f44f0983d + checksum: f92f659ec88a1ce34f5003722a133ced1ebf9b3dfc1c0ff18caa5362d4722307edb42fa606ebf80aada8525abe78b24143ef93864d38a1e359605096f1fe2f00 languageName: node linkType: hard -"@uiw/codemirror-extensions-basic-setup@npm:4.23.6": - version: 4.23.6 - resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.23.6" +"@uiw/codemirror-extensions-basic-setup@npm:4.23.7": + version: 4.23.7 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.23.7" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/commands": ^6.0.0 @@ -20872,19 +21223,19 @@ __metadata: "@codemirror/search": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: dc5a845d80c0659883f5299150034145d9b0d1879a926d5f6a9c21d839351715ea9b5dba0272cfb869e9139d40d49e86c5df12e504874cebc8cf6e9824ec4b98 + checksum: 656c5f78db4c6216a9a7eeb65455f52b002b7a5426bb1b05f11b896d5dba9887c7b9ee5aee9fe369d6c7b3c69128ee842cb5c8fe029cd07c2e48ec9358039a30 languageName: node linkType: hard "@uiw/react-codemirror@npm:^4.9.3": - version: 4.23.6 - resolution: "@uiw/react-codemirror@npm:4.23.6" + version: 4.23.7 + resolution: "@uiw/react-codemirror@npm:4.23.7" dependencies: "@babel/runtime": ^7.18.6 "@codemirror/commands": ^6.1.0 "@codemirror/state": ^6.1.1 "@codemirror/theme-one-dark": ^6.0.0 - "@uiw/codemirror-extensions-basic-setup": 4.23.6 + "@uiw/codemirror-extensions-basic-setup": 4.23.7 codemirror: ^6.0.0 peerDependencies: "@babel/runtime": ">=7.11.0" @@ -20894,7 +21245,7 @@ __metadata: codemirror: ">=6.0.0" react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 83ff09c6e5df919b3fef181798b138803a987efab4bebdaad09daae1701167cb4a734fa0b18adcc043d5a2fbd3a997bbda461d1a60972bfccdbbca21803e33fe + checksum: 5f6318b290f479c4718129578bdccbbdf64e3b588fdd79e3d80224779219eae7e249d40e4f88c864ed6ae40ea93036042313e983a022349563698593a2bf2e6c languageName: node linkType: hard @@ -20915,24 +21266,24 @@ __metadata: languageName: node linkType: hard -"@useoptic/json-pointer-helpers@npm:1.0.4": - version: 1.0.4 - resolution: "@useoptic/json-pointer-helpers@npm:1.0.4" +"@useoptic/json-pointer-helpers@npm:1.0.5": + version: 1.0.5 + resolution: "@useoptic/json-pointer-helpers@npm:1.0.5" dependencies: jsonpointer: ^5.0.1 minimatch: 9.0.3 - checksum: 7a10083bc0111cc2fb4734f666be8fea87447c61725c09ceb08876dcbf642056c60f36e48070961150d9d9b4a1c533e9b7cd007ed574956a23377b8afcf077e5 + checksum: a91e2a84dc1fe87d5f5675caeccd15b403f85c6c7be8e17f83621d2ba74934eac754aa2f81c4dc9b12e3f39889f1b20b01f3b5cc55c69f72032750af3737bffd languageName: node linkType: hard -"@useoptic/openapi-io@npm:1.0.4": - version: 1.0.4 - resolution: "@useoptic/openapi-io@npm:1.0.4" +"@useoptic/openapi-io@npm:1.0.5": + version: 1.0.5 + resolution: "@useoptic/openapi-io@npm:1.0.5" dependencies: "@apidevtools/json-schema-ref-parser": 9.0.9 "@jsdevtools/ono": ^7.1.3 - "@useoptic/json-pointer-helpers": 1.0.4 - "@useoptic/openapi-utilities": 1.0.4 + "@useoptic/json-pointer-helpers": 1.0.5 + "@useoptic/openapi-utilities": 1.0.5 ajv: 8.17.1 ajv-errors: ~3.0.0 ajv-formats: ~2.1.0 @@ -20950,15 +21301,15 @@ __metadata: upath: ^2.0.1 yaml: ^2.3.2 yaml-ast-parser: ^0.0.43 - checksum: 418ce7ebc332334a97d3f684753e608b591a72ff555f5766ac2e6ceb141865447ec8cdbff46e3e51e7afab0070aa28c7e9547ef48bc3cf568dced80834765d1b + checksum: 5ad10f19089dae08116cc208c4df5b5f7aee121a1163c5b7b761c3b4d21685573afdda26ea3c62e54b4e7e32d5d37aa6cd8db36125258f3fd7067626a5921f71 languageName: node linkType: hard -"@useoptic/openapi-utilities@npm:1.0.4": - version: 1.0.4 - resolution: "@useoptic/openapi-utilities@npm:1.0.4" +"@useoptic/openapi-utilities@npm:1.0.5": + version: 1.0.5 + resolution: "@useoptic/openapi-utilities@npm:1.0.5" dependencies: - "@useoptic/json-pointer-helpers": 1.0.4 + "@useoptic/json-pointer-helpers": 1.0.5 ajv: ^8.6.0 ajv-errors: ~3.0.0 ajv-formats: ~2.1.0 @@ -20975,7 +21326,7 @@ __metadata: ts-invariant: ^0.9.3 url-join: ^4.0.1 yaml-ast-parser: ^0.0.43 - checksum: 2a900d51378f10dbd1f21c8ee0da4988656c4ecfa1bf7a61692001118afe28633805be69024b979001b0f5afc2e40599c0f2c95359cec69bdb968d05907dc490 + checksum: 9adfab3beabe1ca80c119d053e4767998a55640ff6c8472915fdfc367d84fb8b1670afb3111db0f00fa108996bbda581e2c4bc58c1f3232c4ec7997e5bfc3216 languageName: node linkType: hard @@ -21005,8 +21356,8 @@ __metadata: linkType: hard "@useoptic/optic@npm:^1.0.0": - version: 1.0.4 - resolution: "@useoptic/optic@npm:1.0.4" + version: 1.0.5 + resolution: "@useoptic/optic@npm:1.0.5" dependencies: "@babel/runtime": ^7.20.6 "@httptoolkit/httpolyglot": ^2.0.1 @@ -21016,10 +21367,10 @@ __metadata: "@sentry/node": ^7.74.0 "@sinclair/typebox": 0.31.28 "@stoplight/spectral-core": ^1.8.1 - "@useoptic/openapi-io": 1.0.4 - "@useoptic/openapi-utilities": 1.0.4 - "@useoptic/rulesets-base": 1.0.4 - "@useoptic/standard-rulesets": 1.0.4 + "@useoptic/openapi-io": 1.0.5 + "@useoptic/openapi-utilities": 1.0.5 + "@useoptic/rulesets-base": 1.0.5 + "@useoptic/standard-rulesets": 1.0.5 ajv: 8.17.1 ajv-formats: ~2.1.0 async-exit-hook: ^2.0.1 @@ -21076,34 +21427,34 @@ __metadata: yaml: ^2.3.4 bin: optic: build/index.js - checksum: a202e87bed38fb4304d7a2f93c3228660b4b039ce1d6f0ac4b2e9fc271cbcb4d5a8592033f30a399cb7aeaad1db161c2c592a378cd9c58e852bd875c06ac2556 + checksum: 67964bce63e4ae27a965d2f83bb03b1efd67191b1a3ed4e993ec24784b40f6316cb7089a7907841f4c07ed2f0b7a773b8f6b26b3142cb0f5fd73e30145cb0a23 languageName: node linkType: hard -"@useoptic/rulesets-base@npm:1.0.4": - version: 1.0.4 - resolution: "@useoptic/rulesets-base@npm:1.0.4" +"@useoptic/rulesets-base@npm:1.0.5": + version: 1.0.5 + resolution: "@useoptic/rulesets-base@npm:1.0.5" dependencies: "@stoplight/spectral-core": ^1.8.1 "@stoplight/spectral-rulesets": ^1.14.1 - "@useoptic/json-pointer-helpers": 1.0.4 - "@useoptic/openapi-utilities": 1.0.4 + "@useoptic/json-pointer-helpers": 1.0.5 + "@useoptic/openapi-utilities": 1.0.5 ajv: ^8.6.0 lodash.pick: ^4.4.0 node-fetch: ^2.6.7 semver: ^7.5.4 bin: rulesets-base: build/index.js - checksum: 06a4b885bf429b7804e003eeb2c4de9bb1153dc14e747a6031d535351e933665c554000790071a12d00734b7a58df07717b5c2c6412354fd43ccbca3339a5c81 + checksum: 87ae2da07efb7cacc46d09cd554c0fe1a1a126c222e1c3f6adfe1c2874437a62a5fb481f74ad2661cd58af93ca782ea26ad470c69abf35d68383ce516b720f8e languageName: node linkType: hard -"@useoptic/standard-rulesets@npm:1.0.4": - version: 1.0.4 - resolution: "@useoptic/standard-rulesets@npm:1.0.4" +"@useoptic/standard-rulesets@npm:1.0.5": + version: 1.0.5 + resolution: "@useoptic/standard-rulesets@npm:1.0.5" dependencies: - "@useoptic/openapi-utilities": 1.0.4 - "@useoptic/rulesets-base": 1.0.4 + "@useoptic/openapi-utilities": 1.0.5 + "@useoptic/rulesets-base": 1.0.5 ajv: ^8.6.0 ajv-draft-04: ^1.0.0 ajv-formats: ~2.1.0 @@ -21114,115 +21465,7 @@ __metadata: whatwg-mimetype: ^3.0.0 bin: standard-rulesets: build/index.js - checksum: 9948d3930ed6e83fa06d385cb4639928a21e7aaaa81c9dc793563324dd03ab7c3c98175841855b290f5e6c56b7232dee6837b830ff2c5096cacadbd67d6e22a0 - languageName: node - linkType: hard - -"@vanilla-extract/babel-plugin-debug-ids@npm:^1.1.0": - version: 1.1.0 - resolution: "@vanilla-extract/babel-plugin-debug-ids@npm:1.1.0" - dependencies: - "@babel/core": ^7.23.9 - checksum: b2feec9016ba2dd6740c2ce002d814123f38bf8fc01a6d771eff74ed8108abefdc9d6507e2045587d2a73d8a538ece867e4bfef8c5ccc2b13095a2c825160e7a - languageName: node - linkType: hard - -"@vanilla-extract/css@npm:^1.16.0, @vanilla-extract/css@npm:^1.16.1": - version: 1.16.1 - resolution: "@vanilla-extract/css@npm:1.16.1" - dependencies: - "@emotion/hash": ^0.9.0 - "@vanilla-extract/private": ^1.0.6 - css-what: ^6.1.0 - cssesc: ^3.0.0 - csstype: ^3.0.7 - dedent: ^1.5.3 - deep-object-diff: ^1.1.9 - deepmerge: ^4.2.2 - lru-cache: ^10.4.3 - media-query-parser: ^2.0.2 - modern-ahocorasick: ^1.0.0 - picocolors: ^1.0.0 - checksum: ff58f32778cbc15458aff951ad771ba46f772d78633ff99f849f590b83a22ce67e017af28351c68c32edcdaae4454146dd90f369842a627ee79dc9c3ab434e1e - languageName: node - linkType: hard - -"@vanilla-extract/dynamic@npm:^2.1.2": - version: 2.1.2 - resolution: "@vanilla-extract/dynamic@npm:2.1.2" - dependencies: - "@vanilla-extract/private": ^1.0.6 - checksum: ec6ec9b02c7ec8a9d60aebf63225fd3f930c06ad824321f03f683f1948eb6d4e554d934303da140b3230b4af2fa15bab494c6da2a3b9a172e4118c245b4f942a - languageName: node - linkType: hard - -"@vanilla-extract/integration@npm:^7.1.11": - version: 7.1.11 - resolution: "@vanilla-extract/integration@npm:7.1.11" - dependencies: - "@babel/core": ^7.23.9 - "@babel/plugin-syntax-typescript": ^7.23.3 - "@vanilla-extract/babel-plugin-debug-ids": ^1.1.0 - "@vanilla-extract/css": ^1.16.1 - dedent: ^1.5.3 - esbuild: "npm:esbuild@>=0.17.6 <0.24.0" - eval: 0.1.8 - find-up: ^5.0.0 - javascript-stringify: ^2.0.1 - mlly: ^1.4.2 - vite: ^5.0.11 - vite-node: ^1.2.0 - checksum: 23196f388045c0cdaa35bf26cf484ca4423e336026770b743017056aed7704c74c2134b425571eee9c6859ed1a1553a435e4d0c502ff5a78f8dc2c02db00707a - languageName: node - linkType: hard - -"@vanilla-extract/private@npm:^1.0.6": - version: 1.0.6 - resolution: "@vanilla-extract/private@npm:1.0.6" - checksum: 2265b02af29d8cd40f6ddeeed197fb2df1a7695f5a9821d5e3597677179be8b83bcd8fe4df4a6178544f89123d745a3c6a13599d4fe4e5873b065a8ad329f690 - languageName: node - linkType: hard - -"@vanilla-extract/recipes@npm:^0.5.5": - version: 0.5.5 - resolution: "@vanilla-extract/recipes@npm:0.5.5" - peerDependencies: - "@vanilla-extract/css": ^1.0.0 - checksum: 8d2b4f8163369424226ec9a47e754002b8a095bcf86c1a60a91b2183f59508519bd31ed41baefc950ad7ca225d75b3184c3b84d3c741c5c60d91618dd70452aa - languageName: node - linkType: hard - -"@vanilla-extract/rollup-plugin@npm:^1.3.10": - version: 1.3.11 - resolution: "@vanilla-extract/rollup-plugin@npm:1.3.11" - dependencies: - "@vanilla-extract/integration": ^7.1.11 - peerDependencies: - rollup: ^2.0.0 || ^3.0.0 || ^4.0.0 - checksum: 2e38981d156f8db962dedfc64131adbe8bd5ec9236686dccec92f3418d43d658f2f3a5797456f67eeb43ce75dcc84f9593e4f073e0e42c6df31d4e3ba6a59785 - languageName: node - linkType: hard - -"@vanilla-extract/sprinkles@npm:^1.6.3": - version: 1.6.3 - resolution: "@vanilla-extract/sprinkles@npm:1.6.3" - peerDependencies: - "@vanilla-extract/css": ^1.0.0 - checksum: 7eb4fe0f1a6048bf5ffb5ffab964c2d127ff95244da79dca2e448af380b591c7af3b4f63ab243584baa8a42c7694d8fe9eeb366587a2da381a481fe1a9e02af8 - languageName: node - linkType: hard - -"@vanilla-extract/webpack-plugin@npm:^2.3.14": - version: 2.3.15 - resolution: "@vanilla-extract/webpack-plugin@npm:2.3.15" - dependencies: - "@vanilla-extract/integration": ^7.1.11 - debug: ^4.3.1 - loader-utils: ^2.0.0 - picocolors: ^1.0.0 - peerDependencies: - webpack: ^4.30.0 || ^5.20.2 - checksum: 105540377d0eb19f8dafcd2cc2cf893471494d4b82012574d4b70c32351ef78b6107ffaecf188a7a6edc10e70bd2963c4fd13ff16954f8063bb785aab98070dd + checksum: cd251ae71a9d488a15b6fca7a21df91c1532972e57d4a5e9edad11bbaeb80621c5c19d17fa906360a2628fab6543a257ab74fcb039198c076741460f9fd4e9e2 languageName: node linkType: hard @@ -22288,12 +22531,10 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: ^4.3.4 - checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 87bb7ee54f5ecf0ccbfcba0b07473885c43ecd76cb29a8db17d6137a19d9f9cd443a2a7c5fd8a3f24d58ad8145f9eb49116344a66b107e1aeab82cf2383f4753 languageName: node linkType: hard @@ -22766,13 +23007,13 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "array-buffer-byte-length@npm:1.0.1" +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: - call-bind: ^1.0.5 - is-array-buffer: ^3.0.4 - checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e + call-bound: ^1.0.3 + is-array-buffer: ^3.0.5 + checksum: 0ae3786195c3211b423e5be8dd93357870e6fb66357d81da968c2c39ef43583ef6eece1f9cb1caccdae4806739c65dea832b44b8593414313cd76a89795fca63 languageName: node linkType: hard @@ -22858,15 +23099,15 @@ __metadata: languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flatmap@npm:1.3.2" +"array.prototype.flatmap@npm:^1.3.2, array.prototype.flatmap@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - checksum: ce09fe21dc0bcd4f30271f8144083aa8c13d4639074d6c8dc82054b847c7fc9a0c97f857491f4da19d4003e507172a78f4bcd12903098adac8b9cd374f734be3 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-shim-unscopables: ^1.0.2 + checksum: 11b4de09b1cf008be6031bb507d997ad6f1892e57dc9153583de6ebca0f74ea403fffe0f203461d359de05048d609f3f480d9b46fed4099652d8b62cc972f284 languageName: node linkType: hard @@ -22883,19 +23124,18 @@ __metadata: languageName: node linkType: hard -"arraybuffer.prototype.slice@npm:^1.0.3": - version: 1.0.3 - resolution: "arraybuffer.prototype.slice@npm:1.0.3" +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" dependencies: array-buffer-byte-length: ^1.0.1 - call-bind: ^1.0.5 + call-bind: ^1.0.8 define-properties: ^1.2.1 - es-abstract: ^1.22.3 - es-errors: ^1.2.1 - get-intrinsic: ^1.2.3 + es-abstract: ^1.23.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 is-array-buffer: ^3.0.4 - is-shared-array-buffer: ^1.0.2 - checksum: 352259cba534dcdd969c92ab002efd2ba5025b2e3b9bead3973150edbdf0696c629d7f4b3f061c5931511e8207bdc2306da614703c820b45dabce39e3daf7e3e + checksum: b1d1fd20be4e972a3779b1569226f6740170dca10f07aa4421d42cefeec61391e79c557cda8e771f5baefe47d878178cd4438f60916ce831813c08132bced765 languageName: node linkType: hard @@ -23228,13 +23468,13 @@ __metadata: linkType: hard "axios@npm:^1.0.0, axios@npm:^1.6.0, axios@npm:^1.7.4, axios@npm:^1.7.7": - version: 1.7.8 - resolution: "axios@npm:1.7.8" + version: 1.7.9 + resolution: "axios@npm:1.7.9" dependencies: follow-redirects: ^1.15.6 form-data: ^4.0.0 proxy-from-env: ^1.1.0 - checksum: 3d21652faf8e29fb36c47517d2872bb5e2285127a24f5c53ce23082c4eac7f5a88de84dd49d4a1a83068e5301dcfd9067b41e5fbd00b0d20ab7b0a843559273d + checksum: cb8ce291818effda09240cb60f114d5625909b345e10f389a945320e06acf0bc949d0f8422d25720f5dd421362abee302c99f5e97edec4c156c8939814b23d19 languageName: node linkType: hard @@ -23586,13 +23826,13 @@ __metadata: linkType: hard "better-sqlite3@npm:^11.0.0": - version: 11.6.0 - resolution: "better-sqlite3@npm:11.6.0" + version: 11.7.2 + resolution: "better-sqlite3@npm:11.7.2" dependencies: bindings: ^1.5.0 node-gyp: latest prebuild-install: ^7.1.1 - checksum: 4570559e8b62da295060b086cfe7902648670863790993be1a43e73867f3d9767598aa52fb8332cf3eb16aa30f3037c3705ce5a195db59c076006067e43eea98 + checksum: 396c72b08b26719a3d36abf1d6c870ed5a6d5c86229f5202623a95a5b9d087ea2790a03d99ca6f37cd24e374d3551f3f422a76145e8f2443acc6bde9df3b7c57 languageName: node linkType: hard @@ -24107,13 +24347,6 @@ __metadata: languageName: node linkType: hard -"cac@npm:^6.7.14": - version: 6.7.14 - resolution: "cac@npm:6.7.14" - checksum: 45a2496a9443abbe7f52a49b22fbe51b1905eff46e03fd5e6c98e3f85077be3f8949685a1849b1a9cd2bc3e5567dfebcf64f01ce01847baf918f1b37c839791a - languageName: node - linkType: hard - "cacache@npm:^15.0.3, cacache@npm:^15.0.5, cacache@npm:^15.2.0": version: 15.3.0 resolution: "cacache@npm:15.3.0" @@ -24186,6 +24419,26 @@ __metadata: languageName: node linkType: hard +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": ^4.0.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^10.0.1 + minipass: ^7.0.3 + minipass-collect: ^2.0.1 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^7.0.2 + ssri: ^12.0.0 + tar: ^7.4.3 + unique-filename: ^4.0.0 + checksum: e95684717de6881b4cdaa949fa7574e3171946421cd8291769dd3d2417dbf7abf4aa557d1f968cca83dcbc95bed2a281072b09abfc977c942413146ef7ed4525 + languageName: node + linkType: hard + "cache-content-type@npm:^1.0.0": version: 1.0.1 resolution: "cache-content-type@npm:1.0.1" @@ -24255,16 +24508,35 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1": + version: 1.0.1 + resolution: "call-bind-apply-helpers@npm:1.0.1" dependencies: - es-define-property: ^1.0.0 es-errors: ^1.3.0 function-bind: ^1.1.2 + checksum: 3c55343261bb387c58a4762d15ad9d42053659a62681ec5eb50690c6b52a4a666302a01d557133ce6533e8bd04530ee3b209f23dd06c9577a1925556f8fcccdf + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: ^1.0.0 + es-define-property: ^1.0.0 get-intrinsic: ^1.2.4 - set-function-length: ^1.2.1 - checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 + set-function-length: ^1.2.2 + checksum: aa2899bce917a5392fd73bd32e71799c37c0b7ab454e0ed13af7f6727549091182aade8bbb7b55f304a5bc436d543241c14090fb8a3137e9875e23f444f4f5a9 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3": + version: 1.0.3 + resolution: "call-bound@npm:1.0.3" + dependencies: + call-bind-apply-helpers: ^1.0.1 + get-intrinsic: ^1.2.6 + checksum: a93bbe0f2d0a2d6c144a4349ccd0593d5d0d5d9309b69101710644af8964286420062f2cc3114dca120b9bc8cc07507952d4b1b3ea7672e0d7f6f1675efedb32 languageName: node linkType: hard @@ -24394,7 +24666,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": +"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2, chalk@npm:~4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -24846,7 +25118,7 @@ __metadata: languageName: node linkType: hard -"cluster-key-slot@npm:1.1.2, cluster-key-slot@npm:^1.1.0": +"cluster-key-slot@npm:1.1.2, cluster-key-slot@npm:^1.1.0, cluster-key-slot@npm:^1.1.2": version: 1.1.2 resolution: "cluster-key-slot@npm:1.1.2" checksum: be0ad2d262502adc998597e83f9ded1b80f827f0452127c5a37b22dfca36bab8edf393f7b25bb626006fb9fb2436106939ede6d2d6ecf4229b96a47f27edd681 @@ -25076,7 +25348,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:*, commander@npm:^12.0.0, commander@npm:~12.1.0": +"commander@npm:*, commander@npm:^12.0.0, commander@npm:^12.1.0, commander@npm:~12.1.0": version: 12.1.0 resolution: "commander@npm:12.1.0" checksum: 68e9818b00fc1ed9cdab9eb16905551c2b768a317ae69a5e3c43924c2b20ac9bb65b27e1cab36aeda7b6496376d4da908996ba2c0b5d79463e0fb1e77935d514 @@ -25310,13 +25582,6 @@ __metadata: languageName: node linkType: hard -"confbox@npm:^0.1.8": - version: 0.1.8 - resolution: "confbox@npm:0.1.8" - checksum: 5c7718ab22cf9e35a31c21ef124156076ae8c9dc65e6463d54961caf5a1d529284485a0fdf83fd23b27329f3b75b0c8c07d2e36c699f5151a2efe903343f976a - languageName: node - linkType: hard - "configstore@npm:^5.0.1": version: 5.0.1 resolution: "configstore@npm:5.0.1" @@ -25727,21 +25992,21 @@ __metadata: linkType: hard "cron@npm:^3.0.0": - version: 3.2.1 - resolution: "cron@npm:3.2.1" + version: 3.3.2 + resolution: "cron@npm:3.3.2" dependencies: "@types/luxon": ~3.4.0 luxon: ~3.5.0 - checksum: 349419d702385e9a6ad08d2b571d544df97009be37cde6a4c4e5b31118ca806d9501d784d74e84236a49233c7469e322c3d2c14867009a7a3b2e644b7ade0a0e + checksum: 7a1a1c12857a8de7fbbe92b1efacdf66ee856df8eb7a6bb3b90e0b1ba972c4689ff132e59c75967a1c62a21278c419b2c8798357530e69b234bd87748bb4cfb9 languageName: node linkType: hard "cronstrue@npm:^2.2.0, cronstrue@npm:^2.32.0": - version: 2.51.0 - resolution: "cronstrue@npm:2.51.0" + version: 2.52.0 + resolution: "cronstrue@npm:2.52.0" bin: cronstrue: bin/cli.js - checksum: 7487eeb7bdb9bc8882ede5d3f1cadf73dec44f1da8d29b8ebb0312f85413cd300842ce0c6c49beb66e549917d48f699dfd8b9585d00050c5571c3f8cbf091ac6 + checksum: bfe4d8a58d74ba4a987ea6fe65917529451c648e2abe072d22a6ad4c750f4a7ae9d01321c999594b59cb138990ca43537505e759c23811bbffa606956fff5c55 languageName: node linkType: hard @@ -25808,7 +26073,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -25890,7 +26155,7 @@ __metadata: languageName: node linkType: hard -"css-loader@npm:^6.7.1": +"css-loader@npm:^6.5.1, css-loader@npm:^6.7.1": version: 6.11.0 resolution: "css-loader@npm:6.11.0" dependencies: @@ -25914,30 +26179,6 @@ __metadata: languageName: node linkType: hard -"css-loader@npm:^7.0.0": - version: 7.1.2 - resolution: "css-loader@npm:7.1.2" - dependencies: - icss-utils: ^5.1.0 - postcss: ^8.4.33 - postcss-modules-extract-imports: ^3.1.0 - postcss-modules-local-by-default: ^4.0.5 - postcss-modules-scope: ^3.2.0 - postcss-modules-values: ^4.0.0 - postcss-value-parser: ^4.2.0 - semver: ^7.5.4 - peerDependencies: - "@rspack/core": 0.x || 1.x - webpack: ^5.27.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - webpack: - optional: true - checksum: 15bfd90d778ddab90ee1d04c8c8bcc13ea6c0791d01b52b09d1b1c753b3410f7a7788a510d93726a9878e70b7c1a140f21efdf5c96e1857872107551d3897822 - languageName: node - linkType: hard - "css-select@npm:^4.1.3, css-select@npm:^4.2.1": version: 4.3.0 resolution: "css-select@npm:4.3.0" @@ -26128,7 +26369,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2, csstype@npm:^3.0.7, csstype@npm:^3.1.2, csstype@npm:^3.1.3": +"csstype@npm:^3.0.2, csstype@npm:^3.1.2, csstype@npm:^3.1.3": version: 3.0.9 resolution: "csstype@npm:3.0.9" checksum: 199f9af7e673f9f188525c3102a329d637ff46c52f6385a4427ff5cb17adcb736189150170a7af7c5701d18d7704bdad130273f4aa7e44c6c4f9967e6115dc93 @@ -26304,43 +26545,43 @@ __metadata: languageName: node linkType: hard -"data-view-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-buffer@npm:1.0.1" +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" dependencies: - call-bind: ^1.0.6 + call-bound: ^1.0.3 es-errors: ^1.3.0 - is-data-view: ^1.0.1 - checksum: ce24348f3c6231223b216da92e7e6a57a12b4af81a23f27eff8feabdf06acfb16c00639c8b705ca4d167f761cfc756e27e5f065d0a1f840c10b907fdaf8b988c + is-data-view: ^1.0.2 + checksum: 1e1cd509c3037ac0f8ba320da3d1f8bf1a9f09b0be09394b5e40781b8cc15ff9834967ba7c9f843a425b34f9fe14ce44cf055af6662c44263424c1eb8d65659b languageName: node linkType: hard -"data-view-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-length@npm:1.0.1" +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" dependencies: - call-bind: ^1.0.7 + call-bound: ^1.0.3 es-errors: ^1.3.0 - is-data-view: ^1.0.1 - checksum: dbb3200edcb7c1ef0d68979834f81d64fd8cab2f7691b3a4c6b97e67f22182f3ec2c8602efd7b76997b55af6ff8bce485829c1feda4fa2165a6b71fb7baa4269 + is-data-view: ^1.0.2 + checksum: 3600c91ced1cfa935f19ef2abae11029e01738de8d229354d3b2a172bf0d7e4ed08ff8f53294b715569fdf72dfeaa96aa7652f479c0f60570878d88e7e8bddf6 languageName: node linkType: hard -"data-view-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "data-view-byte-offset@npm:1.0.0" +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" dependencies: - call-bind: ^1.0.6 + call-bound: ^1.0.2 es-errors: ^1.3.0 is-data-view: ^1.0.1 - checksum: 7f0bf8720b7414ca719eedf1846aeec392f2054d7af707c5dc9a753cc77eb8625f067fa901e0b5127e831f9da9056138d894b9c2be79c27a21f6db5824f009c2 + checksum: 8dd492cd51d19970876626b5b5169fbb67ca31ec1d1d3238ee6a71820ca8b80cafb141c485999db1ee1ef02f2cc3b99424c5eda8d59e852d9ebb79ab290eb5ee languageName: node linkType: hard "dataloader@npm:^2.0.0, dataloader@npm:^2.2.2": - version: 2.2.2 - resolution: "dataloader@npm:2.2.2" - checksum: 4dabd247089c29f194e94d5434d504f99156c5c214a03463c20f3f17f40398d7e179edee69a27c16e315519ac8739042a810090087ae26449a0e685156a02c65 + version: 2.2.3 + resolution: "dataloader@npm:2.2.3" + checksum: cc272181f6cad0ea20511c0a0d270cbc1df960a3526ab24941bbeb2cb7120499a598fe2cd41b4818527367acf7bc1be0723b6e5034637db4759a396c904b78a6 languageName: node linkType: hard @@ -26406,15 +26647,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:~4.3.6": - version: 4.3.7 - resolution: "debug@npm:4.3.7" +"debug@npm:4, debug@npm:^4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.4.0, debug@npm:~4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" dependencies: ms: ^2.1.3 peerDependenciesMeta: supports-color: optional: true - checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 + checksum: fb42df878dd0e22816fc56e1fdca9da73caa85212fbe40c868b1295a6878f9101ae684f4eeef516c13acfc700f5ea07f1136954f43d4cd2d477a811144136479 languageName: node linkType: hard @@ -26494,7 +26735,7 @@ __metadata: languageName: node linkType: hard -"dedent@npm:^1.0.0, dedent@npm:^1.5.3": +"dedent@npm:^1.0.0": version: 1.5.3 resolution: "dedent@npm:1.5.3" peerDependencies: @@ -26534,13 +26775,6 @@ __metadata: languageName: node linkType: hard -"deep-object-diff@npm:^1.1.9": - version: 1.1.9 - resolution: "deep-object-diff@npm:1.1.9" - checksum: ecd42455e4773f653595d28070295e7aaa8402db5f8ab21d0bec115a7cb4de5e207a5665514767da5f025c96597f1d3a0a4888aeb4dd49e03c996871a3aa05ef - languageName: node - linkType: hard - "deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.1, deepmerge@npm:~4.3.0": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" @@ -27151,6 +27385,17 @@ __metadata: languageName: node linkType: hard +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: ^1.0.1 + es-errors: ^1.3.0 + gopd: ^1.2.0 + checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 + languageName: node + linkType: hard + "duplexer3@npm:^0.1.4": version: 0.1.5 resolution: "duplexer3@npm:0.1.5" @@ -27434,7 +27679,7 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.3.0, enquirer@npm:^2.3.6": +"enquirer@npm:^2.3.6, enquirer@npm:^2.4.1": version: 2.4.1 resolution: "enquirer@npm:2.4.1" dependencies: @@ -27495,12 +27740,12 @@ __metadata: languageName: node linkType: hard -"error-stack-parser@npm:^2.0.6": - version: 2.0.6 - resolution: "error-stack-parser@npm:2.0.6" +"error-stack-parser@npm:^2.0.6, error-stack-parser@npm:^2.1.4": + version: 2.1.4 + resolution: "error-stack-parser@npm:2.1.4" dependencies: - stackframe: ^1.1.1 - checksum: bd8e048fcb1c0c74ab201271fec3b39c097a7c24bdef1718828d053c0584da5d7ad845253b5e4773803ee8e7450b23b0920e60a3b60dd403c1568c843058cb12 + stackframe: ^1.3.4 + checksum: 3b916d2d14c6682f287c8bfa28e14672f47eafe832701080e420e7cdbaebb2c50293868256a95706ac2330fe078cf5664713158b49bc30d7a5f2ac229ded0e18 languageName: node linkType: hard @@ -27511,57 +27756,58 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.5, es-abstract@npm:^1.20.4, es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": - version: 1.23.3 - resolution: "es-abstract@npm:1.23.3" +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.20.4, es-abstract@npm:^1.22.1, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6": + version: 1.23.7 + resolution: "es-abstract@npm:1.23.7" dependencies: - array-buffer-byte-length: ^1.0.1 - arraybuffer.prototype.slice: ^1.0.3 + array-buffer-byte-length: ^1.0.2 + arraybuffer.prototype.slice: ^1.0.4 available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 - data-view-buffer: ^1.0.1 - data-view-byte-length: ^1.0.1 - data-view-byte-offset: ^1.0.0 - es-define-property: ^1.0.0 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + data-view-buffer: ^1.0.2 + data-view-byte-length: ^1.0.2 + data-view-byte-offset: ^1.0.1 + es-define-property: ^1.0.1 es-errors: ^1.3.0 es-object-atoms: ^1.0.0 es-set-tostringtag: ^2.0.3 - es-to-primitive: ^1.2.1 - function.prototype.name: ^1.1.6 - get-intrinsic: ^1.2.4 - get-symbol-description: ^1.0.2 - globalthis: ^1.0.3 - gopd: ^1.0.1 + es-to-primitive: ^1.3.0 + function.prototype.name: ^1.1.8 + get-intrinsic: ^1.2.6 + get-symbol-description: ^1.1.0 + globalthis: ^1.0.4 + gopd: ^1.2.0 has-property-descriptors: ^1.0.2 - has-proto: ^1.0.3 - has-symbols: ^1.0.3 + has-proto: ^1.2.0 + has-symbols: ^1.1.0 hasown: ^2.0.2 - internal-slot: ^1.0.7 - is-array-buffer: ^3.0.4 + internal-slot: ^1.1.0 + is-array-buffer: ^3.0.5 is-callable: ^1.2.7 - is-data-view: ^1.0.1 - is-negative-zero: ^2.0.3 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.3 - is-string: ^1.0.7 - is-typed-array: ^1.1.13 - is-weakref: ^1.0.2 - object-inspect: ^1.13.1 + is-data-view: ^1.0.2 + is-regex: ^1.2.1 + is-shared-array-buffer: ^1.0.4 + is-string: ^1.1.1 + is-typed-array: ^1.1.15 + is-weakref: ^1.1.0 + math-intrinsics: ^1.1.0 + object-inspect: ^1.13.3 object-keys: ^1.1.1 - object.assign: ^4.1.5 - regexp.prototype.flags: ^1.5.2 - safe-array-concat: ^1.1.2 - safe-regex-test: ^1.0.3 - string.prototype.trim: ^1.2.9 - string.prototype.trimend: ^1.0.8 + object.assign: ^4.1.7 + regexp.prototype.flags: ^1.5.3 + safe-array-concat: ^1.1.3 + safe-regex-test: ^1.1.0 + string.prototype.trim: ^1.2.10 + string.prototype.trimend: ^1.0.9 string.prototype.trimstart: ^1.0.8 - typed-array-buffer: ^1.0.2 - typed-array-byte-length: ^1.0.1 - typed-array-byte-offset: ^1.0.2 - typed-array-length: ^1.0.6 - unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.15 - checksum: f840cf161224252512f9527306b57117192696571e07920f777cb893454e32999206198b4f075516112af6459daca282826d1735c450528470356d09eff3a9ae + typed-array-buffer: ^1.0.3 + typed-array-byte-length: ^1.0.3 + typed-array-byte-offset: ^1.0.4 + typed-array-length: ^1.0.7 + unbox-primitive: ^1.1.0 + which-typed-array: ^1.1.18 + checksum: 030f09ff2d7db69cd6c6da5b1ccb88aee986e23cf82149135f78b5b9675f1cd79a0e64de2d7e393ae40b98de76369292d87bf31db69b5b9151370f7948ee7c59 languageName: node linkType: hard @@ -27580,41 +27826,41 @@ __metadata: languageName: node linkType: hard -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: ^1.2.4 - checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a languageName: node linkType: hard -"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": +"es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 languageName: node linkType: hard -"es-iterator-helpers@npm:^1.1.0": - version: 1.1.0 - resolution: "es-iterator-helpers@npm:1.1.0" +"es-iterator-helpers@npm:^1.2.1": + version: 1.2.1 + resolution: "es-iterator-helpers@npm:1.2.1" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.3 define-properties: ^1.2.1 - es-abstract: ^1.23.3 + es-abstract: ^1.23.6 es-errors: ^1.3.0 es-set-tostringtag: ^2.0.3 function-bind: ^1.1.2 - get-intrinsic: ^1.2.4 + get-intrinsic: ^1.2.6 globalthis: ^1.0.4 + gopd: ^1.2.0 has-property-descriptors: ^1.0.2 - has-proto: ^1.0.3 - has-symbols: ^1.0.3 - internal-slot: ^1.0.7 - iterator.prototype: ^1.1.3 - safe-array-concat: ^1.1.2 - checksum: 4ba3a32ab7ba05b85f0ae30604feeb8ffd801fe762e9df9577bd220a96b9eaa2e90af8e6bdc498e523051f293955e2f7d2bddd34de71e1428a1b8ff3fd961016 + has-proto: ^1.2.0 + has-symbols: ^1.1.0 + internal-slot: ^1.1.0 + iterator.prototype: ^1.1.4 + safe-array-concat: ^1.1.3 + checksum: 952808dd1df3643d67ec7adf20c30b36e5eecadfbf36354e6f39ed3266c8e0acf3446ce9bc465e38723d613cb1d915c1c07c140df65bdce85da012a6e7bda62b languageName: node linkType: hard @@ -27654,14 +27900,14 @@ __metadata: languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + is-callable: ^1.2.7 + is-date-object: ^1.0.5 + is-symbol: ^1.0.4 + checksum: 966965880356486cd4d1fe9a523deda2084c81b3702d951212c098f5f2ee93605d1b7c1840062efb48a07d892641c7ed1bc194db563645c0dd2b919cb6d65b93 languageName: node linkType: hard @@ -27743,33 +27989,34 @@ __metadata: linkType: hard "esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0, esbuild@npm:^0.24.0": - version: 0.24.0 - resolution: "esbuild@npm:0.24.0" + version: 0.24.2 + resolution: "esbuild@npm:0.24.2" dependencies: - "@esbuild/aix-ppc64": 0.24.0 - "@esbuild/android-arm": 0.24.0 - "@esbuild/android-arm64": 0.24.0 - "@esbuild/android-x64": 0.24.0 - "@esbuild/darwin-arm64": 0.24.0 - "@esbuild/darwin-x64": 0.24.0 - "@esbuild/freebsd-arm64": 0.24.0 - "@esbuild/freebsd-x64": 0.24.0 - "@esbuild/linux-arm": 0.24.0 - "@esbuild/linux-arm64": 0.24.0 - "@esbuild/linux-ia32": 0.24.0 - "@esbuild/linux-loong64": 0.24.0 - "@esbuild/linux-mips64el": 0.24.0 - "@esbuild/linux-ppc64": 0.24.0 - "@esbuild/linux-riscv64": 0.24.0 - "@esbuild/linux-s390x": 0.24.0 - "@esbuild/linux-x64": 0.24.0 - "@esbuild/netbsd-x64": 0.24.0 - "@esbuild/openbsd-arm64": 0.24.0 - "@esbuild/openbsd-x64": 0.24.0 - "@esbuild/sunos-x64": 0.24.0 - "@esbuild/win32-arm64": 0.24.0 - "@esbuild/win32-ia32": 0.24.0 - "@esbuild/win32-x64": 0.24.0 + "@esbuild/aix-ppc64": 0.24.2 + "@esbuild/android-arm": 0.24.2 + "@esbuild/android-arm64": 0.24.2 + "@esbuild/android-x64": 0.24.2 + "@esbuild/darwin-arm64": 0.24.2 + "@esbuild/darwin-x64": 0.24.2 + "@esbuild/freebsd-arm64": 0.24.2 + "@esbuild/freebsd-x64": 0.24.2 + "@esbuild/linux-arm": 0.24.2 + "@esbuild/linux-arm64": 0.24.2 + "@esbuild/linux-ia32": 0.24.2 + "@esbuild/linux-loong64": 0.24.2 + "@esbuild/linux-mips64el": 0.24.2 + "@esbuild/linux-ppc64": 0.24.2 + "@esbuild/linux-riscv64": 0.24.2 + "@esbuild/linux-s390x": 0.24.2 + "@esbuild/linux-x64": 0.24.2 + "@esbuild/netbsd-arm64": 0.24.2 + "@esbuild/netbsd-x64": 0.24.2 + "@esbuild/openbsd-arm64": 0.24.2 + "@esbuild/openbsd-x64": 0.24.2 + "@esbuild/sunos-x64": 0.24.2 + "@esbuild/win32-arm64": 0.24.2 + "@esbuild/win32-ia32": 0.24.2 + "@esbuild/win32-x64": 0.24.2 dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -27805,6 +28052,8 @@ __metadata: optional: true "@esbuild/linux-x64": optional: true + "@esbuild/netbsd-arm64": + optional: true "@esbuild/netbsd-x64": optional: true "@esbuild/openbsd-arm64": @@ -27821,7 +28070,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: dd386d92a05c7eb03078480522cdd8b40c434777b5f08487c27971d30933ecaae3f08bd221958dd8f9c66214915cdc85f844283ca9bdbf8ee703d889ae526edd + checksum: e2303f8331887e31330b5a972fb9640ad93dfc5af76cb2156faa9eaa32bac5c403244096cbdafc45622829913e63664dfd88410987e3468df4354492f908a094 languageName: node linkType: hard @@ -27914,89 +28163,6 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:esbuild@>=0.17.6 <0.24.0": - version: 0.23.1 - resolution: "esbuild@npm:0.23.1" - dependencies: - "@esbuild/aix-ppc64": 0.23.1 - "@esbuild/android-arm": 0.23.1 - "@esbuild/android-arm64": 0.23.1 - "@esbuild/android-x64": 0.23.1 - "@esbuild/darwin-arm64": 0.23.1 - "@esbuild/darwin-x64": 0.23.1 - "@esbuild/freebsd-arm64": 0.23.1 - "@esbuild/freebsd-x64": 0.23.1 - "@esbuild/linux-arm": 0.23.1 - "@esbuild/linux-arm64": 0.23.1 - "@esbuild/linux-ia32": 0.23.1 - "@esbuild/linux-loong64": 0.23.1 - "@esbuild/linux-mips64el": 0.23.1 - "@esbuild/linux-ppc64": 0.23.1 - "@esbuild/linux-riscv64": 0.23.1 - "@esbuild/linux-s390x": 0.23.1 - "@esbuild/linux-x64": 0.23.1 - "@esbuild/netbsd-x64": 0.23.1 - "@esbuild/openbsd-arm64": 0.23.1 - "@esbuild/openbsd-x64": 0.23.1 - "@esbuild/sunos-x64": 0.23.1 - "@esbuild/win32-arm64": 0.23.1 - "@esbuild/win32-ia32": 0.23.1 - "@esbuild/win32-x64": 0.23.1 - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 0413c3b9257327fb598427688b7186ea335bf1693746fe5713cc93c95854d6388b8ed4ad643fddf5b5ace093f7dcd9038dd58e087bf2da1f04dfb4c5571660af - languageName: node - linkType: hard - "escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -28130,21 +28296,21 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-deprecation@npm:^2.0.0": - version: 2.0.0 - resolution: "eslint-plugin-deprecation@npm:2.0.0" +"eslint-plugin-deprecation@npm:^3.0.0": + version: 3.0.0 + resolution: "eslint-plugin-deprecation@npm:3.0.0" dependencies: - "@typescript-eslint/utils": ^6.0.0 + "@typescript-eslint/utils": ^7.0.0 + ts-api-utils: ^1.3.0 tslib: ^2.3.1 - tsutils: ^3.21.0 peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.0.0 typescript: ^4.2.4 || ^5.0.0 - checksum: d79611e902ac419a21e51eab582fcdbcf8170aff820c5e5197e7d242e7ca6bda59c0077d88404970c25993017398dd65c96df7d31a833e332d45dd330935324b + checksum: 702549a4438da736b4e58caeafda6ab748ea7ecbbeca79eeb01b4ea25d7504590c3f10caf7c49faa2b76ae9ec9d0b79ede48c171fcc3b724cf3231fbb0bccaa6 languageName: node linkType: hard -"eslint-plugin-import@npm:^2.25.4": +"eslint-plugin-import@npm:^2.31.0": version: 2.31.0 resolution: "eslint-plugin-import@npm:2.31.0" dependencies: @@ -28173,7 +28339,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jest@npm:^28.0.0": +"eslint-plugin-jest@npm:^28.9.0": version: 28.9.0 resolution: "eslint-plugin-jest@npm:28.9.0" dependencies: @@ -28191,7 +28357,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jsx-a11y@npm:^6.5.1": +"eslint-plugin-jsx-a11y@npm:^6.10.2": version: 6.10.2 resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" dependencies: @@ -28229,40 +28395,40 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-hooks@npm:^4.3.0": - version: 4.6.2 - resolution: "eslint-plugin-react-hooks@npm:4.6.2" +"eslint-plugin-react-hooks@npm:^5.0.0": + version: 5.1.0 + resolution: "eslint-plugin-react-hooks@npm:5.1.0" peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 395c433610f59577cfcf3f2e42bcb130436c8a0b3777ac64f441d88c5275f4fcfc89094cedab270f2822daf29af1079151a7a6579a8e9ea8cee66540ba0384c4 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + checksum: 14d2692214ea15b19ef330a9abf51cb8c1586339d9e758ebd61b182be68dd772af56462b04e4b9d2be923d72f46db61e8d32fcf37c248b04949c0b02f5bfb3c0 languageName: node linkType: hard -"eslint-plugin-react@npm:^7.28.0": - version: 7.37.2 - resolution: "eslint-plugin-react@npm:7.37.2" +"eslint-plugin-react@npm:^7.28.0, eslint-plugin-react@npm:^7.37.2": + version: 7.37.3 + resolution: "eslint-plugin-react@npm:7.37.3" dependencies: array-includes: ^3.1.8 array.prototype.findlast: ^1.2.5 - array.prototype.flatmap: ^1.3.2 + array.prototype.flatmap: ^1.3.3 array.prototype.tosorted: ^1.1.4 doctrine: ^2.1.0 - es-iterator-helpers: ^1.1.0 + es-iterator-helpers: ^1.2.1 estraverse: ^5.3.0 hasown: ^2.0.2 jsx-ast-utils: ^2.4.1 || ^3.0.0 minimatch: ^3.1.2 object.entries: ^1.1.8 object.fromentries: ^2.0.8 - object.values: ^1.2.0 + object.values: ^1.2.1 prop-types: ^15.8.1 resolve: ^2.0.0-next.5 semver: ^6.3.1 - string.prototype.matchall: ^4.0.11 + string.prototype.matchall: ^4.0.12 string.prototype.repeat: ^1.0.0 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - checksum: 7f5203afee7fbe3702b27fdd2b9a3c0ccbbb47d0672f58311b9d8a08dea819c9da4a87c15e8bd508f2562f327a9d29ee8bd9cd189bf758d8dc903de5648b0bfa + checksum: 670dcee215f560a394b8b9966aecfc3c5ee5c15603a690f5333b0e16863275958f9c1853b12355eb0e36ef74dfac8bf645e4f440cb9b985a3bae2ac09d5ed55a languageName: node linkType: hard @@ -28290,25 +28456,16 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-unused-imports@npm:^3.0.0": - version: 3.2.0 - resolution: "eslint-plugin-unused-imports@npm:3.2.0" - dependencies: - eslint-rule-composer: ^0.3.0 +"eslint-plugin-unused-imports@npm:^4.1.4": + version: 4.1.4 + resolution: "eslint-plugin-unused-imports@npm:4.1.4" peerDependencies: - "@typescript-eslint/eslint-plugin": 6 - 7 - eslint: 8 + "@typescript-eslint/eslint-plugin": ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^9.0.0 || ^8.0.0 peerDependenciesMeta: "@typescript-eslint/eslint-plugin": optional: true - checksum: e85ae4f3af489294ef5e0969ab904fa87f9fa7c959ca0804f30845438db4aeb0428ddad7ab06a70608e93121626799977241b442fdf126a4d0667be57390c3d6 - languageName: node - linkType: hard - -"eslint-rule-composer@npm:^0.3.0": - version: 0.3.0 - resolution: "eslint-rule-composer@npm:0.3.0" - checksum: c2f57cded8d1c8f82483e0ce28861214347e24fd79fd4144667974cd334d718f4ba05080aaef2399e3bbe36f7d6632865110227e6b176ed6daa2d676df9281b1 + checksum: 1f4ce3e3972699345513840f3af1b783033dbc3a3e85b62ce12b3f6a89fd8c92afe46d0c00af40bacb14465445983ba0ccc326a6fd5132553061fb0e47bcba19 languageName: node linkType: hard @@ -28332,6 +28489,16 @@ __metadata: languageName: node linkType: hard +"eslint-scope@npm:^8.2.0": + version: 8.2.0 + resolution: "eslint-scope@npm:8.2.0" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: 750eff4672ca2bf274ec0d1bbeae08aadd53c1907d5c6aff5564d8e047a5f49afa8ae6eee333cab637fd3ebcab2141659d8f2f040f6fdc982b0f61f8bf03136f + languageName: node + linkType: hard + "eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" @@ -28346,7 +28513,7 @@ __metadata: languageName: node linkType: hard -"eslint-webpack-plugin@npm:^4.0.0": +"eslint-webpack-plugin@npm:^4.2.0": version: 4.2.0 resolution: "eslint-webpack-plugin@npm:4.2.0" dependencies: @@ -28410,6 +28577,55 @@ __metadata: languageName: node linkType: hard +"eslint@npm:^9.17.0": + version: 9.17.0 + resolution: "eslint@npm:9.17.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.12.1 + "@eslint/config-array": ^0.19.0 + "@eslint/core": ^0.9.0 + "@eslint/eslintrc": ^3.2.0 + "@eslint/js": 9.17.0 + "@eslint/plugin-kit": ^0.2.3 + "@humanfs/node": ^0.16.6 + "@humanwhocodes/module-importer": ^1.0.1 + "@humanwhocodes/retry": ^0.4.1 + "@types/estree": ^1.0.6 + "@types/json-schema": ^7.0.15 + ajv: ^6.12.4 + chalk: ^4.0.0 + cross-spawn: ^7.0.6 + debug: ^4.3.2 + escape-string-regexp: ^4.0.0 + eslint-scope: ^8.2.0 + eslint-visitor-keys: ^4.2.0 + espree: ^10.3.0 + esquery: ^1.5.0 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^8.0.0 + find-up: ^5.0.0 + glob-parent: ^6.0.2 + ignore: ^5.2.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + json-stable-stringify-without-jsonify: ^1.0.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.3 + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true + bin: + eslint: bin/eslint.js + checksum: 0caae58c53bf4dc9b4893d75e62339e4c40fe5589652a3cb63f30a15bad1f34f8f784ca4fca471bbffedabee516a9f9620ebc33818b55e1b715e8f000865c851 + languageName: node + linkType: hard + "esm@npm:^3.2.25": version: 3.2.25 resolution: "esm@npm:3.2.25" @@ -28429,6 +28645,17 @@ __metadata: languageName: node linkType: hard +"espree@npm:^10.0.1, espree@npm:^10.3.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" + dependencies: + acorn: ^8.14.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^4.2.0 + checksum: 63e8030ff5a98cea7f8b3e3a1487c998665e28d674af08b9b3100ed991670eb3cbb0e308c4548c79e03762753838fbe530c783f17309450d6b47a889fee72bef + languageName: node + linkType: hard + "espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" @@ -28460,12 +28687,12 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" +"esquery@npm:^1.4.2, esquery@npm:^1.5.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: ^5.1.0 - checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + checksum: 08ec4fe446d9ab27186da274d979558557fbdbbd10968fa9758552482720c54152a5640e08b9009e5a30706b66aba510692054d4129d32d0e12e05bbc0b96fb2 languageName: node linkType: hard @@ -28529,16 +28756,6 @@ __metadata: languageName: node linkType: hard -"eval@npm:0.1.8": - version: 0.1.8 - resolution: "eval@npm:0.1.8" - dependencies: - "@types/node": "*" - require-like: ">= 0.1.1" - checksum: d005567f394cfbe60948e34982e4637d2665030f9aa7dcac581ea6f9ec6eceb87133ed3dc0ae21764aa362485c242a731dbb6371f1f1a86807c58676431e9d1a - languageName: node - linkType: hard - "event-emitter@npm:^0.3.5": version: 0.3.5 resolution: "event-emitter@npm:0.3.5" @@ -28844,7 +29061,7 @@ __metadata: "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-signals-backend": "workspace:^" "@backstage/plugin-techdocs-backend": "workspace:^" - "@opentelemetry/auto-instrumentations-node": ^0.52.0 + "@opentelemetry/auto-instrumentations-node": ^0.54.0 "@opentelemetry/exporter-prometheus": ^0.54.0 "@opentelemetry/sdk-node": ^0.54.0 example-app: "link:../app" @@ -29037,8 +29254,8 @@ __metadata: linkType: hard "express@npm:^4.14.0, express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.1, express@npm:^4.18.2, express@npm:^4.19.2": - version: 4.21.1 - resolution: "express@npm:4.21.1" + version: 4.21.2 + resolution: "express@npm:4.21.2" dependencies: accepts: ~1.3.8 array-flatten: 1.1.1 @@ -29059,7 +29276,7 @@ __metadata: methods: ~1.1.2 on-finished: 2.4.1 parseurl: ~1.3.3 - path-to-regexp: 0.1.10 + path-to-regexp: 0.1.12 proxy-addr: ~2.0.7 qs: 6.13.0 range-parser: ~1.2.1 @@ -29071,7 +29288,7 @@ __metadata: type-is: ~1.6.18 utils-merge: 1.0.1 vary: ~1.1.2 - checksum: 5ac2b26d8aeddda5564fc0907227d29c100f90c0ead2ead9d474dc5108e8fb306c2de2083c4e3ba326e0906466f2b73417dbac16961f4075ff9f03785fd940fe + checksum: 3aef1d355622732e20b8f3a7c112d4391d44e2131f4f449e1f273a309752a41abfad714e881f177645517cbe29b3ccdc10b35e7e25c13506114244a5b72f549d languageName: node linkType: hard @@ -29381,6 +29598,15 @@ __metadata: languageName: node linkType: hard +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" + dependencies: + flat-cache: ^4.0.0 + checksum: f67802d3334809048c69b3d458f672e1b6d26daefda701761c81f203b80149c35dea04d78ea4238969dd617678e530876722a0634c43031a0957f10cc3ed190f + languageName: node + linkType: hard + "file-type@npm:3.9.0": version: 3.9.0 resolution: "file-type@npm:3.9.0" @@ -29539,15 +29765,19 @@ __metadata: linkType: hard "find-process@npm:^1.4.5": - version: 1.4.7 - resolution: "find-process@npm:1.4.7" + version: 1.4.9 + resolution: "find-process@npm:1.4.9" dependencies: - chalk: ^4.0.0 - commander: ^5.1.0 - debug: ^4.1.1 + chalk: ~4.1.2 + commander: ^12.1.0 + debug: ^4.4.0 + eslint: ^9.17.0 + glob: ^11.0.0 + loglevel: ^1.9.2 + rimraf: ^6.0.1 bin: find-process: bin/find-process.js - checksum: 1953e6a16af86ec033d613ddfcac24f68b7ca6cc7d7aadc037ede4ccad4f03c5571d3c95165842475bfa9432120be5c995cc234c9c02726fc886ac6cd85ece3b + checksum: 907fe8387bad87cab9cb103b0b3602d85771c72cce83a35c44c5ad05f5c5c40cbd322d77944afed682b591beb449e228d4a6e6d18751b22da8743f215c7fca12 languageName: node linkType: hard @@ -29616,12 +29846,13 @@ __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 +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" + dependencies: + flatted: ^3.2.9 + keyv: ^4.5.4 + checksum: 899fc86bf6df093547d76e7bfaeb900824b869d7d457d02e9b8aae24836f0a99fbad79328cfd6415ee8908f180699bf259dc7614f793447cb14f707caf5996f6 languageName: node linkType: hard @@ -29632,7 +29863,7 @@ __metadata: languageName: node linkType: hard -"flatted@npm:3.3.2, flatted@npm:^3.1.0, flatted@npm:^3.2.7": +"flatted@npm:3.3.2, flatted@npm:^3.1.0, flatted@npm:^3.2.7, flatted@npm:^3.2.9": version: 3.3.2 resolution: "flatted@npm:3.3.2" checksum: ac3c159742e01d0e860a861164bcfd35bb567ccbebb8a0dd041e61cf3c64a435b917dd1e7ed1c380c2ebca85735fb16644485ec33665bc6aafc3b316aa1eed44 @@ -30061,15 +30292,17 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 functions-have-names: ^1.2.3 - checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 + hasown: ^2.0.2 + is-callable: ^1.2.7 + checksum: 3a366535dc08b25f40a322efefa83b2da3cd0f6da41db7775f2339679120ef63b6c7e967266182609e655b8f0a8f65596ed21c7fd72ad8bd5621c2340edd4010 languageName: node linkType: hard @@ -30190,16 +30423,21 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6": + version: 1.2.6 + resolution: "get-intrinsic@npm:1.2.6" dependencies: + call-bind-apply-helpers: ^1.0.1 + dunder-proto: ^1.0.0 + es-define-property: ^1.0.1 es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 function-bind: ^1.1.2 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - hasown: ^2.0.0 - checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 + gopd: ^1.2.0 + has-symbols: ^1.1.0 + hasown: ^2.0.2 + math-intrinsics: ^1.0.0 + checksum: a7592a0b7f023a2e83c0121fa9449ca83780e370a5feeebe8452119474d148016e43b455049134ae7a683b9b11b93d3f65eac199a0ad452ab740d5f0c299de47 languageName: node linkType: hard @@ -30273,14 +30511,14 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.2": - version: 1.0.2 - resolution: "get-symbol-description@npm:1.0.2" +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" dependencies: - call-bind: ^1.0.5 + call-bound: ^1.0.3 es-errors: ^1.3.0 - get-intrinsic: ^1.2.4 - checksum: e1cb53bc211f9dbe9691a4f97a46837a553c4e7caadd0488dc24ac694db8a390b93edd412b48dcdd0b4bbb4c595de1709effc75fc87c0839deedc6968f5bd973 + get-intrinsic: ^1.2.6 + checksum: 655ed04db48ee65ef2ddbe096540d4405e79ba0a7f54225775fef43a7e2afcb93a77d141c5f05fdef0afce2eb93bcbfb3597142189d562ac167ff183582683cd languageName: node linkType: hard @@ -30425,6 +30663,22 @@ __metadata: languageName: node linkType: hard +"glob@npm:^11.0.0": + version: 11.0.0 + resolution: "glob@npm:11.0.0" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^4.0.1 + minimatch: ^10.0.0 + minipass: ^7.1.2 + package-json-from-dist: ^1.0.0 + path-scurry: ^2.0.0 + bin: + glob: dist/esm/bin.mjs + checksum: 8a2dd914d5776987be5244624d9491bbcaf19f2387e06783737003ff696ebfd2264190c47014f8709c1c02d8bc892f17660cf986c587b107e194c0a3151ab333 + languageName: node + linkType: hard + "glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.1.7": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -30535,6 +30789,13 @@ __metadata: languageName: node linkType: hard +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 534b8216736a5425737f59f6e6a5c7f386254560c9f41d24a9227d60ee3ad4a9e82c5b85def0e212e9d92162f83a92544be4c7fd4c902cb913736c10e08237ac + languageName: node + linkType: hard + "globals@npm:^15.11.0": version: 15.12.0 resolution: "globals@npm:15.12.0" @@ -30658,12 +30919,10 @@ __metadata: languageName: node linkType: hard -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: ^1.1.3 - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3 languageName: node linkType: hard @@ -30839,9 +31098,9 @@ __metadata: linkType: hard "graphql@npm:^16.0.0, graphql@npm:^16.8.1": - version: 16.9.0 - resolution: "graphql@npm:16.9.0" - checksum: 8cb3d54100e9227310383ce7f791ca48d12f15ed9f2021f23f8735f1121aafe4e5e611a853081dd935ce221724ea1ae4638faef5d2921fb1ad7c26b5f46611e9 + version: 16.10.0 + resolution: "graphql@npm:16.10.0" + checksum: 969c2d1061d69ad6fe08a7fe642428212b0b8485a2f9b5d8650203eb6c3221479e81ec6a757708f849d84b85afcb3ebc5a8ff2f71778bb66c5e4850f051c170e languageName: node linkType: hard @@ -30944,7 +31203,7 @@ __metadata: languageName: node linkType: hard -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": +"has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b @@ -30974,17 +31233,19 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: ^1.0.0 + checksum: f55010cb94caa56308041d77967c72a02ffd71386b23f9afa8447e58bc92d49d15c19bf75173713468e92fe3fb1680b03b115da39c21c32c74886d1d50d3e7ff languageName: node linkType: hard -"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b languageName: node linkType: hard @@ -31664,10 +31925,10 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.1.4, ignore@npm:^5.1.8, ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 71d7bb4c1dbe020f915fd881108cbe85a0db3d636a0ea3ba911393c53946711d13a9b1143c7e70db06d571a5822c0a324a6bcde5c9904e7ca5047f01f1bf8cd3 +"ignore@npm:^5.1.4, ignore@npm:^5.1.8, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be languageName: node linkType: hard @@ -31913,14 +32174,14 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.7": - version: 1.0.7 - resolution: "internal-slot@npm:1.0.7" +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" dependencies: es-errors: ^1.3.0 - hasown: ^2.0.0 - side-channel: ^1.0.4 - checksum: cadc5eea5d7d9bc2342e93aae9f31f04c196afebb11bde97448327049f492cd7081e18623ae71388aac9cd237b692ca3a105be9c68ac39c1dec679d7409e33eb + hasown: ^2.0.2 + side-channel: ^1.1.0 + checksum: 8e0991c2d048cc08dab0a91f573c99f6a4215075887517ea4fa32203ce8aea60fa03f95b177977fa27eb502e5168366d0f3e02c762b799691411d49900611861 languageName: node linkType: hard @@ -32065,13 +32326,14 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.4": - version: 3.0.4 - resolution: "is-array-buffer@npm:3.0.4" +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - checksum: e4e3e6ef0ff2239e75371d221f74bc3c26a03564a22efb39f6bb02609b598917ddeecef4e8c877df2a25888f247a98198959842a5e73236bc7f22cabdf6351a7 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: f137a2a6e77af682cdbffef1e633c140cf596f72321baf8bba0f4ef22685eb4339dde23dfe9e9ca430b5f961dee4d46577dcf12b792b68518c8449b134fb9156 languageName: node linkType: hard @@ -32098,12 +32360,12 @@ __metadata: languageName: node linkType: hard -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + has-bigints: ^1.0.2 + checksum: ee1544f0e664f253306786ed1dce494b8cf242ef415d6375d8545b4d8816b0f054bd9f948a8988ae2c6325d1c28260dd02978236b2f7b8fb70dfc4838a6c9fa7 languageName: node linkType: hard @@ -32116,13 +32378,13 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" +"is-boolean-object@npm:^1.2.1": + version: 1.2.1 + resolution: "is-boolean-object@npm:1.2.1" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + call-bound: ^1.0.2 + has-tostringtag: ^1.0.2 + checksum: 2672609f0f2536172873810a38ec006a415e43ddc6a240f7638a1659cb20dfa91cc75c8a1bed36247bb046aa8f0eab945f20d1203bc69606418bd129c745f861 languageName: node linkType: hard @@ -32133,7 +32395,7 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": +"is-callable@npm:^1.1.3, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac @@ -32169,21 +32431,24 @@ __metadata: languageName: node linkType: hard -"is-data-view@npm:^1.0.1": - version: 1.0.1 - resolution: "is-data-view@npm:1.0.1" +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" dependencies: + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 is-typed-array: ^1.1.13 - checksum: 4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 + checksum: 31600dd19932eae7fd304567e465709ffbfa17fa236427c9c864148e1b54eb2146357fcf3aed9b686dee13c217e1bb5a649cb3b9c479e1004c0648e9febde1b2 languageName: node linkType: hard -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + call-bound: ^1.0.2 + has-tostringtag: ^1.0.2 + checksum: d6c36ab9d20971d65f3fc64cef940d57a4900a2ac85fb488a46d164c2072a33da1cb51eefcc039e3e5c208acbce343d3480b84ab5ff0983f617512da2742562a languageName: node linkType: hard @@ -32236,12 +32501,12 @@ __metadata: languageName: node linkType: hard -"is-finalizationregistry@npm:^1.0.2": - version: 1.0.2 - resolution: "is-finalizationregistry@npm:1.0.2" +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" dependencies: - call-bind: ^1.0.2 - checksum: 4f243a8e06228cd45bdab8608d2cb7abfc20f6f0189c8ac21ea8d603f1f196eabd531ce0bb8e08cbab047e9845ef2c191a3761c9a17ad5cabf8b35499c4ad35d + call-bound: ^1.0.3 + checksum: 38c646c506e64ead41a36c182d91639833311970b6b6c6268634f109eef0a1a9d2f1f2e499ef4cb43c744a13443c4cdd2f0812d5afdcee5e9b65b72b28c48557 languageName: node linkType: hard @@ -32349,7 +32614,7 @@ __metadata: languageName: node linkType: hard -"is-map@npm:^2.0.1": +"is-map@npm:^2.0.3": version: 2.0.3 resolution: "is-map@npm:2.0.3" checksum: e6ce5f6380f32b141b3153e6ba9074892bbbbd655e92e7ba5ff195239777e767a976dcd4e22f864accaf30e53ebf961ab1995424aef91af68788f0591b7396cc @@ -32373,13 +32638,6 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.3": - version: 2.0.3 - resolution: "is-negative-zero@npm:2.0.3" - checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd - languageName: node - linkType: hard - "is-network-error@npm:^1.0.0": version: 1.0.1 resolution: "is-network-error@npm:1.0.1" @@ -32401,12 +32659,13 @@ __metadata: languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 6517f0a0e8c4b197a21afb45cd3053dc711e79d45d8878aa3565de38d0102b130ca8732485122c7b336e98c27dacd5236854e3e6526e0eb30cae64956535662f languageName: node linkType: hard @@ -32519,13 +32778,15 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + call-bound: ^1.0.2 + gopd: ^1.2.0 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 99ee0b6d30ef1bb61fa4b22fae7056c6c9b3c693803c0c284ff7a8570f83075a7d38cda53b06b7996d441215c27895ea5d1af62124562e13d91b3dbec41a5e13 languageName: node linkType: hard @@ -32552,19 +32813,19 @@ __metadata: languageName: node linkType: hard -"is-set@npm:^2.0.1": +"is-set@npm:^2.0.3": version: 2.0.3 resolution: "is-set@npm:2.0.3" checksum: 36e3f8c44bdbe9496c9689762cc4110f6a6a12b767c5d74c0398176aa2678d4467e3bf07595556f2dba897751bde1422480212b97d973c7b08a343100b0c0dfe languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "is-shared-array-buffer@npm:1.0.3" +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: - call-bind: ^1.0.7 - checksum: a4fff602c309e64ccaa83b859255a43bb011145a42d3f56f67d9268b55bc7e6d98a5981a1d834186ad3105d6739d21547083fe7259c76c0468483fc538e716d8 + call-bound: ^1.0.3 + checksum: 1611fedc175796eebb88f4dfc393dd969a4a8e6c69cadaff424ee9d4464f9f026399a5f84a90f7c62d6d7ee04e3626a912149726de102b0bd6c1ee6a9868fa5a languageName: node linkType: hard @@ -32605,12 +32866,13 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" +"is-string@npm:^1.0.7, is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 2eeaaff605250f5e836ea3500d33d1a5d3aa98d008641d9d42fb941e929ffd25972326c2ef912987e54c95b6f10416281aaf1b35cdf81992cfb7524c5de8e193 languageName: node linkType: hard @@ -32623,21 +32885,23 @@ __metadata: languageName: node linkType: hard -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + call-bound: ^1.0.2 + has-symbols: ^1.1.0 + safe-regex-test: ^1.1.0 + checksum: bfafacf037af6f3c9d68820b74be4ae8a736a658a3344072df9642a090016e281797ba8edbeb1c83425879aae55d1cb1f30b38bf132d703692b2570367358032 languageName: node linkType: hard -"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.3": - version: 1.1.13 - resolution: "is-typed-array@npm:1.1.13" +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15, is-typed-array@npm:^1.1.3": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" dependencies: - which-typed-array: ^1.1.14 - checksum: 150f9ada183a61554c91e1c4290086d2c100b0dff45f60b028519be72a8db964da403c48760723bf5253979b8dffe7b544246e0e5351dcd05c5fdb1dcc1dc0f0 + which-typed-array: ^1.1.16 + checksum: ea7cfc46c282f805d19a9ab2084fd4542fed99219ee9dbfbc26284728bd713a51eac66daa74eca00ae0a43b61322920ba334793607dc39907465913e921e0892 languageName: node linkType: hard @@ -32669,29 +32933,29 @@ __metadata: languageName: node linkType: hard -"is-weakmap@npm:^2.0.1": - version: 2.0.1 - resolution: "is-weakmap@npm:2.0.1" - checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6 - languageName: node - linkType: hard - -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de - languageName: node - linkType: hard - -"is-weakset@npm:^2.0.1": +"is-weakmap@npm:^2.0.2": version: 2.0.2 - resolution: "is-weakset@npm:2.0.2" + resolution: "is-weakmap@npm:2.0.2" + checksum: f36aef758b46990e0d3c37269619c0a08c5b29428c0bb11ecba7f75203442d6c7801239c2f31314bc79199217ef08263787f3837d9e22610ad1da62970d6616d + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": + version: 1.1.0 + resolution: "is-weakref@npm:1.1.0" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367 + call-bound: ^1.0.2 + checksum: 2a2f3a1746ee1baecf9ac6483d903cd3f8ef3cca88e2baa42f2e85ea064bd246d218eed5f6d479fc1c76dae2231e71133b6b86160e821d176932be9fae3da4da + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" + dependencies: + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: 5c6c8415a06065d78bdd5e3a771483aa1cd928df19138aa73c4c51333226f203f22117b4325df55cc8b3085a6716870a320c2d757efee92d7a7091a039082041 languageName: node linkType: hard @@ -32777,12 +33041,12 @@ __metadata: linkType: hard "isolated-vm@npm:^5.0.1": - version: 5.0.1 - resolution: "isolated-vm@npm:5.0.1" + version: 5.0.3 + resolution: "isolated-vm@npm:5.0.3" dependencies: node-gyp: latest - prebuild-install: ^7.1.1 - checksum: 33ca559797d8c20571015733309b313f55df667cbaf17f7c6445b707fcdfd8bef6896264a30e48eaaa5635ab1d33e826b4aa95a1ba0bf8d26b045a1226956956 + prebuild-install: ^7.1.2 + checksum: 71ec0c45fe00ed5e48b598281682e46bea7b478177d303326a0ba0602a3186059164d89935820b6648d3ea68aa73d23cd47378752189a7a6877bdfcec140985a languageName: node linkType: hard @@ -32828,10 +33092,10 @@ __metadata: languageName: node linkType: hard -"isomorphic-rslog@npm:0.0.6": - version: 0.0.6 - resolution: "isomorphic-rslog@npm:0.0.6" - checksum: 20ee7ebedecf32a5504b733dd7065780e98434aa64c5ba5d330ae1b5769bb26601f9cb4b70b195e17eaf62c40264396b5431ef371cd32eb2c0c83a5474d59eea +"isomorphic-rslog@npm:0.0.7": + version: 0.0.7 + resolution: "isomorphic-rslog@npm:0.0.7" + checksum: 2215fc494a5ec0e26044c4ce315e11effb00c16874cb7b24f3dfcd258257cb53584bb9cd1f8fc2c23b8dcc5c0f2ab85be8c12a87a2af773fce9187bc0ec9d756 languageName: node linkType: hard @@ -32946,16 +33210,17 @@ __metadata: languageName: node linkType: hard -"iterator.prototype@npm:^1.1.3": - version: 1.1.3 - resolution: "iterator.prototype@npm:1.1.3" +"iterator.prototype@npm:^1.1.4": + version: 1.1.4 + resolution: "iterator.prototype@npm:1.1.4" dependencies: - define-properties: ^1.2.1 - get-intrinsic: ^1.2.1 - has-symbols: ^1.0.3 - reflect.getprototypeof: ^1.0.4 - set-function-name: ^2.0.1 - checksum: 7d2a1f8bcbba7b76f72e956faaf7b25405f4de54430c9d099992e6fb9d571717c3044604e8cdfb8e624cb881337d648030ee8b1541d544af8b338835e3f47ebe + define-data-property: ^1.1.4 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.6 + has-symbols: ^1.1.0 + reflect.getprototypeof: ^1.0.8 + set-function-name: ^2.0.2 + checksum: e2b1f0f7678cf6ff02b74085dbd708bdfb6c18357af46cedc18a34e08d066c9b26e9dfb7dd2619dc199d17e681f30200b122425f793e9ad0105671191433d50f languageName: node linkType: hard @@ -32972,6 +33237,15 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^4.0.1": + version: 4.0.2 + resolution: "jackspeak@npm:4.0.2" + dependencies: + "@isaacs/cliui": ^8.0.2 + checksum: 210030029edfa1658328799ad88c3d0fc057c4cb8a069fc4137cc8d2cc4b65c9721c6e749e890f9ca77a954bb54f200f715b8896e50d330e5f3e902e72b40974 + languageName: node + linkType: hard + "jake@npm:^10.8.5": version: 10.8.5 resolution: "jake@npm:10.8.5" @@ -32986,13 +33260,6 @@ __metadata: languageName: node linkType: hard -"javascript-stringify@npm:^2.0.1": - version: 2.1.0 - resolution: "javascript-stringify@npm:2.1.0" - checksum: 009981ec84299da88795fc764221ed213e3d52251cc93a396430a7a02ae09f1163a9be36a36808689681a8e6113cf00fe97ec2eea2552df48111f79be59e9358 - languageName: node - linkType: hard - "jest-changed-files@npm:^29.7.0": version: 29.7.0 resolution: "jest-changed-files@npm:29.7.0" @@ -33465,11 +33732,11 @@ __metadata: linkType: hard "jest-when@npm:^3.1.0": - version: 3.6.0 - resolution: "jest-when@npm:3.6.0" + version: 3.7.0 + resolution: "jest-when@npm:3.7.0" peerDependencies: jest: ">= 25" - checksum: ed32ed84e5802bb6fec98966cdf862ce59677551be33d3795e6ac7a6207acf467ed559573d671c8d94c59f7fc0780cf358d2d165d81cdc7d9611250d975ee024 + checksum: d805e2af8e76bf172e33dfde5280590fbc3510427a2d671d3a36df1c90c1bb68ebfee2ea4c87132e265973c7092d3ad20efb69398bd70141f7abef8815d5ad00 languageName: node linkType: hard @@ -34284,11 +34551,11 @@ __metadata: linkType: hard "keyv@npm:*, keyv@npm:^5.2.1": - version: 5.2.1 - resolution: "keyv@npm:5.2.1" + version: 5.2.3 + resolution: "keyv@npm:5.2.3" dependencies: - "@keyv/serialize": "*" - checksum: 92f02ce8a61d3f832c72bc305a0a3408ab3ba322702175c8f23ddb7b317cdef6525fa084135ca4218f40afe17397f2b5b0f38fb1f0758fb47e8cd5d2699963d2 + "@keyv/serialize": ^1.0.2 + checksum: b317a71550431ba6238bc8c71ce9ab263560df2227ca7933f7a3f18f0fa1a931312b02951cbcce9d316689709f67c5e4a4095e8e6b9aa13d19ce82c5dd7293e2 languageName: node linkType: hard @@ -34301,7 +34568,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.0.0, keyv@npm:^4.5.2": +"keyv@npm:^4.0.0, keyv@npm:^4.5.2, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -34371,8 +34638,8 @@ __metadata: linkType: hard "knip@npm:^5.0.0": - version: 5.38.2 - resolution: "knip@npm:5.38.2" + version: 5.41.1 + resolution: "knip@npm:5.41.1" dependencies: "@nodelib/fs.walk": 1.2.8 "@snyk/github-codeowners": 1.1.0 @@ -34396,7 +34663,7 @@ __metadata: bin: knip: bin/knip.js knip-bun: bin/knip-bun.js - checksum: dd2b9dd20f1e940e07057f60d04c39da12130e3c2246bc600500af3fe7fa8251ef170d63cd492e4b70bd946beef44ef797afe103b6805b355430ea4057d7cba3 + checksum: d8b1d072493e624abc3ed08d855940a4877c86c7c0b9211e69d930e597c683badd035c1bfb1dc3f9c53c4223507fa0556b413cef63c2e732190275c553587cad languageName: node linkType: hard @@ -34449,14 +34716,14 @@ __metadata: linkType: hard "kubernetes-models@npm:^4.1.0, kubernetes-models@npm:^4.3.1": - version: 4.4.1 - resolution: "kubernetes-models@npm:4.4.1" + version: 4.4.2 + resolution: "kubernetes-models@npm:4.4.2" dependencies: - "@kubernetes-models/apimachinery": ^2.0.1 - "@kubernetes-models/base": ^5.0.0 + "@kubernetes-models/apimachinery": ^2.0.2 + "@kubernetes-models/base": ^5.0.1 "@kubernetes-models/validate": ^4.0.0 "@swc/helpers": ^0.5.8 - checksum: 18616a04e98cc3d8c916424ea439247a1826dd6f655bd64c17091df63324aa0c2d3a09c30ee75d2eaf82c30a2ee5053989de81eb793a82f8a3ebda1c37cda4a8 + checksum: 7c449f69cdda44b177e02185305489dbf492a264c8d71debac0d051831bef76936ed1ec6669fa2090ceb5a20ab9a82b4698d72cac6447c636fdeb6c1960bba9c languageName: node linkType: hard @@ -34618,10 +34885,10 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:~3.1.2": - version: 3.1.2 - resolution: "lilconfig@npm:3.1.2" - checksum: 4e8b83ddd1d0ad722600994e6ba5d858ddca14f0587aa6b9c8185e17548149b5e13d4d583d811e9e9323157fa8c6a527e827739794c7502b59243c58e210b8c3 +"lilconfig@npm:~3.1.3": + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 644eb10830350f9cdc88610f71a921f510574ed02424b57b0b3abb66ea725d7a082559552524a842f4e0272c196b88dfe1ff7d35ffcc6f45736777185cd67c9a languageName: node linkType: hard @@ -34668,22 +34935,22 @@ __metadata: linkType: hard "lint-staged@npm:^15.0.0": - version: 15.2.10 - resolution: "lint-staged@npm:15.2.10" + version: 15.2.11 + resolution: "lint-staged@npm:15.2.11" dependencies: chalk: ~5.3.0 commander: ~12.1.0 - debug: ~4.3.6 + debug: ~4.4.0 execa: ~8.0.1 - lilconfig: ~3.1.2 - listr2: ~8.2.4 + lilconfig: ~3.1.3 + listr2: ~8.2.5 micromatch: ~4.0.8 pidtree: ~0.6.0 string-argv: ~0.3.2 - yaml: ~2.5.0 + yaml: ~2.6.1 bin: lint-staged: bin/lint-staged.js - checksum: 7ab255b848478ca47c6b94aad0e7a3cfe5ba48ae1fb353cfa86635741333b83b1fd793d7cac6d44bf0388ad087d7e0250c7ec0a8ebece63fbcf7a8d175279809 + checksum: 9668e67791fd73aa91cf9268641a5b41191b4221ac9e4d34b51bb10088a082548aa5984d9b38066c3832e41f5a01bbb36aa41d9a8c96bbc775301cb5c9071e13 languageName: node linkType: hard @@ -34694,9 +34961,9 @@ __metadata: languageName: node linkType: hard -"listr2@npm:~8.2.4": - version: 8.2.4 - resolution: "listr2@npm:8.2.4" +"listr2@npm:~8.2.5": + version: 8.2.5 + resolution: "listr2@npm:8.2.5" dependencies: cli-truncate: ^4.0.0 colorette: ^2.0.20 @@ -34704,7 +34971,7 @@ __metadata: log-update: ^6.1.0 rfdc: ^1.4.1 wrap-ansi: ^9.0.0 - checksum: b1cdcae653ff967a9b28637e346df2d6614165b4ad1e9e36b1403bc972550c51f57ec0e6d307dc3921ceea0601e244e848ab79457c6d570ab1f088b577a63d90 + checksum: 0ca2387b067eb11bbe91863f36903f3a5a040790422a499cc1a15806d8497979e7d1990bd129061c0510906b2971eaa97a74a9635e3ec5abd5830c9749b655b9 languageName: node linkType: hard @@ -35086,10 +35353,10 @@ __metadata: languageName: node linkType: hard -"loglevel@npm:^1.8.0": - version: 1.8.1 - resolution: "loglevel@npm:1.8.1" - checksum: a1a62db40291aaeaef2f612334c49e531bff71cc1d01a2acab689ab80d59e092f852ab164a5aedc1a752fdc46b7b162cb097d8a9eb2cf0b299511106c29af61d +"loglevel@npm:^1.8.0, loglevel@npm:^1.9.2": + version: 1.9.2 + resolution: "loglevel@npm:1.9.2" + checksum: 896c67b90a507bfcfc1e9a4daa7bf789a441dd70d95cd13b998d6dd46233a3bfadfb8fadb07250432bbfb53bf61e95f2520f9b11f9d3175cc460e5c251eca0af languageName: node linkType: hard @@ -35172,13 +35439,20 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.0, lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": +"lru-cache@npm:^10.0.0, lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 6476138d2125387a6d20f100608c2583d415a4f64a0fecf30c9e2dda976614f09cad4baa0842447bd37dd459a7bd27f57d9d8f8ce558805abd487c583f3d774a languageName: node linkType: hard +"lru-cache@npm:^11.0.0": + version: 11.0.2 + resolution: "lru-cache@npm:11.0.2" + checksum: f9c27c58919a30f42834de9444de9f75bcbbb802c459239f96dd449ad880d8f9a42f51556d13659864dc94ab2dbded9c4a4f42a3e25a45b6da01bb86111224df + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -35337,6 +35611,25 @@ __metadata: languageName: node linkType: hard +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" + dependencies: + "@npmcli/agent": ^3.0.0 + cacache: ^19.0.1 + http-cache-semantics: ^4.1.1 + minipass: ^7.0.2 + minipass-fetch: ^4.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^1.0.0 + proc-log: ^5.0.0 + promise-retry: ^2.0.1 + ssri: ^12.0.0 + checksum: 6fb2fee6da3d98f1953b03d315826b5c5a4ea1f908481afc113782d8027e19f080c85ae998454de4e5f27a681d3ec58d57278f0868d4e0b736f51d396b661691 + languageName: node + linkType: hard + "make-fetch-happen@npm:^9.1.0": version: 9.1.0 resolution: "make-fetch-happen@npm:9.1.0" @@ -35484,6 +35777,13 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.0.0, math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 + languageName: node + linkType: hard + "md5.js@npm:^1.3.4": version: 1.3.5 resolution: "md5.js@npm:1.3.5" @@ -35664,15 +35964,6 @@ __metadata: languageName: node linkType: hard -"media-query-parser@npm:^2.0.2": - version: 2.0.2 - resolution: "media-query-parser@npm:2.0.2" - dependencies: - "@babel/runtime": ^7.12.5 - checksum: 8ef956d9e63fe6f4041988beda69843b3a6bb48228ea2923a066f6e7c8f7c5dba75fae357318c48a97ed5beae840b8425cb7e727fc1bb77acc65f2005f8945ab - languageName: node - linkType: hard - "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -36346,6 +36637,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^10.0.0": + version: 10.0.1 + resolution: "minimatch@npm:10.0.1" + dependencies: + brace-expansion: ^2.0.1 + checksum: f5b63c2f30606091a057c5f679b067f84a2cd0ffbd2dbc9143bda850afd353c7be81949ff11ae0c86988f07390eeca64efd7143ee05a0dab37f6c6b38a2ebb6c + languageName: node + linkType: hard + "minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": version: 5.1.6 resolution: "minimatch@npm:5.1.6" @@ -36416,6 +36716,15 @@ __metadata: languageName: node linkType: hard +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: ^7.0.3 + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 + languageName: node + linkType: hard + "minipass-fetch@npm:^1.3.2, minipass-fetch@npm:^1.4.1": version: 1.4.1 resolution: "minipass-fetch@npm:1.4.1" @@ -36461,6 +36770,21 @@ __metadata: languageName: node linkType: hard +"minipass-fetch@npm:^4.0.0": + version: 4.0.0 + resolution: "minipass-fetch@npm:4.0.0" + dependencies: + encoding: ^0.1.13 + minipass: ^7.0.3 + minipass-sized: ^1.0.3 + minizlib: ^3.0.1 + dependenciesMeta: + encoding: + optional: true + checksum: 7d59a31011ab9e4d1af6562dd4c4440e425b2baf4c5edbdd2e22fb25a88629e1cdceca39953ff209da504a46021df520f18fd9a519f36efae4750ff724ddadea + languageName: node + linkType: hard + "minipass-flush@npm:^1.0.5": version: 1.0.5 resolution: "minipass-flush@npm:1.0.5" @@ -36595,18 +36919,6 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.4.2, mlly@npm:^1.7.2": - version: 1.7.3 - resolution: "mlly@npm:1.7.3" - dependencies: - acorn: ^8.14.0 - pathe: ^1.1.2 - pkg-types: ^1.2.1 - ufo: ^1.5.4 - checksum: 60d309c7ce2ac162224a087fcd683a891260511f57011b2f436b54dfef146b8aae7473013958a58d5b6039f2a8692c32a2599c8390c5b307d1119ad0d917b414 - languageName: node - linkType: hard - "mock-socket@npm:^9.3.0": version: 9.3.1 resolution: "mock-socket@npm:9.3.1" @@ -36715,13 +37027,6 @@ __metadata: languageName: node linkType: hard -"modern-ahocorasick@npm:^1.0.0": - version: 1.1.0 - resolution: "modern-ahocorasick@npm:1.1.0" - checksum: 78b99840c9af086c1e36a594ee85bebd8c19d48e2ef31a67d1bad0e673ac12fc931e5961abb5b16daaf820af4923e700f76b1793b7413e18782230162866a0af - languageName: node - linkType: hard - "module-details-from-path@npm:^1.0.3": version: 1.0.3 resolution: "module-details-from-path@npm:1.0.3" @@ -36819,8 +37124,8 @@ __metadata: linkType: hard "msw@npm:^2.0.0, msw@npm:^2.0.8": - version: 2.6.6 - resolution: "msw@npm:2.6.6" + version: 2.7.0 + resolution: "msw@npm:2.7.0" dependencies: "@bundled-es-modules/cookie": ^2.0.1 "@bundled-es-modules/statuses": ^1.0.1 @@ -36831,12 +37136,12 @@ __metadata: "@open-draft/until": ^2.1.0 "@types/cookie": ^0.6.0 "@types/statuses": ^2.0.4 - chalk: ^4.1.2 graphql: ^16.8.1 headers-polyfill: ^4.0.2 is-node-process: ^1.2.0 outvariant: ^1.4.3 path-to-regexp: ^6.3.0 + picocolors: ^1.1.1 strict-event-emitter: ^0.5.1 type-fest: ^4.26.1 yargs: ^17.7.2 @@ -36847,7 +37152,7 @@ __metadata: optional: true bin: msw: cli/index.js - checksum: 803d60ca38fb8b3b35a81e5f95739ccb2a8935957f9a29e9baf3948fda1839e54a1164af305cbab1e75fa957f45258a609bc3ea5b1f97cb09a671a12e964ada8 + checksum: d8851ced7a7b6a8ca11d2cd1cb7a21082ed2543ebe93afa047b0ed5a9fb4708bcf230fe888f3b88b8c73f4432d3dc858ac4943f2d1e09fc3380c1f28ccbb53e5 languageName: node linkType: hard @@ -37046,6 +37351,13 @@ __metadata: languageName: node linkType: hard +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 20ebfe79b2d2e7cf9cbc8239a72662b584f71164096e6e8896c8325055497c96f6b80cd22c258e8a2f2aa382a787795ec3ee8b37b422a302c7d4381b0d5ecfbb + languageName: node + linkType: hard + "neo-async@npm:^2.5.0, neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -37209,9 +37521,9 @@ __metadata: languageName: node linkType: hard -"node-gyp@npm:^10.0.0, node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" +"node-gyp@npm:^10.0.0": + version: 10.3.1 + resolution: "node-gyp@npm:10.3.1" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 @@ -37225,7 +37537,7 @@ __metadata: which: ^4.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 0233759d8c19765f7fdc259a35eb046ad86c3d09e22f7384613ae2b89647dd27fcf833fdf5293d9335041e91f9b1c539494225959cdb312a5c8080b7534b926f + checksum: 91b0690ab504fe051ad66863226dc5ecac72b8471f85e8428e4d5ca3217d3a2adfffae48cd555e8d009a4164689fff558b88d2bc9bfd246452a3336ab308cf99 languageName: node linkType: hard @@ -37249,6 +37561,26 @@ __metadata: languageName: node linkType: hard +"node-gyp@npm:latest": + version: 11.0.0 + resolution: "node-gyp@npm:11.0.0" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + glob: ^10.3.10 + graceful-fs: ^4.2.6 + make-fetch-happen: ^14.0.3 + nopt: ^8.0.0 + proc-log: ^5.0.0 + semver: ^7.3.5 + tar: ^7.4.3 + which: ^5.0.0 + bin: + node-gyp: bin/node-gyp.js + checksum: d7d5055ccc88177f721c7cd4f8f9440c29a0eb40e7b79dba89ef882ec957975dfc1dcb8225e79ab32481a02016eb13bbc051a913ea88d482d3cbdf2131156af4 + languageName: node + linkType: hard + "node-html-markdown@npm:^1.3.0": version: 1.3.0 resolution: "node-html-markdown@npm:1.3.0" @@ -37324,8 +37656,8 @@ __metadata: linkType: hard "node-mocks-http@npm:^1.0.0": - version: 1.16.1 - resolution: "node-mocks-http@npm:1.16.1" + version: 1.16.2 + resolution: "node-mocks-http@npm:1.16.2" dependencies: accepts: ^1.3.7 content-disposition: ^0.5.3 @@ -37345,7 +37677,7 @@ __metadata: optional: true "@types/node": optional: true - checksum: 198030725eac236062eb3547a7d5cec2d6f2d44bf05efab0ea621e90f671d6966dca2873faaea9bcbb5dde92a222aff0610a01d453c2f76b0bc5dbdf4bd8057a + checksum: 9d148c49947e2161dbfd55204f07352f3fd976a41dfe355a97bd932cb8d4dbf584be4058fc78b121a9d83f0b86397e00a591e87afa9a1ecfb0335608ef1ace96 languageName: node linkType: hard @@ -37427,8 +37759,8 @@ __metadata: linkType: hard "nodemon@npm:^3.0.1": - version: 3.1.7 - resolution: "nodemon@npm:3.1.7" + version: 3.1.9 + resolution: "nodemon@npm:3.1.9" dependencies: chokidar: ^3.5.2 debug: ^4 @@ -37442,7 +37774,7 @@ __metadata: undefsafe: ^2.0.5 bin: nodemon: bin/nodemon.js - checksum: c500ac2feb278ddb187049ac8ede6423c1fb074cc3dabf74882568d5e93401293c10039e184a9d1bfc617c983ddb432437d396b421926914d04ebba671a7d8b8 + checksum: d045065dea08904f1356d18132538e71a61df12cb4e2852730310492943676d4789bedb28c343a5d85d5e07558bf47b73f000a8017409f0b7d522a3c1c42b2e5 languageName: node linkType: hard @@ -37468,6 +37800,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^8.0.0": + version: 8.0.0 + resolution: "nopt@npm:8.0.0" + dependencies: + abbrev: ^2.0.0 + bin: + nopt: bin/nopt.js + checksum: 2cfc65e7ee38af2e04aea98f054753b0230011c0eeca4ecf131bd7d25984cbbf6f214586e0ae5dfcc2e830bc0bffa5a7fb28ea8d0b306ffd4ae8ea2d814c1ab3 + languageName: node + linkType: hard + "nopt@npm:~1.0.10": version: 1.0.10 resolution: "nopt@npm:1.0.10" @@ -37769,10 +38112,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f +"object-inspect@npm:^1.13.3": + version: 1.13.3 + resolution: "object-inspect@npm:1.13.3" + checksum: 8c962102117241e18ea403b84d2521f78291b774b03a29ee80a9863621d88265ffd11d0d7e435c4c2cea0dc2a2fbf8bbc92255737a05536590f2df2e8756f297 languageName: node linkType: hard @@ -37793,15 +38136,17 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" dependencies: - call-bind: ^1.0.5 + call-bind: ^1.0.8 + call-bound: ^1.0.3 define-properties: ^1.2.1 - has-symbols: ^1.0.3 + es-object-atoms: ^1.0.0 + has-symbols: ^1.1.0 object-keys: ^1.1.1 - checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 + checksum: 60e07d2651cf4f5528c485f1aa4dbded9b384c47d80e8187cefd11320abb1aebebf78df5483451dfa549059f8281c21f7b4bf7d19e9e5e97d8d617df0df298de languageName: node linkType: hard @@ -37839,14 +38184,15 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.6, object.values@npm:^1.2.0": - version: 1.2.0 - resolution: "object.values@npm:1.2.0" +"object.values@npm:^1.1.6, object.values@npm:^1.2.0, object.values@npm:^1.2.1": + version: 1.2.1 + resolution: "object.values@npm:1.2.1" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.3 define-properties: ^1.2.1 es-object-atoms: ^1.0.0 - checksum: 51fef456c2a544275cb1766897f34ded968b22adfc13ba13b5e4815fdaf4304a90d42a3aee114b1f1ede048a4890381d47a5594d84296f2767c6a0364b9da8fa + checksum: f9b9a2a125ccf8ded29414d7c056ae0d187b833ee74919821fc60d7e216626db220d9cb3cf33f965c84aaaa96133626ca13b80f3c158b673976dc8cfcfcd26bb languageName: node linkType: hard @@ -38328,10 +38674,10 @@ __metadata: languageName: node linkType: hard -"p-throttle@npm:^5.1.0": - version: 5.1.0 - resolution: "p-throttle@npm:5.1.0" - checksum: c412429cbb759a0772a083200a556e5866d4a7cb5383a9cc85880f47f07f4b1787fc33d2c824ab659fff0fc4a34a56e1d0712e88808f0c0ae0ffbe93b54f46c1 +"p-throttle@npm:^7.0.0": + version: 7.0.0 + resolution: "p-throttle@npm:7.0.0" + checksum: ede8b1444bcb9200ebb95415c5eb2fba301ab12de4a9cffe3b8f383ca640e6d52aed417ee0df6705217a8e5aa8faadc5169fc56be7e99d32d34b9a74727d1d4d languageName: node linkType: hard @@ -38820,10 +39166,20 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.10": - version: 0.1.10 - resolution: "path-to-regexp@npm:0.1.10" - checksum: ab7a3b7a0b914476d44030340b0a65d69851af2a0f33427df1476100ccb87d409c39e2182837a96b98fb38c4ef2ba6b87bdad62bb70a2c153876b8061760583c +"path-scurry@npm:^2.0.0": + version: 2.0.0 + resolution: "path-scurry@npm:2.0.0" + dependencies: + lru-cache: ^11.0.0 + minipass: ^7.1.2 + checksum: 9953ce3857f7e0796b187a7066eede63864b7e1dfc14bf0484249801a5ab9afb90d9a58fc533ebb1b552d23767df8aa6a2c6c62caf3f8a65f6ce336a97bbb484 + languageName: node + linkType: hard + +"path-to-regexp@npm:0.1.12": + version: 0.1.12 + resolution: "path-to-regexp@npm:0.1.12" + checksum: ab237858bee7b25ecd885189f175ab5b5161e7b712b360d44f5c4516b8d271da3e4bf7bf0a7b9153ecb04c7d90ce8ff5158614e1208819cf62bac2b08452722e languageName: node linkType: hard @@ -38869,13 +39225,6 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.1, pathe@npm:^1.1.2": - version: 1.1.2 - resolution: "pathe@npm:1.1.2" - checksum: ec5f778d9790e7b9ffc3e4c1df39a5bb1ce94657a4e3ad830c1276491ca9d79f189f47609884671db173400256b005f4955f7952f52a2aeb5834ad5fb4faf134 - languageName: node - linkType: hard - "pathval@npm:^2.0.0": version: 2.0.0 resolution: "pathval@npm:2.0.0" @@ -39210,17 +39559,6 @@ __metadata: languageName: node linkType: hard -"pkg-types@npm:^1.2.1": - version: 1.2.1 - resolution: "pkg-types@npm:1.2.1" - dependencies: - confbox: ^0.1.8 - mlly: ^1.7.2 - pathe: ^1.1.2 - checksum: d2e3ad7aef36cc92b17403e61c04db521bf0beb175ccb4d432c284239f00ec32ff37feb072a260613e9ff727911cff1127a083fd52f91b9bec6b62970f385702 - languageName: node - linkType: hard - "pkg-up@npm:^3.1.0": version: 3.1.0 resolution: "pkg-up@npm:3.1.0" @@ -39244,27 +39582,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.49.0": - version: 1.49.0 - resolution: "playwright-core@npm:1.49.0" +"playwright-core@npm:1.49.1": + version: 1.49.1 + resolution: "playwright-core@npm:1.49.1" bin: playwright-core: cli.js - checksum: d8423ad0cab2e672856529bf6b98b406e7e605da098b847b9b54ee8ebd8d716ed8880a9afff4b38f0a2e3f59b95661c74589116ce3ff2b5e0ae3561507086c94 + checksum: a940f4b10ff1de033b4b8594b5104b02849a892d9adda0d42330a872cd3d8d287ffd2b01fc33f33ccd34f8904bb8ae8220b878b62e899f3d9bcd1b0945ab45c7 languageName: node linkType: hard -"playwright@npm:1.49.0": - version: 1.49.0 - resolution: "playwright@npm:1.49.0" +"playwright@npm:1.49.1": + version: 1.49.1 + resolution: "playwright@npm:1.49.1" dependencies: fsevents: 2.3.2 - playwright-core: 1.49.0 + playwright-core: 1.49.1 dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: f1bfb2fff65cad2ce996edab74ec231dfd21aeb5961554b765ce1eaec27efb87eaba37b00e91ecd27727b82861e5d8c230abe4960e93f6ada8be5ad1020df306 + checksum: c136d42d625e32614f90e5228a165dc8be48c5bfb52aca9210c6ff04161a409dbe42fe5ae4f05a2653f6a1b836876a04d3b0f24bcbbc053d1509c1d605b7c8d5 languageName: node linkType: hard @@ -39846,9 +40184,9 @@ __metadata: languageName: node linkType: hard -"prebuild-install@npm:^7.1.1": - version: 7.1.1 - resolution: "prebuild-install@npm:7.1.1" +"prebuild-install@npm:^7.1.1, prebuild-install@npm:^7.1.2": + version: 7.1.2 + resolution: "prebuild-install@npm:7.1.2" dependencies: detect-libc: ^2.0.0 expand-template: ^2.0.3 @@ -39864,7 +40202,7 @@ __metadata: tunnel-agent: ^0.6.0 bin: prebuild-install: bin.js - checksum: dbf96d0146b6b5827fc8f67f72074d2e19c69628b9a7a0a17d0fad1bf37e9f06922896972e074197fc00a52eae912993e6ef5a0d471652f561df5cb516f3f467 + checksum: 543dadf8c60e004ae9529e6013ca0cbeac8ef38b5f5ba5518cb0b622fe7f8758b34e4b5cb1a791db3cdc9d2281766302df6088bd1a225f206925d6fee17d6c5c languageName: node linkType: hard @@ -39995,6 +40333,13 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: c78b26ecef6d5cce4a7489a1e9923d7b4b1679028c8654aef0463b27f4a90b0946cd598f55799da602895c52feb085ec76381d007ab8dcceebd40b89c2f9dfe0 + languageName: node + linkType: hard + "process-nextick-args@npm:^2.0.0, process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -40757,6 +41102,17 @@ __metadata: languageName: node linkType: hard +"react-error-boundary@npm:^4.1.2": + version: 4.1.2 + resolution: "react-error-boundary@npm:4.1.2" + dependencies: + "@babel/runtime": ^7.12.5 + peerDependencies: + react: ">=16.13.1" + checksum: afe692f1bbbfb5998b49e1001d7682a3cbfdc623dca1318b408e738606f3450d925c28fbbfa5dc84d2cf285d17c2e7f079d59386a27da354dea9c902a935149b + languageName: node + linkType: hard + "react-error-overlay@npm:^6.0.11": version: 6.0.11 resolution: "react-error-overlay@npm:6.0.11" @@ -40875,13 +41231,20 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0, react-is@npm:^18.2.0, react-is@npm:^18.3.1": +"react-is@npm:^18.0.0, react-is@npm:^18.2.0": version: 18.3.1 resolution: "react-is@npm:18.3.1" checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 languageName: node linkType: hard +"react-is@npm:^19.0.0": + version: 19.0.0 + resolution: "react-is@npm:19.0.0" + checksum: fbb3060bcb6b3e8e525b17f0872d1cf62a40b73fa7c5de02419069e2edd3e01cf1e8e86c8888f0733cff006175ee76ae927b40b6f0c4332bdda21020505ac90b + languageName: node + linkType: hard + "react-json-view@npm:^1.21.3": version: 1.21.3 resolution: "react-json-view@npm:1.21.3" @@ -41086,15 +41449,15 @@ __metadata: linkType: hard "react-router-dom@npm:^6.3.0": - version: 6.28.0 - resolution: "react-router-dom@npm:6.28.0" + version: 6.28.1 + resolution: "react-router-dom@npm:6.28.1" dependencies: "@remix-run/router": 1.21.0 - react-router: 6.28.0 + react-router: 6.28.1 peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 0cf4658a92bc66f50ec9d8518c36aa5a402bcadce71fb624ed6f900d73a29ea87ff904a4f2c42279107e75e80cc08c6192563fadcc5d4e642e6d476e38e83b21 + checksum: 85380f5f3448fc8b64463bc7d64a053f724e64c4c50e64a3d57d450d3b365815e902927a8ff927c162d82093976bcbba70157dff1ade1ba0ae464ad3472518cb languageName: node linkType: hard @@ -41109,14 +41472,14 @@ __metadata: languageName: node linkType: hard -"react-router@npm:6.28.0, react-router@npm:^6.3.0": - version: 6.28.0 - resolution: "react-router@npm:6.28.0" +"react-router@npm:6.28.1, react-router@npm:^6.3.0": + version: 6.28.1 + resolution: "react-router@npm:6.28.1" dependencies: "@remix-run/router": 1.21.0 peerDependencies: react: ">=16.8" - checksum: 23246ca957b5c2bc8d6f9a81fee2df2ce4fc3feca3ec27c2fd85999568fc1299a4e8273e4ab70b6f3acd43a1fb45e0c93cb01ef77e68c9f9e1f7e4f42a1419ea + checksum: c1c4fe644a7197437f9ce9b8b621e79f9620b7a7b1192c9d1d44a6971b08af94408f3e63bd2cf122903c27d9a73b2e5632e4ca428e9ac0bf1d61e325968d4994 languageName: node linkType: hard @@ -41264,25 +41627,25 @@ __metadata: linkType: hard "react-virtualized-auto-sizer@npm:^1.0.11": - version: 1.0.24 - resolution: "react-virtualized-auto-sizer@npm:1.0.24" + version: 1.0.25 + resolution: "react-virtualized-auto-sizer@npm:1.0.25" peerDependencies: - react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 - react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 - checksum: e7d98563735dabbd1c58727c9d3e9f08f6a60a9964d25507cf4ef08f8964b6e421491c892ee0a99e47630118fdca42f1c60cef15ebda3659face58025dba3e98 + react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 1d325db5bf78fd4a6a8df90fccc9a50b29c648d899d2ce779159903c7eaba2a98254e6436ca6d366b89c44c8b2de7042425dd36d17874d2b51a2455557423c3a languageName: node linkType: hard "react-window@npm:^1.8.10, react-window@npm:^1.8.6": - version: 1.8.10 - resolution: "react-window@npm:1.8.10" + version: 1.8.11 + resolution: "react-window@npm:1.8.11" dependencies: "@babel/runtime": ^7.0.0 memoize-one: ">=3.1.1 <6" peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: e8830f32e3ad4bf91af9cdc5cead84148c7694ce6abd9fdb447fb609da6cd4bbd0bbc75ff985f78828f4bbbd3ba4cbc98235cc9c056b5e5787578518f7fafbb9 + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 04f0835869fbc1dc69637416e91bd7dfd462dcb9bf33ed2db4b4a515116c7a1c1ded3ca5e6df8d9a9ea3ec4f34e8e05f642d50f969bb495a9e11906d6a8cc418 languageName: node linkType: hard @@ -41553,17 +41916,19 @@ __metadata: languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.4": - version: 1.0.4 - resolution: "reflect.getprototypeof@npm:1.0.4" +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.8, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.9 + resolution: "reflect.getprototypeof@npm:1.0.9" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - globalthis: ^1.0.3 - which-builtin-type: ^1.1.3 - checksum: 16e2361988dbdd23274b53fb2b1b9cefeab876c3941a2543b4cadac6f989e3db3957b07a44aac46cfceb3e06e2871785ec2aac992d824f76292f3b5ee87f66f2 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + dunder-proto: ^1.0.1 + es-abstract: ^1.23.6 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + gopd: ^1.2.0 + which-builtin-type: ^1.2.1 + checksum: 280cfdb1ba29d838440731ccea877431ec41415783dff7845d5f026c9923a71165a00e56ebd21050cec31e9c39e2e3620d6077ad3025d3782ede8b47d14ef8ab languageName: node linkType: hard @@ -41624,15 +41989,15 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.2": - version: 1.5.2 - resolution: "regexp.prototype.flags@npm:1.5.2" +"regexp.prototype.flags@npm:^1.5.3": + version: 1.5.3 + resolution: "regexp.prototype.flags@npm:1.5.3" dependencies: - call-bind: ^1.0.6 + call-bind: ^1.0.7 define-properties: ^1.2.1 es-errors: ^1.3.0 - set-function-name: ^2.0.1 - checksum: d7f333667d5c564e2d7a97c56c3075d64c722c9bb51b2b4df6822b2e8096d623a5e63088fb4c83df919b6951ef8113841de8b47de7224872fa6838bc5d8a7d64 + set-function-name: ^2.0.2 + checksum: 83ff0705b837f7cb6d664010a11642250f36d3f642263dd0f3bdfe8f150261aa7b26b50ee97f21c1da30ef82a580bb5afedbef5f45639d69edaafbeac9bbb0ed languageName: node linkType: hard @@ -41833,13 +42198,6 @@ __metadata: languageName: node linkType: hard -"require-like@npm:>= 0.1.1": - version: 0.1.2 - resolution: "require-like@npm:0.1.2" - checksum: edb8331f05fd807381a75b76f6cca9f0ce8acaa2e910b7e116541799aa970bfbc64fde5fd6adb3a6917dba346f8386ebbddb81614c24e8dad1b4290c7af9535e - languageName: node - linkType: hard - "requires-port@npm:^1.0.0": version: 1.0.0 resolution: "requires-port@npm:1.0.0" @@ -42115,6 +42473,18 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^6.0.1": + version: 6.0.1 + resolution: "rimraf@npm:6.0.1" + dependencies: + glob: ^11.0.0 + package-json-from-dist: ^1.0.0 + bin: + rimraf: dist/esm/bin.mjs + checksum: 8ba5b84131c1344e9417cb7e8c05d8368bb73cbe5dd4c1d5eb49fc0b558209781658d18c450460e30607d0b7865bb067482839a2f343b186b07ae87715837e66 + languageName: node + linkType: hard + "rimraf@npm:~2.6.2": version: 2.6.3 resolution: "rimraf@npm:2.6.3" @@ -42441,15 +42811,16 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.1.2": - version: 1.1.2 - resolution: "safe-array-concat@npm:1.1.2" +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" dependencies: - call-bind: ^1.0.7 - get-intrinsic: ^1.2.4 - has-symbols: ^1.0.3 + call-bind: ^1.0.8 + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 + has-symbols: ^1.1.0 isarray: ^2.0.5 - checksum: a3b259694754ddfb73ae0663829e396977b99ff21cbe8607f35a469655656da8e271753497e59da8a7575baa94d2e684bea3e10ddd74ba046c0c9b4418ffa0c4 + checksum: 00f6a68140e67e813f3ad5e73e6dedcf3e42a9fa01f04d44b0d3f7b1f4b257af876832a9bfc82ac76f307e8a6cc652e3cf95876048a26cbec451847cf6ae3707 languageName: node linkType: hard @@ -42474,14 +42845,14 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.3": - version: 1.0.3 - resolution: "safe-regex-test@npm:1.0.3" +"safe-regex-test@npm:^1.0.3, safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" dependencies: - call-bind: ^1.0.6 + call-bound: ^1.0.2 es-errors: ^1.3.0 - is-regex: ^1.1.4 - checksum: 6c7d392ff1ae7a3ae85273450ed02d1d131f1d2c76e177d6b03eb88e6df8fa062639070e7d311802c1615f351f18dc58f9454501c58e28d5ffd9b8f502ba6489 + is-regex: ^1.2.1 + checksum: 3c809abeb81977c9ed6c869c83aca6873ea0f3ab0f806b8edbba5582d51713f8a6e9757d24d2b4b088f563801475ea946c8e77e7713e8c65cdd02305b6caedab languageName: node linkType: hard @@ -42591,15 +42962,15 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0": - version: 4.2.0 - resolution: "schema-utils@npm:4.2.0" +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0": + version: 4.3.0 + resolution: "schema-utils@npm:4.3.0" dependencies: "@types/json-schema": ^7.0.9 ajv: ^8.9.0 ajv-formats: ^2.1.1 ajv-keywords: ^5.1.0 - checksum: 26a0463d47683258106e6652e9aeb0823bf0b85843039e068b57da1892f7ae6b6b1094d48e9ed5ba5cbe9f7166469d880858b9d91abe8bd249421eb813850cde + checksum: 3dbd9056727c871818eaf3cabeeb5c9e173ae2b17bbf2a9c7a2e49c220fa1a580e44df651c876aea3b4926cecf080730a39e28202cb63f2b68d99872b49cd37a languageName: node linkType: hard @@ -42757,7 +43128,7 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.1": +"serialize-javascript@npm:^6.0.2": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" dependencies: @@ -42822,7 +43193,7 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.2.1": +"set-function-length@npm:^1.2.2": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" dependencies: @@ -42836,7 +43207,7 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.1, set-function-name@npm:^2.0.2": +"set-function-name@npm:^2.0.2": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" dependencies: @@ -42995,15 +43366,51 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" dependencies: - call-bind: ^1.0.7 es-errors: ^1.3.0 - get-intrinsic: ^1.2.4 - object-inspect: ^1.13.1 - checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 + object-inspect: ^1.13.3 + checksum: 603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + checksum: 42501371cdf71f4ccbbc9c9e2eb00aaaab80a4c1c429d5e8da713fd4d39ef3b8d4a4b37ed4f275798a65260a551a7131fd87fe67e922dba4ac18586d6aab8b06 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + side-channel-map: ^1.0.1 + checksum: a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + object-inspect: ^1.13.3 + side-channel-list: ^1.0.0 + side-channel-map: ^1.0.1 + side-channel-weakmap: ^1.0.2 + checksum: bf73d6d6682034603eb8e99c63b50155017ed78a522d27c2acec0388a792c3ede3238b878b953a08157093b85d05797217d270b7666ba1f111345fbe933380ff languageName: node linkType: hard @@ -43213,14 +43620,14 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.1, socks-proxy-agent@npm:^8.0.2, socks-proxy-agent@npm:^8.0.4": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" +"socks-proxy-agent@npm:^8.0.1, socks-proxy-agent@npm:^8.0.2, socks-proxy-agent@npm:^8.0.3, socks-proxy-agent@npm:^8.0.4": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" dependencies: - agent-base: ^7.1.1 + agent-base: ^7.1.2 debug: ^4.3.4 socks: ^2.8.3 - checksum: b2ec5051d85fe49072f9a250c427e0e9571fd09d5db133819192d078fd291276e1f0f50f6dbc04329b207738b1071314cee8bdbb4b12e27de42dbcf1d4233c67 + checksum: b4fbcdb7ad2d6eec445926e255a1fb95c975db0020543fbac8dfa6c47aecc6b3b619b7fb9c60a3f82c9b2969912a5e7e174a056ae4d98cb5322f3524d6036e1d languageName: node linkType: hard @@ -43522,6 +43929,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" + dependencies: + minipass: ^7.0.3 + checksum: ef4b6b0ae47b4a69896f5f1c4375f953b9435388c053c36d27998bc3d73e046969ccde61ab659e679142971a0b08e50478a1228f62edb994105b280f17900c98 + languageName: node + linkType: hard + "ssri@npm:^6.0.1": version: 6.0.2 resolution: "ssri@npm:6.0.2" @@ -43581,10 +43997,10 @@ __metadata: languageName: node linkType: hard -"stackframe@npm:^1.1.1": - version: 1.1.1 - resolution: "stackframe@npm:1.1.1" - checksum: 6031b30cc070972be6b12f4f4109e62150912ddbc8d6d2bc1707387bfa74b69ec298aa1211b9bf8dc4cf4f5245a5cdb72dda4b7c0467ea0cce2d10e4f10ffe3a +"stackframe@npm:^1.1.1, stackframe@npm:^1.3.4": + version: 1.3.4 + resolution: "stackframe@npm:1.3.4" + checksum: bae1596873595c4610993fa84f86a3387d67586401c1816ea048c0196800c0646c4d2da98c2ee80557fd9eff05877efe33b91ba6cd052658ed96ddc85d19067d languageName: node linkType: hard @@ -43646,11 +44062,11 @@ __metadata: languageName: node linkType: hard -"storybook@npm:^8.4.5": - version: 8.4.5 - resolution: "storybook@npm:8.4.5" +"storybook@npm:^8.4.7": + version: 8.4.7 + resolution: "storybook@npm:8.4.7" dependencies: - "@storybook/core": 8.4.5 + "@storybook/core": 8.4.7 peerDependencies: prettier: ^2 || ^3 peerDependenciesMeta: @@ -43660,7 +44076,7 @@ __metadata: getstorybook: ./bin/index.cjs sb: ./bin/index.cjs storybook: ./bin/index.cjs - checksum: 3495183749b760da077b2ede7607884c62f6707412e91defbe20328b275b78528fcef350453ad95642a52b97eded50f2c5374e94fb422a3b39587de364d87ee8 + checksum: 6cd44f8d51b68f2c2363d5e996bc8bf1e47a5acc2050da351d0fb49acd3d99ed093eef1b148145a1af9c08ead8592a87ee569c4456941a37dc374f9f21ea45c3 languageName: node linkType: hard @@ -43885,23 +44301,24 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.11": - version: 4.0.11 - resolution: "string.prototype.matchall@npm:4.0.11" +"string.prototype.matchall@npm:^4.0.12": + version: 4.0.12 + resolution: "string.prototype.matchall@npm:4.0.12" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.3 define-properties: ^1.2.1 - es-abstract: ^1.23.2 + es-abstract: ^1.23.6 es-errors: ^1.3.0 es-object-atoms: ^1.0.0 - get-intrinsic: ^1.2.4 - gopd: ^1.0.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.7 - regexp.prototype.flags: ^1.5.2 + get-intrinsic: ^1.2.6 + gopd: ^1.2.0 + has-symbols: ^1.1.0 + internal-slot: ^1.1.0 + regexp.prototype.flags: ^1.5.3 set-function-name: ^2.0.2 - side-channel: ^1.0.6 - checksum: 6ac6566ed065c0c8489c91156078ca077db8ff64d683fda97ae652d00c52dfa5f39aaab0a710d8243031a857fd2c7c511e38b45524796764d25472d10d7075ae + side-channel: ^1.1.0 + checksum: 98a09d6af91bfc6ee25556f3d7cd6646d02f5f08bda55d45528ed273d266d55a71af7291fe3fc76854deffb9168cc1a917d0b07a7d5a178c7e9537c99e6d2b57 languageName: node linkType: hard @@ -43915,26 +44332,30 @@ __metadata: languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.9": - version: 1.2.9 - resolution: "string.prototype.trim@npm:1.2.9" +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.2 + define-data-property: ^1.1.4 define-properties: ^1.2.1 - es-abstract: ^1.23.0 + es-abstract: ^1.23.5 es-object-atoms: ^1.0.0 - checksum: ea2df6ec1e914c9d4e2dc856fa08228e8b1be59b59e50b17578c94a66a176888f417264bb763d4aac638ad3b3dad56e7a03d9317086a178078d131aa293ba193 + has-property-descriptors: ^1.0.2 + checksum: 87659cd8561237b6c69f5376328fda934693aedde17bb7a2c57008e9d9ff992d0c253a391c7d8d50114e0e49ff7daf86a362f7961cf92f7564cd01342ca2e385 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimend@npm:1.0.8" +"string.prototype.trimend@npm:^1.0.8, string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.2 define-properties: ^1.2.1 es-object-atoms: ^1.0.0 - checksum: cc3bd2de08d8968a28787deba9a3cb3f17ca5f9f770c91e7e8fa3e7d47f079bad70fadce16f05dda9f261788be2c6e84a942f618c3bed31e42abc5c1084f8dfd + checksum: cb86f639f41d791a43627784be2175daa9ca3259c7cb83e7a207a729909b74f2ea0ec5d85de5761e6835e5f443e9420c6ff3f63a845378e4a61dd793177bc287 languageName: node linkType: hard @@ -44538,7 +44959,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^7.0.0": +"tar@npm:^7.0.0, tar@npm:^7.4.3": version: 7.4.3 resolution: "tar@npm:7.4.3" dependencies: @@ -44649,14 +45070,14 @@ __metadata: linkType: hard "terser-webpack-plugin@npm:*, terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.3.1, terser-webpack-plugin@npm:^5.3.10": - version: 5.3.10 - resolution: "terser-webpack-plugin@npm:5.3.10" + version: 5.3.11 + resolution: "terser-webpack-plugin@npm:5.3.11" dependencies: - "@jridgewell/trace-mapping": ^0.3.20 + "@jridgewell/trace-mapping": ^0.3.25 jest-worker: ^27.4.5 - schema-utils: ^3.1.1 - serialize-javascript: ^6.0.1 - terser: ^5.26.0 + schema-utils: ^4.3.0 + serialize-javascript: ^6.0.2 + terser: ^5.31.1 peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -44666,13 +45087,13 @@ __metadata: optional: true uglify-js: optional: true - checksum: bd6e7596cf815f3353e2a53e79cbdec959a1b0276f5e5d4e63e9d7c3c5bb5306df567729da287d1c7b39d79093e56863c569c42c6c24cc34c76aa313bd2cbcea + checksum: c84c005d4041ad2e2eed0c9059b52a50ffd27f1e2afca7d34864a2b4b2bb1295405bc7578eeb25bae732e358339954d8cb6fbf6d83df52e8aa9333e8bf409ebe languageName: node linkType: hard -"terser@npm:^5.10.0, terser@npm:^5.26.0": - version: 5.26.0 - resolution: "terser@npm:5.26.0" +"terser@npm:^5.10.0, terser@npm:^5.31.1": + version: 5.37.0 + resolution: "terser@npm:5.37.0" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -44680,7 +45101,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 02a9bb896f04df828025af8f0eced36c315d25d310b6c2418e7dad2bed19ddeb34a9cea9b34e7c24789830fa51e1b6a9be26679980987a9c817a7e6d9cd4154b + checksum: 70c06a8ce1288ff4370a7e481beb6fc8b22fc4995371479f49df1552aa9cf8e794ace66e1da6e87057eda1745644311213f5043bda9a06cf55421eff68b3ac06 languageName: node linkType: hard @@ -45149,7 +45570,7 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1, ts-api-utils@npm:^1.3.0": +"ts-api-utils@npm:^1.3.0": version: 1.3.0 resolution: "ts-api-utils@npm:1.3.0" peerDependencies: @@ -45475,55 +45896,56 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-buffer@npm:1.0.2" +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" dependencies: - call-bind: ^1.0.7 + call-bound: ^1.0.3 es-errors: ^1.3.0 - is-typed-array: ^1.1.13 - checksum: 02ffc185d29c6df07968272b15d5319a1610817916ec8d4cd670ded5d1efe72901541ff2202fcc622730d8a549c76e198a2f74e312eabbfb712ed907d45cbb0b + is-typed-array: ^1.1.14 + checksum: 3fb91f0735fb413b2bbaaca9fabe7b8fc14a3fa5a5a7546bab8a57e755be0e3788d893195ad9c2b842620592de0e68d4c077d4c2c41f04ec25b8b5bb82fa9a80 languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "typed-array-byte-length@npm:1.0.1" +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 for-each: ^0.3.3 - gopd: ^1.0.1 - has-proto: ^1.0.3 - is-typed-array: ^1.1.13 - checksum: f65e5ecd1cf76b1a2d0d6f631f3ea3cdb5e08da106c6703ffe687d583e49954d570cc80434816d3746e18be889ffe53c58bf3e538081ea4077c26a41055b216d + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.14 + checksum: cda9352178ebeab073ad6499b03e938ebc30c4efaea63a26839d89c4b1da9d2640b0d937fc2bd1f049eb0a38def6fbe8a061b601292ae62fe079a410ce56e3a6 languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-byte-offset@npm:1.0.2" +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" dependencies: available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 + call-bind: ^1.0.8 for-each: ^0.3.3 - gopd: ^1.0.1 - has-proto: ^1.0.3 - is-typed-array: ^1.1.13 - checksum: c8645c8794a621a0adcc142e0e2c57b1823bbfa4d590ad2c76b266aa3823895cf7afb9a893bf6685e18454ab1b0241e1a8d885a2d1340948efa4b56add4b5f67 + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.15 + reflect.getprototypeof: ^1.0.9 + checksum: 670b7e6bb1d3c2cf6160f27f9f529e60c3f6f9611c67e47ca70ca5cfa24ad95415694c49d1dbfeda016d3372cab7dfc9e38c7b3e1bb8d692cae13a63d3c144d7 languageName: node linkType: hard -"typed-array-length@npm:^1.0.6": - version: 1.0.6 - resolution: "typed-array-length@npm:1.0.6" +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" dependencies: call-bind: ^1.0.7 for-each: ^0.3.3 gopd: ^1.0.1 - has-proto: ^1.0.3 is-typed-array: ^1.1.13 possible-typed-array-names: ^1.0.0 - checksum: f0315e5b8f0168c29d390ff410ad13e4d511c78e6006df4a104576844812ee447fcc32daab1f3a76c9ef4f64eff808e134528b5b2439de335586b392e9750e5c + reflect.getprototypeof: ^1.0.6 + checksum: deb1a4ffdb27cd930b02c7030cb3e8e0993084c643208e52696e18ea6dd3953dfc37b939df06ff78170423d353dc8b10d5bae5796f3711c1b3abe52872b3774c languageName: node linkType: hard @@ -45671,13 +46093,6 @@ __metadata: languageName: node linkType: hard -"ufo@npm:^1.5.4": - version: 1.5.4 - resolution: "ufo@npm:1.5.4" - checksum: f244703b7d4f9f0df4f9af23921241ab73410b591f4e5b39c23e3147f3159b139a4b1fb5903189c306129f7a16b55995dac0008e0fbae88a37c3e58cbc34d833 - languageName: node - linkType: hard - "uglify-js@npm:^3.1.4": version: 3.17.0 resolution: "uglify-js@npm:3.17.0" @@ -45719,15 +46134,15 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" dependencies: - call-bind: ^1.0.2 + call-bound: ^1.0.3 has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + has-symbols: ^1.1.0 + which-boxed-primitive: ^1.1.1 + checksum: 729f13b84a5bfa3fead1d8139cee5c38514e63a8d6a437819a473e241ba87eeb593646568621c7fc7f133db300ef18d65d1a5a60dc9c7beb9000364d93c581df languageName: node linkType: hard @@ -45862,6 +46277,15 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: ^5.0.0 + checksum: 6a62094fcac286b9ec39edbd1f8f64ff92383baa430af303dfed1ffda5e47a08a6b316408554abfddd9730c78b6106bef4ca4d02c1231a735ddd56ced77573df + languageName: node + linkType: hard + "unique-slug@npm:^2.0.0": version: 2.0.2 resolution: "unique-slug@npm:2.0.2" @@ -45880,6 +46304,15 @@ __metadata: languageName: node linkType: hard +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 222d0322bc7bbf6e45c08967863212398313ef73423f4125e075f893a02405a5ffdbaaf150f7dd1e99f8861348a486dd079186d27c5f2c60e465b7dcbb1d3e5b + languageName: node + linkType: hard + "unique-string@npm:^2.0.0": version: 2.0.0 resolution: "unique-string@npm:2.0.0" @@ -46277,12 +46710,12 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.0.0, use-sync-external-store@npm:^1.2.0, use-sync-external-store@npm:^1.2.2": - version: 1.2.2 - resolution: "use-sync-external-store@npm:1.2.2" +"use-sync-external-store@npm:^1.0.0, use-sync-external-store@npm:^1.2.0, use-sync-external-store@npm:^1.4.0": + version: 1.4.0 + resolution: "use-sync-external-store@npm:1.4.0" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: fe07c071c4da3645f112c38c0e57beb479a8838616ff4e92598256ecce527f2888c08febc7f9b2f0ce2f0e18540ba3cde41eb2035e4fafcb4f52955037098a81 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: dc3843a1b59ac8bd01417bd79498d4c688d5df8bf4801be50008ef4bfaacb349058c0b1605b5b43c828e0a2d62722d7e861573b3f31cea77a7f23e8b0fc2f7e3 languageName: node linkType: hard @@ -46559,21 +46992,6 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:^1.2.0": - version: 1.6.0 - resolution: "vite-node@npm:1.6.0" - dependencies: - cac: ^6.7.14 - debug: ^4.3.4 - pathe: ^1.1.1 - picocolors: ^1.0.0 - vite: ^5.0.0 - bin: - vite-node: vite-node.mjs - checksum: ce111c5c7a4cf65b722baa15cbc065b7bfdbf1b65576dd6372995f6a72b2b93773ec5df59f6c5f08cfe1284806597b44b832efcea50d5971102428159ff4379f - languageName: node - linkType: hard - "vite-plugin-html@npm:^3.2.2": version: 3.2.2 resolution: "vite-plugin-html@npm:3.2.2" @@ -46608,7 +47026,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.0.0, vite@npm:^5.0.11": +"vite@npm:^5.0.0": version: 5.4.11 resolution: "vite@npm:5.4.11" dependencies: @@ -46938,17 +47356,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:^1.4.3": version: 1.4.3 resolution: "webpack-sources@npm:1.4.3" @@ -47089,48 +47496,49 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + is-bigint: ^1.1.0 + is-boolean-object: ^1.2.1 + is-number-object: ^1.1.1 + is-string: ^1.1.1 + is-symbol: ^1.1.1 + checksum: ee41d0260e4fd39551ad77700c7047d3d281ec03d356f5e5c8393fe160ba0db53ef446ff547d05f76ffabfd8ad9df7c9a827e12d4cccdbc8fccf9239ff8ac21e languageName: node linkType: hard -"which-builtin-type@npm:^1.1.3": - version: 1.1.3 - resolution: "which-builtin-type@npm:1.1.3" +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" dependencies: - function.prototype.name: ^1.1.5 - has-tostringtag: ^1.0.0 + call-bound: ^1.0.2 + function.prototype.name: ^1.1.6 + has-tostringtag: ^1.0.2 is-async-function: ^2.0.0 - is-date-object: ^1.0.5 - is-finalizationregistry: ^1.0.2 + is-date-object: ^1.1.0 + is-finalizationregistry: ^1.1.0 is-generator-function: ^1.0.10 - is-regex: ^1.1.4 + is-regex: ^1.2.1 is-weakref: ^1.0.2 isarray: ^2.0.5 - which-boxed-primitive: ^1.0.2 - which-collection: ^1.0.1 - which-typed-array: ^1.1.9 - checksum: 43730f7d8660ff9e33d1d3f9f9451c4784265ee7bf222babc35e61674a11a08e1c2925019d6c03154fcaaca4541df43abe35d2720843b9b4cbcebdcc31408f36 + which-boxed-primitive: ^1.1.0 + which-collection: ^1.0.2 + which-typed-array: ^1.1.16 + checksum: 7a3617ba0e7cafb795f74db418df889867d12bce39a477f3ee29c6092aa64d396955bf2a64eae3726d8578440e26777695544057b373c45a8bcf5fbe920bf633 languageName: node linkType: hard -"which-collection@npm:^1.0.1": - version: 1.0.1 - resolution: "which-collection@npm:1.0.1" +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" dependencies: - is-map: ^2.0.1 - is-set: ^2.0.1 - is-weakmap: ^2.0.1 - is-weakset: ^2.0.1 - checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c + is-map: ^2.0.3 + is-set: ^2.0.3 + is-weakmap: ^2.0.2 + is-weakset: ^2.0.3 + checksum: c51821a331624c8197916598a738fc5aeb9a857f1e00d89f5e4c03dc7c60b4032822b8ec5696d28268bb83326456a8b8216344fb84270d18ff1d7628051879d9 languageName: node linkType: hard @@ -47144,16 +47552,17 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": - version: 1.1.15 - resolution: "which-typed-array@npm:1.1.15" +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.2": + version: 1.1.18 + resolution: "which-typed-array@npm:1.1.18" dependencies: available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.3 for-each: ^0.3.3 - gopd: ^1.0.1 + gopd: ^1.2.0 has-tostringtag: ^1.0.2 - checksum: 65227dcbfadf5677aacc43ec84356d17b5500cb8b8753059bb4397de5cd0c2de681d24e1a7bd575633f976a95f88233abfd6549c2105ef4ebd58af8aa1807c75 + checksum: d2feea7f51af66b3a240397aa41c796585033e1069f18e5b6d4cd3878538a1e7780596fd3ea9bf347c43d9e98e13be09b37d9ea3887cef29b11bc291fd47bb52 languageName: node linkType: hard @@ -47190,6 +47599,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" + dependencies: + isexe: ^3.1.1 + bin: + node-which: bin/which.js + checksum: 6ec99e89ba32c7e748b8a3144e64bfc74aa63e2b2eacbb61a0060ad0b961eb1a632b08fb1de067ed59b002cec3e21de18299216ebf2325ef0f78e0f121e14e90 + languageName: node + linkType: hard + "wide-align@npm:^1.1.2": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -47208,13 +47628,6 @@ __metadata: languageName: node linkType: hard -"wildcard@npm:^2.0.1": - version: 2.0.1 - resolution: "wildcard@npm:2.0.1" - checksum: e0c60a12a219e4b12065d1199802d81c27b841ed6ad6d9d28240980c73ceec6f856771d575af367cbec2982d9ae7838759168b551776577f155044f5a5ba843c - languageName: node - linkType: hard - "winston-transport@npm:^4.5.0, winston-transport@npm:^4.7.0": version: 4.8.0 resolution: "winston-transport@npm:4.8.0" @@ -47579,7 +47992,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.0.0, yaml@npm:^2.0.0-10, yaml@npm:^2.1.1, yaml@npm:^2.2.1, yaml@npm:^2.2.2, yaml@npm:^2.3.2, yaml@npm:^2.3.3, yaml@npm:^2.3.4": +"yaml@npm:^2.0.0, yaml@npm:^2.0.0-10, yaml@npm:^2.1.1, yaml@npm:^2.2.1, yaml@npm:^2.2.2, yaml@npm:^2.3.2, yaml@npm:^2.3.3, yaml@npm:^2.3.4, yaml@npm:~2.6.1": version: 2.6.1 resolution: "yaml@npm:2.6.1" bin: @@ -47588,15 +48001,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:~2.5.0": - version: 2.5.1 - resolution: "yaml@npm:2.5.1" - bin: - yaml: bin.mjs - checksum: 31275223863fbd0b47ba9d2b248fbdf085db8d899e4ca43fff8a3a009497c5741084da6871d11f40e555d61360951c4c910b98216c1325d2c94753c0036d8172 - languageName: node - linkType: hard - "yargs-parser@npm:^20.2.2": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" @@ -47653,8 +48057,10 @@ __metadata: "@yarnpkg/core": ^4.0.3 "@yarnpkg/fslib": ^3.0.2 "@yarnpkg/plugin-pack": ^4.0.0 + fs-extra: ^11.2.0 nodemon: ^3.0.1 semver: ^7.6.0 + yaml: ^2.0.0 languageName: unknown linkType: soft