diff --git a/.changeset/afraid-trees-stare.md b/.changeset/afraid-trees-stare.md deleted file mode 100644 index 748bbb3cfe..0000000000 --- a/.changeset/afraid-trees-stare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': minor ---- - -Added the ability to be able to define an actions `input` and `output` schema using `zod` instead of hand writing types and `jsonschema` diff --git a/.changeset/all-my-auth-wanna-ride-today.md b/.changeset/all-my-auth-wanna-ride-today.md new file mode 100644 index 0000000000..40537c30f4 --- /dev/null +++ b/.changeset/all-my-auth-wanna-ride-today.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Fixed a bug that could prevent auth from working when using the `guest` or `custom` auth providers. diff --git a/.changeset/backend-token-authentication.md b/.changeset/backend-token-authentication.md deleted file mode 100644 index 3b0f016800..0000000000 --- a/.changeset/backend-token-authentication.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Make identity valid if subject of token is a backstage server-2-server auth token diff --git a/.changeset/beige-hats-cheer.md b/.changeset/beige-hats-cheer.md deleted file mode 100644 index 83b70d137e..0000000000 --- a/.changeset/beige-hats-cheer.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Add deprecations for symbols that were moved to `@backstage/plugin-catalog-node` a long time ago: - -- `CatalogProcessor` -- `CatalogProcessorCache` -- `CatalogProcessorEmit` -- `CatalogProcessorEntityResult` -- `CatalogProcessorErrorResult` -- `CatalogProcessorLocationResult` -- `CatalogProcessorParser` -- `CatalogProcessorRefreshKeysResult` -- `CatalogProcessorRelationResult` -- `CatalogProcessorResult` -- `DeferredEntity` -- `EntityProvider` -- `EntityProviderConnection` -- `EntityProviderMutation` -- `EntityRelationSpec` -- `processingResult` - -Also moved over and deprecated the following symbols: - -- `locationSpecToLocationEntity` -- `locationSpecToMetadataName` diff --git a/.changeset/big-gorillas-fail1.md b/.changeset/big-gorillas-fail1.md deleted file mode 100644 index 18c2d621d7..0000000000 --- a/.changeset/big-gorillas-fail1.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-bitbucket-cloud': patch ---- - -Renamed `bitbucketCloudEventRouterEventsModule` to `eventsModuleBitbucketCloudEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail2.md b/.changeset/big-gorillas-fail2.md deleted file mode 100644 index bc34bf9aaa..0000000000 --- a/.changeset/big-gorillas-fail2.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-aws-sqs': patch ---- - -Renamed `awsSqsConsumingEventPublisherEventsModule` to `eventsModuleAwsSqsConsumingEventPublisher` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail3.md b/.changeset/big-gorillas-fail3.md deleted file mode 100644 index 352c1a2cff..0000000000 --- a/.changeset/big-gorillas-fail3.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-gerrit': patch ---- - -Renamed `gerritEventRouterEventsModule` to `eventsModuleGerritEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail4.md b/.changeset/big-gorillas-fail4.md deleted file mode 100644 index add8699f8b..0000000000 --- a/.changeset/big-gorillas-fail4.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-github': patch ---- - -Renamed `githubEventRouterEventsModule` to `eventsModuleGithubEventRouter` and `githubWebhookEventsModule` to `eventsModuleGithubWebhook`, to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail5.md b/.changeset/big-gorillas-fail5.md deleted file mode 100644 index 549eb61f24..0000000000 --- a/.changeset/big-gorillas-fail5.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-gitlab': patch ---- - -Renamed `gitlabEventRouterEventsModule` to `eventsModuleGitlabEventRouter` and `gitlabWebhookEventsModule` to `eventsModuleGitlabWebhook` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail6.md b/.changeset/big-gorillas-fail6.md deleted file mode 100644 index 6622b5222e..0000000000 --- a/.changeset/big-gorillas-fail6.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-azure': patch ---- - -Renamed `azureDevOpsEventRouterEventsModule` to `eventsModuleAzureDevOpsEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/breezy-bees-care.md b/.changeset/breezy-bees-care.md deleted file mode 100644 index 9a5b59fe03..0000000000 --- a/.changeset/breezy-bees-care.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/catalog-client': minor ---- - -Add `queryEntities` method to `CatalogApi`. diff --git a/.changeset/bright-kids-raise.md b/.changeset/bright-kids-raise.md deleted file mode 100644 index e0d69e0c71..0000000000 --- a/.changeset/bright-kids-raise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-todo-backend': patch ---- - -todo-backend is now exposed as a plugin which uses the new plugin system diff --git a/.changeset/bright-pumpkins-bake.md b/.changeset/bright-pumpkins-bake.md new file mode 100644 index 0000000000..4c16e307ec --- /dev/null +++ b/.changeset/bright-pumpkins-bake.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Rename output parameter `mergeRequestURL` of `publish:gitlab:merge-request` action to `mergeRequestUrl`. diff --git a/.changeset/chatty-coats-thank.md b/.changeset/chatty-coats-thank.md new file mode 100644 index 0000000000..17faf43d87 --- /dev/null +++ b/.changeset/chatty-coats-thank.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Fix the build for packages with multiple entry points to avoid duplicated modules. diff --git a/.changeset/clean-dolls-search.md b/.changeset/clean-dolls-search.md new file mode 100644 index 0000000000..a8f0da3c4d --- /dev/null +++ b/.changeset/clean-dolls-search.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-common': patch +--- + +Added permissions for authorizing parameters and steps diff --git a/.changeset/clean-lemons-jump.md b/.changeset/clean-lemons-jump.md deleted file mode 100644 index ab6f22136a..0000000000 --- a/.changeset/clean-lemons-jump.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Button labels in the sidebar (previously displayed in uppercase) will be displayed in the case that is provided without any transformations. -For example, a sidebar button with the label "Search" will appear as Search, "search" will appear as search, "SEARCH" will appear as SEARCH etc. -This can potentially affect any overriding styles previously applied to change the appearance of Button labels in the Sidebar. diff --git a/.changeset/clean-planes-join.md b/.changeset/clean-planes-join.md deleted file mode 100644 index dd8280f553..0000000000 --- a/.changeset/clean-planes-join.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-permission-node': patch ---- - -Changed the `createPermissionIntegrationRouter` API to allow `getResources`, `resourceType` and `rules` to be optional diff --git a/.changeset/clever-dogs-cheat.md b/.changeset/clever-dogs-cheat.md deleted file mode 100644 index 56fcf3d30c..0000000000 --- a/.changeset/clever-dogs-cheat.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -'@backstage/plugin-search-backend-module-elasticsearch': patch -'@backstage/plugin-tech-insights-backend-module-jsonfc': patch -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-splunk-on-call': patch -'@backstage/plugin-techdocs-react': patch -'@backstage/plugin-catalog-react': patch -'@backstage/plugin-tech-insights': patch -'@backstage/plugin-techdocs-node': patch -'@backstage/plugin-search-react': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-auth-node': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-explore': patch -'@backstage/plugin-search': patch ---- - -Minor API report tweaks diff --git a/.changeset/cold-dogs-watch.md b/.changeset/cold-dogs-watch.md deleted file mode 100644 index 99b25a833e..0000000000 --- a/.changeset/cold-dogs-watch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-puppetdb': patch ---- - -Added a `catalogModulePuppetDbEntityProvider` alpha export for the new backend system diff --git a/.changeset/cool-clocks-prove.md b/.changeset/cool-clocks-prove.md deleted file mode 100644 index dfd7b8c5eb..0000000000 --- a/.changeset/cool-clocks-prove.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Fixed a bug where additional backend package entry points where not properly marked as internal during local development. diff --git a/.changeset/cool-feet-speak.md b/.changeset/cool-feet-speak.md deleted file mode 100644 index 9240c5bb52..0000000000 --- a/.changeset/cool-feet-speak.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-scaffolder': patch ---- - -Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. diff --git a/.changeset/create-app-1678209629.md b/.changeset/create-app-1678209629.md deleted file mode 100644 index b50d431d4b..0000000000 --- a/.changeset/create-app-1678209629.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Bumped create-app version. diff --git a/.changeset/create-app-1676993958.md b/.changeset/create-app-1679405836.md similarity index 100% rename from .changeset/create-app-1676993958.md rename to .changeset/create-app-1679405836.md diff --git a/.changeset/curly-boats-trade.md b/.changeset/curly-boats-trade.md new file mode 100644 index 0000000000..773d66734c --- /dev/null +++ b/.changeset/curly-boats-trade.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs': patch +--- + +Corrected styling of nested objects in AsyncAPI to avoid inappropriate uppercase text transformation of nested objects. diff --git a/.changeset/curly-jobs-kneel.md b/.changeset/curly-jobs-kneel.md new file mode 100644 index 0000000000..f313beab88 --- /dev/null +++ b/.changeset/curly-jobs-kneel.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-scaffolder-node': patch +'@backstage/plugin-scaffolder-react': patch +--- + +Added a possibility to cancel the running task (executing of a scaffolder template) diff --git a/.changeset/curvy-pets-hang.md b/.changeset/curvy-pets-hang.md deleted file mode 100644 index 3a2d11ac12..0000000000 --- a/.changeset/curvy-pets-hang.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -Tweaked type dependency check to trim wildcard type imports. diff --git a/.changeset/curvy-rocks-guess.md b/.changeset/curvy-rocks-guess.md new file mode 100644 index 0000000000..0ce46f787d --- /dev/null +++ b/.changeset/curvy-rocks-guess.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-org': patch +--- + +Allow the title of the group profile card to use the title of the entity, if it is set. diff --git a/.changeset/dull-adults-drum.md b/.changeset/dull-adults-drum.md deleted file mode 100644 index 088eb1539e..0000000000 --- a/.changeset/dull-adults-drum.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-adr': patch ---- - -Updated readme instructions diff --git a/.changeset/eight-radios-bake.md b/.changeset/eight-radios-bake.md deleted file mode 100644 index 173739a625..0000000000 --- a/.changeset/eight-radios-bake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -throw error from catalog:fetch scaffolder action when entity is null and optional is false diff --git a/.changeset/eighty-chairs-roll.md b/.changeset/eighty-chairs-roll.md deleted file mode 100644 index c981229378..0000000000 --- a/.changeset/eighty-chairs-roll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': minor ---- - -Update `EntityPicker` to use the fully qualified entity ref instead of the humanized version. diff --git a/.changeset/eighty-geese-return.md b/.changeset/eighty-geese-return.md deleted file mode 100644 index 49361de8e7..0000000000 --- a/.changeset/eighty-geese-return.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-msgraph': patch ---- - -Revert using `baseUrl` for MS Graph provider as it breaks token retrieval diff --git a/.changeset/eleven-bats-tease.md b/.changeset/eleven-bats-tease.md new file mode 100644 index 0000000000..732055ca52 --- /dev/null +++ b/.changeset/eleven-bats-tease.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': minor +--- + +**BREAKING**: `KubernetesBuilder.create` now requires a `permissions` field of type `PermissionEvaluator`. The kubernetes `/proxy` endpoint now requires two tokens: the `Backstage-Kubernetes-Authorization` header should contain a bearer token for the target cluster, and the `Authorization` header should contain a backstage identity token. The kubernetes `/proxy` endpoint now requires a `Backstage-Kubernetes-Cluster` header replacing the previously required `X-Kubernetes-Cluster` header. diff --git a/.changeset/eleven-coats-refuse.md b/.changeset/eleven-coats-refuse.md new file mode 100644 index 0000000000..a7589ff733 --- /dev/null +++ b/.changeset/eleven-coats-refuse.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Support importing `.md` files in build loader diff --git a/.changeset/empty-books-occur.md b/.changeset/empty-books-occur.md deleted file mode 100644 index 69218c5cfa..0000000000 --- a/.changeset/empty-books-occur.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-search-react': patch ---- - -Correctly disable next button in `SearchPagination` on last page diff --git a/.changeset/fair-roses-stare.md b/.changeset/fair-roses-stare.md new file mode 100644 index 0000000000..358765e092 --- /dev/null +++ b/.changeset/fair-roses-stare.md @@ -0,0 +1,14 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Allow use of `{ exists: true }` value inside filters to filter entities that has that key. + +this example will filter all entities that has the annotation `someAnnotation` set to any value. + +```yaml +ui:options: + catalogFilter: + kind: Group + metadata.annotations.someAnnotation: { exists: true } +``` diff --git a/.changeset/famous-sloths-tie.md b/.changeset/famous-sloths-tie.md deleted file mode 100644 index 53932afab6..0000000000 --- a/.changeset/famous-sloths-tie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -Getting credentials in the RepoUrlPicker now also works for targets without owner (e.g. Bitbucket Server). diff --git a/.changeset/fast-snakes-buy.md b/.changeset/fast-snakes-buy.md new file mode 100644 index 0000000000..711588918d --- /dev/null +++ b/.changeset/fast-snakes-buy.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-entity-feedback': minor +'@backstage/plugin-entity-feedback-backend': patch +'@backstage/plugin-entity-feedback-common': patch +--- + +Added an endpoint to fetch anonymous aggregated results from an entity diff --git a/.changeset/fifty-beds-dress.md b/.changeset/fifty-beds-dress.md deleted file mode 100644 index 19049732cc..0000000000 --- a/.changeset/fifty-beds-dress.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-puppetdb': minor ---- - -Initial version of the plugin. diff --git a/.changeset/flat-kids-occur.md b/.changeset/flat-kids-occur.md deleted file mode 100644 index 4e4c002928..0000000000 --- a/.changeset/flat-kids-occur.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': minor -'@backstage/plugin-scaffolder': minor ---- - -Move `useTaskStream`, `TaskBorder`, `TaskLogStream` and `TaskSteps` into `scaffolder-react`. diff --git a/.changeset/flat-peaches-act.md b/.changeset/flat-peaches-act.md deleted file mode 100644 index e4b4138ee5..0000000000 --- a/.changeset/flat-peaches-act.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-backend': patch ---- - -Techdocs backend explains a bit more about what might have caused the docs not being found when building techdocs. diff --git a/.changeset/forty-gorillas-help.md b/.changeset/forty-gorillas-help.md new file mode 100644 index 0000000000..3f185525a2 --- /dev/null +++ b/.changeset/forty-gorillas-help.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Minor visual tweaks to adapt to changes in mkdocs-material v9 diff --git a/.changeset/forty-snails-clap.md b/.changeset/forty-snails-clap.md deleted file mode 100644 index f5aef12d9d..0000000000 --- a/.changeset/forty-snails-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': minor ---- - -Added endpoint to get a list of known incremental entity providers diff --git a/.changeset/four-lizards-grin.md b/.changeset/four-lizards-grin.md deleted file mode 100644 index 6fa5f57243..0000000000 --- a/.changeset/four-lizards-grin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fix export of `defaultCatalogCollatorEntityTransformer`. diff --git a/.changeset/fresh-hairs-switch.md b/.changeset/fresh-hairs-switch.md deleted file mode 100644 index 16d3b119e5..0000000000 --- a/.changeset/fresh-hairs-switch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-tasks': minor ---- - -add functionality to get descriptions from the scheduler for triggering diff --git a/.changeset/fresh-schools-fly.md b/.changeset/fresh-schools-fly.md new file mode 100644 index 0000000000..e364e08d43 --- /dev/null +++ b/.changeset/fresh-schools-fly.md @@ -0,0 +1,11 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': minor +--- + +**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` diff --git a/.changeset/funny-pots-hide.md b/.changeset/funny-pots-hide.md new file mode 100644 index 0000000000..32388a93a5 --- /dev/null +++ b/.changeset/funny-pots-hide.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend': minor +--- + +Exports search plugin that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](../docs/features/search/how-to-guides.md#how-to-migrate-to-use-search-together-with-the-new-backend-system). diff --git a/.changeset/funny-rivers-grin.md b/.changeset/funny-rivers-grin.md new file mode 100644 index 0000000000..55463e40a7 --- /dev/null +++ b/.changeset/funny-rivers-grin.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Add `permissionApi` as dependency of the scaffolder-backend plugin diff --git a/.changeset/fuzzy-actors-turn.md b/.changeset/fuzzy-actors-turn.md new file mode 100644 index 0000000000..bd92ad34ef --- /dev/null +++ b/.changeset/fuzzy-actors-turn.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Fixes bug whereby backstage crashes when bad credentials are provided to the kubernetes plugin. diff --git a/.changeset/fuzzy-trains-search.md b/.changeset/fuzzy-trains-search.md deleted file mode 100644 index 229d25f3b5..0000000000 --- a/.changeset/fuzzy-trains-search.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -Fix icon alignment in `CatalogSearchResultListItem` diff --git a/.changeset/fuzzy-wombats-search.md b/.changeset/fuzzy-wombats-search.md new file mode 100644 index 0000000000..693e42399a --- /dev/null +++ b/.changeset/fuzzy-wombats-search.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Added `fetch:plain:file` action to fetch a single file, this action is also added to the list of built-in actions. diff --git a/.changeset/gentle-bears-love.md b/.changeset/gentle-bears-love.md deleted file mode 100644 index b6f6e3cfcf..0000000000 --- a/.changeset/gentle-bears-love.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-msgraph': patch ---- - -Fixed msgraph catalog backend to use user.select option when fetching user from AzureAD diff --git a/.changeset/gentle-pears-clean.md b/.changeset/gentle-pears-clean.md deleted file mode 100644 index d92c3709ae..0000000000 --- a/.changeset/gentle-pears-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/eslint-plugin': patch ---- - -Fixing a bug that we should check internal dependencies too diff --git a/.changeset/giant-hairs-serve.md b/.changeset/giant-hairs-serve.md new file mode 100644 index 0000000000..0f77a6fe34 --- /dev/null +++ b/.changeset/giant-hairs-serve.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-search-backend-module-elasticsearch': minor +'@backstage/plugin-search-backend-module-pg': patch +--- + +Search backend modules migrated to the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](../docs/features/search/how-to-guides.md#how-to-migrate-to-use-search-together-with-the-new-backend-system). diff --git a/.changeset/gorgeous-pumas-speak.md b/.changeset/gorgeous-pumas-speak.md deleted file mode 100644 index 60f40c6748..0000000000 --- a/.changeset/gorgeous-pumas-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -fix entity switch rendering when there is no default case diff --git a/.changeset/great-trains-jam.md b/.changeset/great-trains-jam.md deleted file mode 100644 index 91133bfe32..0000000000 --- a/.changeset/great-trains-jam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs': patch ---- - -Fix bug that caused next and previous links not to work with certain versions of mkdocs-material diff --git a/.changeset/grumpy-bikes-begin.md b/.changeset/grumpy-bikes-begin.md deleted file mode 100644 index a98e6651f5..0000000000 --- a/.changeset/grumpy-bikes-begin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-insights-backend': patch ---- - -Add DB index to improve latency of latest fact query diff --git a/.changeset/happy-boxes-arrive.md b/.changeset/happy-boxes-arrive.md deleted file mode 100644 index 85998c1bdd..0000000000 --- a/.changeset/happy-boxes-arrive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -fix bug with `hasErrors` returning false when dealing with empty objects diff --git a/.changeset/healthy-buses-live-1.md b/.changeset/healthy-buses-live-1.md deleted file mode 100644 index 7e433372df..0000000000 --- a/.changeset/healthy-buses-live-1.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch ---- - -Renamed `incrementalIngestionEntityProviderCatalogModule` to `catalogModuleIncrementalIngestionEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-2.md b/.changeset/healthy-buses-live-2.md deleted file mode 100644 index ab577276d8..0000000000 --- a/.changeset/healthy-buses-live-2.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-bitbucket-server': patch ---- - -Renamed `bitbucketServerEntityProviderCatalogModule` to `catalogModuleBitbucketServerEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-3.md b/.changeset/healthy-buses-live-3.md deleted file mode 100644 index 493236ea73..0000000000 --- a/.changeset/healthy-buses-live-3.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch ---- - -Renamed `bitbucketCloudEntityProviderCatalogModule` to `catalogModuleBitbucketCloudEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-4.md b/.changeset/healthy-buses-live-4.md deleted file mode 100644 index fdc223a7f4..0000000000 --- a/.changeset/healthy-buses-live-4.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-msgraph': patch ---- - -Renamed `microsoftGraphOrgEntityProviderCatalogModule` to `catalogModuleMicrosoftGraphOrgEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-5.md b/.changeset/healthy-buses-live-5.md deleted file mode 100644 index f540751696..0000000000 --- a/.changeset/healthy-buses-live-5.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gerrit': patch ---- - -Renamed `gerritEntityProviderCatalogModule` to `catalogModuleGerritEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-6.md b/.changeset/healthy-buses-live-6.md deleted file mode 100644 index f293e56eae..0000000000 --- a/.changeset/healthy-buses-live-6.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-github': patch ---- - -Renamed `githubEntityProviderCatalogModule` to `catalogModuleGithubEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-7.md b/.changeset/healthy-buses-live-7.md deleted file mode 100644 index 7e7219bf01..0000000000 --- a/.changeset/healthy-buses-live-7.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gitlab': patch ---- - -Renamed `gitlabDiscoveryEntityProviderCatalogModule` to `catalogModuleGitlabDiscoveryEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-8.md b/.changeset/healthy-buses-live-8.md deleted file mode 100644 index 9137a3b31a..0000000000 --- a/.changeset/healthy-buses-live-8.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-azure': patch ---- - -Renamed `azureDevOpsEntityProviderCatalogModule` to `catalogModuleAzureDevOpsEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-9.md b/.changeset/healthy-buses-live-9.md deleted file mode 100644 index dbcba51470..0000000000 --- a/.changeset/healthy-buses-live-9.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-aws': patch ---- - -Renamed `awsS3EntityProviderCatalogModule` to `catalogModuleAwsS3EntityProviders` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/heavy-colts-wash.md b/.changeset/heavy-colts-wash.md new file mode 100644 index 0000000000..c22cb70dbf --- /dev/null +++ b/.changeset/heavy-colts-wash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-common': patch +--- + +Export `typeguard` for `isTemplateEntityV1beta3` diff --git a/.changeset/honest-clouds-shout.md b/.changeset/honest-clouds-shout.md deleted file mode 100644 index 0a7249d9ad..0000000000 --- a/.changeset/honest-clouds-shout.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -catalog write action should allow any shape of object diff --git a/.changeset/honest-nails-bake.md b/.changeset/honest-nails-bake.md deleted file mode 100644 index 03d5a080c9..0000000000 --- a/.changeset/honest-nails-bake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-octopus-deploy': minor ---- - -Initial version diff --git a/.changeset/hungry-lies-cry.md b/.changeset/hungry-lies-cry.md new file mode 100644 index 0000000000..712aef6172 --- /dev/null +++ b/.changeset/hungry-lies-cry.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +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. diff --git a/.changeset/hungry-monkeys-reply.md b/.changeset/hungry-monkeys-reply.md new file mode 100644 index 0000000000..c7f5d54ea1 --- /dev/null +++ b/.changeset/hungry-monkeys-reply.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': minor +--- + +Added a new EntitySwitch isResourceType to allow different views depending on Resource type diff --git a/.changeset/khaki-cars-drum.md b/.changeset/khaki-cars-drum.md new file mode 100644 index 0000000000..325b0f8ba5 --- /dev/null +++ b/.changeset/khaki-cars-drum.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Enforce the secret visibility of certificates and client secrets in the auth backend. Also, document all known options for each auth plugin. diff --git a/.changeset/khaki-doors-compare.md b/.changeset/khaki-doors-compare.md new file mode 100644 index 0000000000..a2c4de020a --- /dev/null +++ b/.changeset/khaki-doors-compare.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-vault-backend': minor +--- + +Allow generic Vault clients to be passed into the builder diff --git a/.changeset/khaki-guests-turn.md b/.changeset/khaki-guests-turn.md new file mode 100644 index 0000000000..5676236aae --- /dev/null +++ b/.changeset/khaki-guests-turn.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-catalog-backend-module-openapi': patch +'@backstage/plugin-catalog-backend-module-ldap': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-catalog-backend': patch +--- + +Fix deprecated types. diff --git a/.changeset/khaki-poems-run.md b/.changeset/khaki-poems-run.md deleted file mode 100644 index 74db902c02..0000000000 --- a/.changeset/khaki-poems-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-entity-validation': patch ---- - -Fixed bug in EntityVaidation plugin where string in text box was unable to be updated. diff --git a/.changeset/lazy-apples-destroy.md b/.changeset/lazy-apples-destroy.md new file mode 100644 index 0000000000..43fcfbae85 --- /dev/null +++ b/.changeset/lazy-apples-destroy.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +`scaffolder/next`: Bump `@rjsf/*` deps to 5.3.1 diff --git a/.changeset/lazy-monkeys-worry.md b/.changeset/lazy-monkeys-worry.md new file mode 100644 index 0000000000..9dc3ea514e --- /dev/null +++ b/.changeset/lazy-monkeys-worry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights': patch +--- + +The `Check` type now optionally includes the `failureMetadata` and `successMetadata` as returned by the `runChecks` call. diff --git a/.changeset/light-bees-end.md b/.changeset/light-bees-end.md deleted file mode 100644 index 9fbbc44da0..0000000000 --- a/.changeset/light-bees-end.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch ---- - -GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters diff --git a/.changeset/light-sheep-trade.md b/.changeset/light-sheep-trade.md deleted file mode 100644 index 480ffc973e..0000000000 --- a/.changeset/light-sheep-trade.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Updated the ESLint plugin configuration that is enabled through `yarn start --check` to only pick up valid source files. diff --git a/.changeset/long-gorillas-remain.md b/.changeset/long-gorillas-remain.md new file mode 100644 index 0000000000..60ad6fa092 --- /dev/null +++ b/.changeset/long-gorillas-remain.md @@ -0,0 +1,9 @@ +--- +'@backstage/core-components': patch +'@backstage/app-defaults': minor +'@backstage/core-app-api': minor +'@backstage/plugin-auth-backend': patch +'@backstage/test-utils': minor +--- + +Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. diff --git a/.changeset/long-nails-pump.md b/.changeset/long-nails-pump.md deleted file mode 100644 index d9eefc0249..0000000000 --- a/.changeset/long-nails-pump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Added a new `migrate package-exports` command that synchronizes package exports fields in all `package.json`s. diff --git a/.changeset/long-wolves-drive.md b/.changeset/long-wolves-drive.md deleted file mode 100644 index 1c3ffadb5a..0000000000 --- a/.changeset/long-wolves-drive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-octopus-deploy': patch ---- - -Added Octopus Deploy logo diff --git a/.changeset/lovely-tigers-look.md b/.changeset/lovely-tigers-look.md deleted file mode 100644 index 5e7d230e6d..0000000000 --- a/.changeset/lovely-tigers-look.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-adr-backend': patch ---- - -Support MADR v3 format diff --git a/.changeset/many-eggs-press.md b/.changeset/many-eggs-press.md new file mode 100644 index 0000000000..551cf9e759 --- /dev/null +++ b/.changeset/many-eggs-press.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-search-react': patch +'@backstage/plugin-techdocs': patch +--- + +Fixes a UI bug in search result item which rendered the item text with incorrect font size and color diff --git a/.changeset/mean-toys-itch.md b/.changeset/mean-toys-itch.md deleted file mode 100644 index 75252b3482..0000000000 --- a/.changeset/mean-toys-itch.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -'@backstage/backend-common': patch ---- - -Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres - -The example config below connects to the database as user `v-backstage-123` but sets the ownership of -the create schemas and tables to `backstage` - -```yaml -backend: - database: - client: pg - pluginDivisionMode: schema - role: backstage - connection: - user: v-backstage-123 - ... -``` diff --git a/.changeset/metal-suns-rhyme.md b/.changeset/metal-suns-rhyme.md deleted file mode 100644 index 3fefdca7c6..0000000000 --- a/.changeset/metal-suns-rhyme.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Bumped the `msw` version in templates to 1.0.0 diff --git a/.changeset/mighty-games-turn.md b/.changeset/mighty-games-turn.md deleted file mode 100644 index 38c2487835..0000000000 --- a/.changeset/mighty-games-turn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-radar': patch ---- - -Update colors to match Zalando's tech radar, also add coloring on title and legend to match ring color. diff --git a/.changeset/mighty-lamps-cross.md b/.changeset/mighty-lamps-cross.md new file mode 100644 index 0000000000..af09263f2e --- /dev/null +++ b/.changeset/mighty-lamps-cross.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Fixed backend start command on Windows by removing the use of platform dependent path joins. diff --git a/.changeset/mighty-years-own.md b/.changeset/mighty-years-own.md deleted file mode 100644 index b14b974bc4..0000000000 --- a/.changeset/mighty-years-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -scaffolder/next: Move the `uiSchema` to its own property in the validation `context` to align with component development and access of `ui:options` diff --git a/.changeset/moody-apes-know.md b/.changeset/moody-apes-know.md deleted file mode 100644 index bd48cb108e..0000000000 --- a/.changeset/moody-apes-know.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch -'@backstage/plugin-catalog-backend-module-bitbucket-server': patch -'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch -'@backstage/plugin-catalog-backend-module-bitbucket': patch -'@backstage/plugin-catalog-backend-module-puppetdb': patch -'@backstage/plugin-catalog-backend-module-msgraph': patch -'@backstage/plugin-catalog-backend-module-gerrit': patch -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/plugin-catalog-backend-module-gitlab': patch -'@backstage/plugin-catalog-backend-module-azure': patch -'@backstage/plugin-catalog-backend-module-ldap': patch -'@backstage/plugin-catalog-backend-module-aws': patch ---- - -Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` diff --git a/.changeset/nasty-nails-appear.md b/.changeset/nasty-nails-appear.md new file mode 100644 index 0000000000..fdb35f052c --- /dev/null +++ b/.changeset/nasty-nails-appear.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-gitlab': minor +--- + +Add Gitlab Scaffolder Plugin diff --git a/.changeset/neat-donkeys-work.md b/.changeset/neat-donkeys-work.md new file mode 100644 index 0000000000..dfa3236d43 --- /dev/null +++ b/.changeset/neat-donkeys-work.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': minor +--- + +scaffolder/next: removing the `routeRefs` and exporting the originals on `scaffolderPlugin.routes.x` instead diff --git a/.changeset/new-jobs-deny.md b/.changeset/new-jobs-deny.md deleted file mode 100644 index e7b5bff71a..0000000000 --- a/.changeset/new-jobs-deny.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-react': minor ---- - -Add possibility to re-use EntityPicker for filters with multiple select. diff --git a/.changeset/new-pigs-jam.md b/.changeset/new-pigs-jam.md new file mode 100644 index 0000000000..efea0076d2 --- /dev/null +++ b/.changeset/new-pigs-jam.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': minor +--- + +Created `confluence:transform:markdown` action for converting confluence docs to Markdown. diff --git a/.changeset/nice-planets-wave.md b/.changeset/nice-planets-wave.md deleted file mode 100644 index 2af1a14d83..0000000000 --- a/.changeset/nice-planets-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-linguist-backend': minor ---- - -**BREAKING** The linguist-backend `createRouter` now requires that the `tokenManger` is passed to the router. diff --git a/.changeset/nine-bikes-applaud.md b/.changeset/nine-bikes-applaud.md deleted file mode 100644 index 77a1c0e4be..0000000000 --- a/.changeset/nine-bikes-applaud.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch ---- - -allow container runner to be undefined in cookiecutter plugin diff --git a/.changeset/ninety-turtles-wait.md b/.changeset/ninety-turtles-wait.md deleted file mode 100644 index 683583528f..0000000000 --- a/.changeset/ninety-turtles-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs': patch ---- - -The HTML tag attributes in the documentation content inserted to shadow DOM is preserved to improve accessibility diff --git a/.changeset/odd-fireants-bathe.md b/.changeset/odd-fireants-bathe.md deleted file mode 100644 index d4b7f5dc5a..0000000000 --- a/.changeset/odd-fireants-bathe.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-adr-backend': patch -'@backstage/cli': patch ---- - -Adjust express dependencies to be the same as the rest of the project diff --git a/.changeset/odd-grapes-double.md b/.changeset/odd-grapes-double.md new file mode 100644 index 0000000000..7ef7486b60 --- /dev/null +++ b/.changeset/odd-grapes-double.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-permission-node': patch +--- + +Added createConditionAuthorizer utility function, which takes some permission conditions and returns a function that returns a definitive authorization result given a decision and a resource. diff --git a/.changeset/odd-oranges-tease.md b/.changeset/odd-oranges-tease.md deleted file mode 100644 index f9d5e60d19..0000000000 --- a/.changeset/odd-oranges-tease.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -'@backstage/plugin-git-release-manager': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-newrelic-dashboard': patch -'@backstage/core-components': patch -'@backstage/plugin-code-coverage': patch -'@backstage/plugin-code-climate': patch -'@backstage/plugin-azure-sites': patch -'@backstage/plugin-firehydrant': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-tech-radar': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-shortcuts': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-catalog': patch -'@backstage/plugin-explore': patch -'@backstage/plugin-ilert': patch -'@backstage/plugin-org': patch ---- - -Change black & white colors to be theme aware diff --git a/.changeset/odd-waves-rescue.md b/.changeset/odd-waves-rescue.md deleted file mode 100644 index e435bc9962..0000000000 --- a/.changeset/odd-waves-rescue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -Create an "Other Templates" group when groups are given to scaffolder/next. diff --git a/.changeset/old-cougars-sit.md b/.changeset/old-cougars-sit.md new file mode 100644 index 0000000000..cdab8b1291 --- /dev/null +++ b/.changeset/old-cougars-sit.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Fix parsing error when kubernetes api is returning badly structured data. diff --git a/.changeset/old-foxes-shave.md b/.changeset/old-foxes-shave.md deleted file mode 100644 index 4cd0808103..0000000000 --- a/.changeset/old-foxes-shave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-api-docs': patch ---- - -Add ApiDefinitionDialog component for fast access to the API definition in ProvidedApiCards and ConsumedApiCards. diff --git a/.changeset/olive-berries-poke.md b/.changeset/olive-berries-poke.md deleted file mode 100644 index 48bde329c8..0000000000 --- a/.changeset/olive-berries-poke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -scaffolder/next: Fix for steps without properties diff --git a/.changeset/olive-months-talk.md b/.changeset/olive-months-talk.md new file mode 100644 index 0000000000..b3a89d1f9e --- /dev/null +++ b/.changeset/olive-months-talk.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Added the possibility to authorize parameters and steps of a template + +The scaffolder plugin is now integrated with the permission framework. +It is possible to toggle parameters or actions within templates by marking each section with specific `tags`, inside a `backstage:permissions` property under each parameter or action. Each parameter or action can then be permissioned by using a conditional decision containing the `scaffolderTemplateRules.hasTag` rule. diff --git a/.changeset/orange-experts-hug.md b/.changeset/orange-experts-hug.md deleted file mode 100644 index 1bf8b4a7d7..0000000000 --- a/.changeset/orange-experts-hug.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-api-docs': patch ---- - -Fix dark theme Swagger's clear button font color. diff --git a/.changeset/orange-rabbits-jam.md b/.changeset/orange-rabbits-jam.md new file mode 100644 index 0000000000..fb60813c7d --- /dev/null +++ b/.changeset/orange-rabbits-jam.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Add full text search support to the `by-query` endpoint. diff --git a/.changeset/perfect-mayflies-greet.md b/.changeset/perfect-mayflies-greet.md deleted file mode 100644 index 7e57507dae..0000000000 --- a/.changeset/perfect-mayflies-greet.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Updated frontend plugin template to use some more recent features diff --git a/.changeset/pink-dolls-unite.md b/.changeset/pink-dolls-unite.md deleted file mode 100644 index 418edfd92b..0000000000 --- a/.changeset/pink-dolls-unite.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-linguist-backend': patch ---- - -Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API). diff --git a/.changeset/polite-chicken-do.md b/.changeset/polite-chicken-do.md deleted file mode 100644 index 33e4149253..0000000000 --- a/.changeset/polite-chicken-do.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-vault-backend': patch ---- - -Ignore the `eslint` error diff --git a/.changeset/polite-falcons-jump.md b/.changeset/polite-falcons-jump.md deleted file mode 100644 index ab9209913d..0000000000 --- a/.changeset/polite-falcons-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-org': patch ---- - -Fix small UI-glitch in MemberListCard diff --git a/.changeset/polite-wombats-smash.md b/.changeset/polite-wombats-smash.md deleted file mode 100644 index 98569e1799..0000000000 --- a/.changeset/polite-wombats-smash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/errors': patch ---- - -Added `NotImplementedError`, which can be used when the server does not recognize the request method and is incapable of supporting it for any resource. diff --git a/.changeset/popular-parents-crash.md b/.changeset/popular-parents-crash.md new file mode 100644 index 0000000000..0c1046aba5 --- /dev/null +++ b/.changeset/popular-parents-crash.md @@ -0,0 +1,18 @@ +--- +'@backstage/plugin-permission-backend': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-permission-common': patch +'@backstage/core-components': patch +'@backstage/plugin-playlist-backend': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-permission-node': patch +'@backstage/plugin-scaffolder-node': patch +'@backstage/backend-tasks': patch +'@backstage/plugin-search-backend': patch +'@backstage/core-app-api': patch +'@backstage/plugin-scaffolder': patch +'@backstage/cli': patch +--- + +Bump `zod` and `zod-to-json-schema` dependencies. diff --git a/.changeset/pre.json b/.changeset/pre.json index fc7fbffc9a..042939035f 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,327 +1,262 @@ { - "mode": "exit", + "mode": "pre", "tag": "next", "initialVersions": { - "example-app": "0.2.80", - "@backstage/app-defaults": "1.2.0", - "example-backend": "0.2.80", - "@backstage/backend-app-api": "0.4.0", - "@backstage/backend-common": "0.18.2", - "@backstage/backend-defaults": "0.1.7", - "@backstage/backend-dev-utils": "0.1.0", - "example-backend-next": "0.0.8", - "@backstage/backend-plugin-api": "0.4.0", - "@backstage/backend-tasks": "0.4.3", - "@backstage/backend-test-utils": "0.1.34", - "@backstage/catalog-client": "1.3.1", - "@backstage/catalog-model": "1.2.0", - "@backstage/cli": "0.22.2", - "@backstage/cli-common": "0.1.11", - "@backstage/codemods": "0.1.43", - "@backstage/config": "1.0.6", - "@backstage/config-loader": "1.1.8", - "@backstage/core-app-api": "1.5.0", - "@backstage/core-components": "0.12.4", - "@backstage/core-plugin-api": "1.4.0", - "@backstage/create-app": "0.4.37", - "@backstage/dev-utils": "1.0.12", - "e2e-test": "0.2.0", - "@backstage/errors": "1.1.4", - "@backstage/eslint-plugin": "0.1.0", - "@backstage/integration": "1.4.2", - "@backstage/integration-aws-node": "0.1.1", - "@backstage/integration-react": "1.1.10", - "@backstage/release-manifests": "0.0.8", - "@backstage/repo-tools": "0.1.2", - "@techdocs/cli": "1.3.2", - "techdocs-cli-embedded-app": "0.2.79", - "@backstage/test-utils": "1.2.5", - "@backstage/theme": "0.2.17", + "example-app": "0.2.81", + "@backstage/app-defaults": "1.2.1", + "example-backend": "0.2.81", + "@backstage/backend-app-api": "0.4.1", + "@backstage/backend-common": "0.18.3", + "@backstage/backend-defaults": "0.1.8", + "@backstage/backend-dev-utils": "0.1.1", + "example-backend-next": "0.0.9", + "@backstage/backend-plugin-api": "0.5.0", + "@backstage/backend-tasks": "0.5.0", + "@backstage/backend-test-utils": "0.1.35", + "@backstage/catalog-client": "1.4.0", + "@backstage/catalog-model": "1.2.1", + "@backstage/cli": "0.22.4", + "@backstage/cli-common": "0.1.12", + "@backstage/codemods": "0.1.44", + "@backstage/config": "1.0.7", + "@backstage/config-loader": "1.1.9", + "@backstage/core-app-api": "1.6.0", + "@backstage/core-components": "0.12.5", + "@backstage/core-plugin-api": "1.5.0", + "@backstage/create-app": "0.4.38", + "@backstage/dev-utils": "1.0.13", + "e2e-test": "0.2.1", + "@backstage/errors": "1.1.5", + "@backstage/eslint-plugin": "0.1.2", + "@backstage/integration": "1.4.3", + "@backstage/integration-aws-node": "0.1.2", + "@backstage/integration-react": "1.1.11", + "@backstage/release-manifests": "0.0.9", + "@backstage/repo-tools": "0.1.3", + "@techdocs/cli": "1.4.0", + "techdocs-cli-embedded-app": "0.2.80", + "@backstage/test-utils": "1.2.6", + "@backstage/theme": "0.2.18", "@backstage/types": "1.0.2", "@backstage/version-bridge": "1.0.3", - "@backstage/plugin-adr": "0.4.0", - "@backstage/plugin-adr-backend": "0.3.0", - "@backstage/plugin-adr-common": "0.2.6", - "@backstage/plugin-airbrake": "0.3.15", - "@backstage/plugin-airbrake-backend": "0.2.15", - "@backstage/plugin-allure": "0.1.31", - "@backstage/plugin-analytics-module-ga": "0.1.26", - "@backstage/plugin-apache-airflow": "0.2.8", - "@backstage/plugin-api-docs": "0.9.0", + "@backstage/plugin-adr": "0.4.1", + "@backstage/plugin-adr-backend": "0.3.1", + "@backstage/plugin-adr-common": "0.2.7", + "@backstage/plugin-airbrake": "0.3.16", + "@backstage/plugin-airbrake-backend": "0.2.16", + "@backstage/plugin-allure": "0.1.32", + "@backstage/plugin-analytics-module-ga": "0.1.27", + "@backstage/plugin-apache-airflow": "0.2.9", + "@backstage/plugin-api-docs": "0.9.1", "@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.1", - "@backstage/plugin-apollo-explorer": "0.1.8", - "@backstage/plugin-app-backend": "0.3.42", - "@backstage/plugin-auth-backend": "0.18.0", - "@backstage/plugin-auth-node": "0.2.11", - "@backstage/plugin-azure-devops": "0.2.6", - "@backstage/plugin-azure-devops-backend": "0.3.21", + "@backstage/plugin-apollo-explorer": "0.1.9", + "@backstage/plugin-app-backend": "0.3.43", + "@backstage/plugin-auth-backend": "0.18.1", + "@backstage/plugin-auth-node": "0.2.12", + "@backstage/plugin-azure-devops": "0.2.7", + "@backstage/plugin-azure-devops-backend": "0.3.22", "@backstage/plugin-azure-devops-common": "0.3.0", - "@backstage/plugin-azure-sites": "0.1.4", - "@backstage/plugin-azure-sites-backend": "0.1.4", + "@backstage/plugin-azure-sites": "0.1.5", + "@backstage/plugin-azure-sites-backend": "0.1.5", "@backstage/plugin-azure-sites-common": "0.1.0", - "@backstage/plugin-badges": "0.2.39", - "@backstage/plugin-badges-backend": "0.1.36", - "@backstage/plugin-bazaar": "0.2.4", - "@backstage/plugin-bazaar-backend": "0.2.5", - "@backstage/plugin-bitbucket-cloud-common": "0.2.3", - "@backstage/plugin-bitrise": "0.1.42", - "@backstage/plugin-catalog": "1.8.0", - "@backstage/plugin-catalog-backend": "1.7.2", - "@backstage/plugin-catalog-backend-module-aws": "0.1.15", - "@backstage/plugin-catalog-backend-module-azure": "0.1.13", - "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.9", - "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.9", - "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.7", - "@backstage/plugin-catalog-backend-module-gerrit": "0.1.10", - "@backstage/plugin-catalog-backend-module-github": "0.2.5", - "@backstage/plugin-catalog-backend-module-gitlab": "0.1.13", - "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.2.0", - "@backstage/plugin-catalog-backend-module-ldap": "0.5.9", - "@backstage/plugin-catalog-backend-module-msgraph": "0.5.0", - "@backstage/plugin-catalog-backend-module-openapi": "0.1.8", - "@backstage/plugin-catalog-common": "1.0.11", - "@internal/plugin-catalog-customized": "0.0.7", - "@backstage/plugin-catalog-graph": "0.2.27", - "@backstage/plugin-catalog-graphql": "0.3.18", - "@backstage/plugin-catalog-import": "0.9.5", - "@backstage/plugin-catalog-node": "1.3.3", - "@backstage/plugin-catalog-react": "1.3.0", - "@backstage/plugin-cicd-statistics": "0.1.17", - "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.11", - "@backstage/plugin-circleci": "0.3.15", - "@backstage/plugin-cloudbuild": "0.3.15", - "@backstage/plugin-code-climate": "0.1.15", - "@backstage/plugin-code-coverage": "0.2.8", - "@backstage/plugin-code-coverage-backend": "0.2.8", - "@backstage/plugin-codescene": "0.1.10", - "@backstage/plugin-config-schema": "0.1.38", - "@backstage/plugin-cost-insights": "0.12.4", + "@backstage/plugin-badges": "0.2.40", + "@backstage/plugin-badges-backend": "0.1.37", + "@backstage/plugin-bazaar": "0.2.6", + "@backstage/plugin-bazaar-backend": "0.2.6", + "@backstage/plugin-bitbucket-cloud-common": "0.2.4", + "@backstage/plugin-bitrise": "0.1.43", + "@backstage/plugin-catalog": "1.9.0", + "@backstage/plugin-catalog-backend": "1.8.0", + "@backstage/plugin-catalog-backend-module-aws": "0.1.17", + "@backstage/plugin-catalog-backend-module-azure": "0.1.14", + "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.10", + "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.10", + "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.8", + "@backstage/plugin-catalog-backend-module-gerrit": "0.1.11", + "@backstage/plugin-catalog-backend-module-github": "0.2.6", + "@backstage/plugin-catalog-backend-module-gitlab": "0.1.14", + "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.3.0", + "@backstage/plugin-catalog-backend-module-ldap": "0.5.10", + "@backstage/plugin-catalog-backend-module-msgraph": "0.5.2", + "@backstage/plugin-catalog-backend-module-openapi": "0.1.9", + "@backstage/plugin-catalog-backend-module-puppetdb": "0.1.0", + "@backstage/plugin-catalog-common": "1.0.12", + "@internal/plugin-catalog-customized": "0.0.8", + "@backstage/plugin-catalog-graph": "0.2.28", + "@backstage/plugin-catalog-graphql": "0.3.19", + "@backstage/plugin-catalog-import": "0.9.6", + "@backstage/plugin-catalog-node": "1.3.4", + "@backstage/plugin-catalog-react": "1.4.0", + "@backstage/plugin-cicd-statistics": "0.1.18", + "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.12", + "@backstage/plugin-circleci": "0.3.16", + "@backstage/plugin-cloudbuild": "0.3.16", + "@backstage/plugin-code-climate": "0.1.16", + "@backstage/plugin-code-coverage": "0.2.9", + "@backstage/plugin-code-coverage-backend": "0.2.9", + "@backstage/plugin-codescene": "0.1.11", + "@backstage/plugin-config-schema": "0.1.39", + "@backstage/plugin-cost-insights": "0.12.5", "@backstage/plugin-cost-insights-common": "0.1.1", - "@backstage/plugin-dynatrace": "2.0.0", - "@backstage/plugin-entity-feedback": "0.1.0", - "@backstage/plugin-entity-feedback-backend": "0.1.0", + "@backstage/plugin-dynatrace": "3.0.0", + "@backstage/plugin-entity-feedback": "0.1.1", + "@backstage/plugin-entity-feedback-backend": "0.1.1", "@backstage/plugin-entity-feedback-common": "0.1.0", - "@backstage/plugin-entity-validation": "0.1.0", - "@backstage/plugin-events-backend": "0.2.3", - "@backstage/plugin-events-backend-module-aws-sqs": "0.1.4", - "@backstage/plugin-events-backend-module-azure": "0.1.4", - "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.4", - "@backstage/plugin-events-backend-module-gerrit": "0.1.4", - "@backstage/plugin-events-backend-module-github": "0.1.4", - "@backstage/plugin-events-backend-module-gitlab": "0.1.4", - "@backstage/plugin-events-backend-test-utils": "0.1.4", - "@backstage/plugin-events-node": "0.2.3", - "@internal/plugin-todo-list": "1.0.10", - "@internal/plugin-todo-list-backend": "1.0.10", - "@internal/plugin-todo-list-common": "1.0.8", - "@backstage/plugin-explore": "0.4.0", - "@backstage/plugin-explore-backend": "0.0.4", + "@backstage/plugin-entity-validation": "0.1.1", + "@backstage/plugin-events-backend": "0.2.4", + "@backstage/plugin-events-backend-module-aws-sqs": "0.1.5", + "@backstage/plugin-events-backend-module-azure": "0.1.5", + "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.5", + "@backstage/plugin-events-backend-module-gerrit": "0.1.5", + "@backstage/plugin-events-backend-module-github": "0.1.5", + "@backstage/plugin-events-backend-module-gitlab": "0.1.5", + "@backstage/plugin-events-backend-test-utils": "0.1.5", + "@backstage/plugin-events-node": "0.2.4", + "@internal/plugin-todo-list": "1.0.11", + "@internal/plugin-todo-list-backend": "1.0.11", + "@internal/plugin-todo-list-common": "1.0.9", + "@backstage/plugin-explore": "0.4.1", + "@backstage/plugin-explore-backend": "0.0.5", "@backstage/plugin-explore-common": "0.0.1", - "@backstage/plugin-explore-react": "0.0.26", - "@backstage/plugin-firehydrant": "0.1.32", - "@backstage/plugin-fossa": "0.2.47", - "@backstage/plugin-gcalendar": "0.3.11", - "@backstage/plugin-gcp-projects": "0.3.34", - "@backstage/plugin-git-release-manager": "0.3.28", - "@backstage/plugin-github-actions": "0.5.15", - "@backstage/plugin-github-deployments": "0.1.46", - "@backstage/plugin-github-issues": "0.2.4", - "@backstage/plugin-github-pull-requests-board": "0.1.9", - "@backstage/plugin-gitops-profiles": "0.3.33", - "@backstage/plugin-gocd": "0.1.21", - "@backstage/plugin-graphiql": "0.2.47", - "@backstage/plugin-graphql-backend": "0.1.32", - "@backstage/plugin-graphql-voyager": "0.1.0", - "@backstage/plugin-home": "0.4.31", - "@backstage/plugin-ilert": "0.2.4", - "@backstage/plugin-jenkins": "0.7.14", - "@backstage/plugin-jenkins-backend": "0.1.32", - "@backstage/plugin-jenkins-common": "0.1.13", - "@backstage/plugin-kafka": "0.3.15", - "@backstage/plugin-kafka-backend": "0.2.35", - "@backstage/plugin-kubernetes": "0.7.8", - "@backstage/plugin-kubernetes-backend": "0.9.3", - "@backstage/plugin-kubernetes-common": "0.6.0", - "@backstage/plugin-lighthouse": "0.4.0", - "@backstage/plugin-lighthouse-backend": "0.1.0", - "@backstage/plugin-lighthouse-common": "0.1.0", - "@backstage/plugin-linguist": "0.1.0", - "@backstage/plugin-linguist-backend": "0.1.0", + "@backstage/plugin-explore-react": "0.0.27", + "@backstage/plugin-firehydrant": "0.2.0", + "@backstage/plugin-fossa": "0.2.48", + "@backstage/plugin-gcalendar": "0.3.12", + "@backstage/plugin-gcp-projects": "0.3.35", + "@backstage/plugin-git-release-manager": "0.3.29", + "@backstage/plugin-github-actions": "0.5.16", + "@backstage/plugin-github-deployments": "0.1.47", + "@backstage/plugin-github-issues": "0.2.5", + "@backstage/plugin-github-pull-requests-board": "0.1.10", + "@backstage/plugin-gitops-profiles": "0.3.34", + "@backstage/plugin-gocd": "0.1.22", + "@backstage/plugin-graphiql": "0.2.48", + "@backstage/plugin-graphql-backend": "0.1.33", + "@backstage/plugin-graphql-voyager": "0.1.1", + "@backstage/plugin-home": "0.4.32", + "@backstage/plugin-ilert": "0.2.5", + "@backstage/plugin-jenkins": "0.7.15", + "@backstage/plugin-jenkins-backend": "0.1.33", + "@backstage/plugin-jenkins-common": "0.1.14", + "@backstage/plugin-kafka": "0.3.16", + "@backstage/plugin-kafka-backend": "0.2.36", + "@backstage/plugin-kubernetes": "0.7.9", + "@backstage/plugin-kubernetes-backend": "0.9.4", + "@backstage/plugin-kubernetes-common": "0.6.1", + "@backstage/plugin-lighthouse": "0.4.1", + "@backstage/plugin-lighthouse-backend": "0.1.1", + "@backstage/plugin-lighthouse-common": "0.1.1", + "@backstage/plugin-linguist": "0.1.1", + "@backstage/plugin-linguist-backend": "0.2.0", "@backstage/plugin-linguist-common": "0.1.0", - "@backstage/plugin-microsoft-calendar": "0.1.0", - "@backstage/plugin-newrelic": "0.3.33", - "@backstage/plugin-newrelic-dashboard": "0.2.8", - "@backstage/plugin-org": "0.6.5", - "@backstage/plugin-org-react": "0.1.4", - "@backstage/plugin-pagerduty": "0.5.8", - "@backstage/plugin-periskop": "0.1.13", - "@backstage/plugin-periskop-backend": "0.1.13", - "@backstage/plugin-permission-backend": "0.5.17", - "@backstage/plugin-permission-common": "0.7.3", - "@backstage/plugin-permission-node": "0.7.5", - "@backstage/plugin-permission-react": "0.4.10", - "@backstage/plugin-playlist": "0.1.6", - "@backstage/plugin-playlist-backend": "0.2.5", - "@backstage/plugin-playlist-common": "0.1.4", - "@backstage/plugin-proxy-backend": "0.2.36", - "@backstage/plugin-rollbar": "0.4.15", - "@backstage/plugin-rollbar-backend": "0.1.39", - "@backstage/plugin-scaffolder": "1.11.0", - "@backstage/plugin-scaffolder-backend": "1.11.0", - "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.17", - "@backstage/plugin-scaffolder-backend-module-rails": "0.4.10", - "@backstage/plugin-scaffolder-backend-module-sentry": "0.1.2", - "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.15", - "@backstage/plugin-scaffolder-common": "1.2.5", - "@backstage/plugin-scaffolder-node": "0.1.0", - "@backstage/plugin-scaffolder-react": "1.1.0", - "@backstage/plugin-search": "1.1.0", - "@backstage/plugin-search-backend": "1.2.3", - "@backstage/plugin-search-backend-module-elasticsearch": "1.1.3", - "@backstage/plugin-search-backend-module-pg": "0.5.3", - "@backstage/plugin-search-backend-node": "1.1.3", - "@backstage/plugin-search-common": "1.2.1", - "@backstage/plugin-search-react": "1.5.0", - "@backstage/plugin-sentry": "0.5.0", - "@backstage/plugin-shortcuts": "0.3.7", - "@backstage/plugin-sonarqube": "0.6.3", - "@backstage/plugin-sonarqube-backend": "0.1.7", - "@backstage/plugin-sonarqube-react": "0.1.2", - "@backstage/plugin-splunk-on-call": "0.4.4", - "@backstage/plugin-stack-overflow": "0.1.11", - "@backstage/plugin-stack-overflow-backend": "0.1.11", - "@backstage/plugin-tech-insights": "0.3.7", - "@backstage/plugin-tech-insights-backend": "0.5.8", - "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.26", + "@backstage/plugin-microsoft-calendar": "0.1.1", + "@backstage/plugin-newrelic": "0.3.34", + "@backstage/plugin-newrelic-dashboard": "0.2.9", + "@backstage/plugin-octopus-deploy": "0.1.0", + "@backstage/plugin-org": "0.6.6", + "@backstage/plugin-org-react": "0.1.5", + "@backstage/plugin-pagerduty": "0.5.9", + "@backstage/plugin-periskop": "0.1.14", + "@backstage/plugin-periskop-backend": "0.1.14", + "@backstage/plugin-permission-backend": "0.5.18", + "@backstage/plugin-permission-common": "0.7.4", + "@backstage/plugin-permission-node": "0.7.6", + "@backstage/plugin-permission-react": "0.4.11", + "@backstage/plugin-playlist": "0.1.7", + "@backstage/plugin-playlist-backend": "0.2.6", + "@backstage/plugin-playlist-common": "0.1.5", + "@backstage/plugin-proxy-backend": "0.2.37", + "@backstage/plugin-rollbar": "0.4.16", + "@backstage/plugin-rollbar-backend": "0.1.40", + "@backstage/plugin-scaffolder": "1.12.0", + "@backstage/plugin-scaffolder-backend": "1.12.0", + "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.18", + "@backstage/plugin-scaffolder-backend-module-rails": "0.4.11", + "@backstage/plugin-scaffolder-backend-module-sentry": "0.1.3", + "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.16", + "@backstage/plugin-scaffolder-common": "1.2.6", + "@backstage/plugin-scaffolder-node": "0.1.1", + "@backstage/plugin-scaffolder-react": "1.2.0", + "@backstage/plugin-search": "1.1.1", + "@backstage/plugin-search-backend": "1.2.4", + "@backstage/plugin-search-backend-module-elasticsearch": "1.1.4", + "@backstage/plugin-search-backend-module-pg": "0.5.4", + "@backstage/plugin-search-backend-node": "1.1.4", + "@backstage/plugin-search-common": "1.2.2", + "@backstage/plugin-search-react": "1.5.1", + "@backstage/plugin-sentry": "0.5.1", + "@backstage/plugin-shortcuts": "0.3.8", + "@backstage/plugin-sonarqube": "0.6.5", + "@backstage/plugin-sonarqube-backend": "0.1.8", + "@backstage/plugin-sonarqube-react": "0.1.4", + "@backstage/plugin-splunk-on-call": "0.4.5", + "@backstage/plugin-stack-overflow": "0.1.12", + "@backstage/plugin-stack-overflow-backend": "0.1.12", + "@backstage/plugin-stackstorm": "0.1.0", + "@backstage/plugin-tech-insights": "0.3.8", + "@backstage/plugin-tech-insights-backend": "0.5.9", + "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.27", "@backstage/plugin-tech-insights-common": "0.2.10", - "@backstage/plugin-tech-insights-node": "0.4.0", - "@backstage/plugin-tech-radar": "0.6.1", - "@backstage/plugin-techdocs": "1.5.0", - "@backstage/plugin-techdocs-addons-test-utils": "1.0.10", - "@backstage/plugin-techdocs-backend": "1.5.3", - "@backstage/plugin-techdocs-module-addons-contrib": "1.0.10", - "@backstage/plugin-techdocs-node": "1.5.0", - "@backstage/plugin-techdocs-react": "1.1.3", - "@backstage/plugin-todo": "0.2.17", - "@backstage/plugin-todo-backend": "0.1.39", - "@backstage/plugin-user-settings": "0.7.0", - "@backstage/plugin-user-settings-backend": "0.1.6", - "@backstage/plugin-vault": "0.1.9", - "@backstage/plugin-vault-backend": "0.2.8", - "@backstage/plugin-xcmetrics": "0.2.35", - "@backstage/plugin-octopus-deploy": "0.0.0", - "@backstage/plugin-stackstorm": "0.0.0", - "@backstage/plugin-catalog-backend-module-puppetdb": "0.0.1" + "@backstage/plugin-tech-insights-node": "0.4.1", + "@backstage/plugin-tech-radar": "0.6.2", + "@backstage/plugin-techdocs": "1.6.0", + "@backstage/plugin-techdocs-addons-test-utils": "1.0.11", + "@backstage/plugin-techdocs-backend": "1.6.0", + "@backstage/plugin-techdocs-module-addons-contrib": "1.0.11", + "@backstage/plugin-techdocs-node": "1.6.0", + "@backstage/plugin-techdocs-react": "1.1.4", + "@backstage/plugin-todo": "0.2.18", + "@backstage/plugin-todo-backend": "0.1.40", + "@backstage/plugin-user-settings": "0.7.1", + "@backstage/plugin-user-settings-backend": "0.1.7", + "@backstage/plugin-vault": "0.1.10", + "@backstage/plugin-vault-backend": "0.2.10", + "@backstage/plugin-xcmetrics": "0.2.36", + "@backstage/plugin-scaffolder-backend-module-gitlab": "0.0.0" }, "changesets": [ - "afraid-trees-stare", - "backend-token-authentication", - "breezy-bees-care", - "bright-kids-raise", - "clean-lemons-jump", - "clean-planes-join", - "clever-dogs-cheat", - "cool-clocks-prove", - "cool-feet-speak", - "create-app-1676993958", - "create-app-1678209629", - "curvy-pets-hang", - "eight-radios-bake", - "eighty-chairs-roll", - "eighty-geese-return", - "empty-books-occur", - "famous-sloths-tie", - "fifty-beds-dress", - "flat-kids-occur", - "flat-peaches-act", - "forty-snails-clap", - "four-lizards-grin", - "fresh-hairs-switch", - "fuzzy-trains-search", - "gentle-bears-love", - "gentle-pears-clean", - "great-trains-jam", - "grumpy-bikes-begin", - "happy-boxes-arrive", - "honest-clouds-shout", - "honest-nails-bake", - "khaki-poems-run", - "light-bees-end", - "light-sheep-trade", - "long-nails-pump", - "long-wolves-drive", - "lovely-tigers-look", - "mean-toys-itch", - "metal-suns-rhyme", - "mighty-games-turn", - "mighty-years-own", - "new-jobs-deny", - "nice-planets-wave", - "nine-bikes-applaud", - "ninety-turtles-wait", - "odd-fireants-bathe", - "odd-oranges-tease", - "odd-waves-rescue", - "old-foxes-shave", - "olive-berries-poke", - "orange-experts-hug", - "perfect-mayflies-greet", - "pink-dolls-unite", - "polite-chicken-do", - "polite-falcons-jump", - "polite-wombats-smash", - "purple-days-film", - "quick-coats-sneeze", - "quick-schools-dress", - "quick-tables-listen", - "quiet-ghosts-float", - "rare-buses-swim", - "rare-grapes-count", - "rare-pandas-hope", - "rename-for-the-win", - "renovate-3672e5e", - "renovate-4775edd", - "renovate-488b7e7", - "renovate-80f8787", - "renovate-fb85ae7", - "rich-clocks-approve", - "rich-wombats-rescue", - "rotten-cats-matter", - "rotten-panthers-share", - "selfish-hats-wait", - "short-mayflies-fix", - "silent-dryers-end", - "silly-suits-run", - "silver-bikes-breathe", - "silver-lies-rest", - "six-melons-rhyme", - "slimy-lobsters-kneel", - "slow-insects-cheat", - "slow-pens-compare", - "slow-suits-grab", - "spotty-bees-tell", - "spotty-turtles-reply", - "spotty-wasps-complain", - "swift-bags-wave", - "tall-hats-talk", - "ten-tigers-marry", - "thin-candles-wait", - "tiny-llamas-jump", - "tricky-jars-film", - "twelve-cars-push", - "twenty-jeans-speak", - "unlucky-sloths-explain", - "warm-vans-fail", - "weak-coats-allow", - "what-is-going-on-babe", - "wicked-lions-repeat", - "wicked-spoons-call", - "wild-ads-pull", - "wild-bulldogs-suffer", - "witty-geckos-design", - "yellow-bananas-yawn", - "young-schools-double", - "young-scissors-cough", - "young-walls-prove" + "bright-pumpkins-bake", + "create-app-1679405836", + "curly-boats-trade", + "curly-jobs-kneel", + "eleven-bats-tease", + "fair-roses-stare", + "fast-snakes-buy", + "fresh-schools-fly", + "fuzzy-actors-turn", + "heavy-colts-wash", + "hungry-lies-cry", + "hungry-monkeys-reply", + "khaki-cars-drum", + "khaki-doors-compare", + "khaki-guests-turn", + "lazy-apples-destroy", + "lazy-monkeys-worry", + "long-gorillas-remain", + "many-eggs-press", + "mighty-lamps-cross", + "nasty-nails-appear", + "neat-donkeys-work", + "old-cougars-sit", + "orange-rabbits-jam", + "rare-seals-decide", + "renovate-a9116b7", + "renovate-c574b04", + "rotten-carrots-cheer", + "seven-gifts-fetch", + "short-panthers-float", + "soft-roses-cover", + "sour-dragons-cheat", + "strong-crews-repeat", + "swift-meals-live", + "ten-hounds-bathe", + "ten-mayflies-beam", + "thick-forks-prove", + "thin-spoons-prove", + "thirty-crabs-tell", + "twelve-parrots-camp", + "weak-turtles-arrive", + "wise-garlics-camp", + "witty-berries-love" ] } diff --git a/.changeset/pretty-carpets-cross.md b/.changeset/pretty-carpets-cross.md new file mode 100644 index 0000000000..e479ab5bda --- /dev/null +++ b/.changeset/pretty-carpets-cross.md @@ -0,0 +1,11 @@ +--- +'@backstage/plugin-analytics-module-ga': patch +'@backstage/plugin-apollo-explorer': patch +'@backstage/plugin-adr-backend': patch +'@backstage/plugin-dynatrace': patch +'@backstage/plugin-airbrake': patch +'@backstage/plugin-circleci': patch +'@backstage/plugin-adr': patch +--- + +chore: Improve API Reference documentation diff --git a/.changeset/proud-jokes-pull.md b/.changeset/proud-jokes-pull.md deleted file mode 100644 index 7d7790889a..0000000000 --- a/.changeset/proud-jokes-pull.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-node': patch ---- - -Added `locationSpecToMetadataName` and `locationSpecToLocationEntity` as their new home, moved over from the backend package where they now are marked as deprecated. diff --git a/.changeset/purple-days-film.md b/.changeset/purple-days-film.md deleted file mode 100644 index 09d760c33e..0000000000 --- a/.changeset/purple-days-film.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-node': patch ---- - -Fixed bug that prevented deletion of stale files when non-empty directories where tried to be deleted as well. diff --git a/.changeset/quick-coats-sneeze.md b/.changeset/quick-coats-sneeze.md deleted file mode 100644 index 24f7f70e83..0000000000 --- a/.changeset/quick-coats-sneeze.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@techdocs/cli': minor ---- - -Running `@techdocs/cli generate` with the `--verbose` flag will now print the mkdocs output. diff --git a/.changeset/quick-schools-dress.md b/.changeset/quick-schools-dress.md deleted file mode 100644 index 511709461e..0000000000 --- a/.changeset/quick-schools-dress.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-addons-test-utils': patch ---- - -Fix bug/problem with test helper diff --git a/.changeset/quick-tables-listen.md b/.changeset/quick-tables-listen.md deleted file mode 100644 index fab9ef7969..0000000000 --- a/.changeset/quick-tables-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-stackstorm': minor ---- - -Add StackStorm plugin to Backstage which is interfacing with StackStorm API. It allows users to view workflow executions, packs and actions. For installation and configuration instructions please view [README.md](https://github.com/backstage/backstage/tree/master/plugins/stackstorm/README.md) diff --git a/.changeset/quiet-ghosts-float.md b/.changeset/quiet-ghosts-float.md deleted file mode 100644 index dc8df90206..0000000000 --- a/.changeset/quiet-ghosts-float.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@backstage/plugin-entity-validation': patch -'@backstage/core-components': patch -'@backstage/plugin-kubernetes': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-circleci': patch -'@backstage/plugin-playlist': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-explore': patch ---- - -Switch to using `LinkButton` instead of the deprecated `Button` diff --git a/.changeset/rare-buses-swim.md b/.changeset/rare-buses-swim.md deleted file mode 100644 index 4626343ca3..0000000000 --- a/.changeset/rare-buses-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-tasks': patch ---- - -Added the adapted query to mysql and sqlite3 databases to not returning warning on logs diff --git a/.changeset/rare-grapes-count.md b/.changeset/rare-grapes-count.md deleted file mode 100644 index fdeb653f3c..0000000000 --- a/.changeset/rare-grapes-count.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch -'@backstage/plugin-catalog-backend-module-bitbucket-server': patch -'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch -'@backstage/plugin-events-backend-module-bitbucket-cloud': patch -'@backstage/plugin-catalog-backend-module-msgraph': patch -'@backstage/plugin-catalog-backend-module-gerrit': patch -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/plugin-catalog-backend-module-gitlab': patch -'@backstage/plugin-events-backend-module-aws-sqs': patch -'@backstage/plugin-catalog-backend-module-azure': patch -'@backstage/plugin-events-backend-module-gerrit': patch -'@backstage/plugin-events-backend-module-github': patch -'@backstage/plugin-events-backend-module-gitlab': patch -'@backstage/plugin-events-backend-module-azure': patch -'@backstage/plugin-catalog-backend-module-aws': patch -'@backstage/backend-plugin-api': patch -'@backstage/backend-test-utils': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/backend-defaults': patch -'@backstage/backend-app-api': patch -'@backstage/core-plugin-api': patch -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-techdocs-backend': patch -'@backstage/backend-common': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/plugin-sonarqube-react': patch -'@backstage/catalog-model': patch -'@backstage/plugin-catalog-common': patch -'@backstage/plugin-events-backend': patch -'@backstage/plugin-jenkins-common': patch -'@backstage/plugin-techdocs-react': patch -'@backstage/plugin-catalog-react': patch -'@backstage/plugin-cost-insights': patch -'@backstage/plugin-catalog-node': patch -'@backstage/test-utils': patch -'@backstage/plugin-app-backend': patch -'@backstage/plugin-events-node': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-catalog': patch -'@backstage/plugin-jenkins': patch ---- - -Internal refactor of `/alpha` exports. diff --git a/.changeset/rare-pandas-hope.md b/.changeset/rare-pandas-hope.md deleted file mode 100644 index 6e8e81fcfb..0000000000 --- a/.changeset/rare-pandas-hope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -Internal update to work with newer versions of react-router diff --git a/.changeset/rare-seals-decide.md b/.changeset/rare-seals-decide.md new file mode 100644 index 0000000000..e3cbadee69 --- /dev/null +++ b/.changeset/rare-seals-decide.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-react': patch +--- + +Fix a bug that caused the header to not render when generating a document for the first time diff --git a/.changeset/rename-for-the-win.md b/.changeset/rename-for-the-win.md deleted file mode 100644 index 8b3dc6df58..0000000000 --- a/.changeset/rename-for-the-win.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-permission-node': patch ---- - -Update the service-to-service auth docs URL in error message. -`` diff --git a/.changeset/renovate-179fa0e.md b/.changeset/renovate-179fa0e.md new file mode 100644 index 0000000000..57efcc4d83 --- /dev/null +++ b/.changeset/renovate-179fa0e.md @@ -0,0 +1,16 @@ +--- +'@backstage/core-components': patch +'@backstage/plugin-entity-validation': patch +'@backstage/integration-react': patch +'@backstage/plugin-apollo-explorer': patch +'@backstage/plugin-github-issues': patch +'@backstage/plugin-stackstorm': patch +'@backstage/plugin-codescene': patch +'@backstage/plugin-org-react': patch +'@backstage/plugin-linguist': patch +'@backstage/plugin-playlist': patch +'@backstage/plugin-vault': patch +'@backstage/cli': patch +--- + +Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. diff --git a/.changeset/renovate-3672e5e.md b/.changeset/renovate-3672e5e.md deleted file mode 100644 index c94eec2245..0000000000 --- a/.changeset/renovate-3672e5e.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Updated dependency `del` to `^7.0.0`. diff --git a/.changeset/renovate-4775edd.md b/.changeset/renovate-4775edd.md deleted file mode 100644 index 6472fac254..0000000000 --- a/.changeset/renovate-4775edd.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/plugin-catalog-graphql': patch ---- - -Updated dependency `@graphql-codegen/cli` to `^3.0.0`. -Updated dependency `@graphql-codegen/graphql-modules-preset` to `^3.0.0`. -Updated dependency `@graphql-codegen/typescript` to `^3.0.0`. -Updated dependency `@graphql-codegen/typescript-resolvers` to `^3.0.0`. diff --git a/.changeset/renovate-488b7e7.md b/.changeset/renovate-488b7e7.md deleted file mode 100644 index 35940f474b..0000000000 --- a/.changeset/renovate-488b7e7.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Updated dependency `@types/passport-microsoft` to `^1.0.0`. diff --git a/.changeset/renovate-80f8787.md b/.changeset/renovate-80f8787.md deleted file mode 100644 index addac46355..0000000000 --- a/.changeset/renovate-80f8787.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-techdocs-react': patch -'@backstage/plugin-techdocs': patch ---- - -Updated dependency `jss` to `~10.10.0`. diff --git a/.changeset/renovate-a9116b7.md b/.changeset/renovate-a9116b7.md new file mode 100644 index 0000000000..168230442e --- /dev/null +++ b/.changeset/renovate-a9116b7.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +Updated dependency `@rjsf/validator-ajv8` to `5.3.0`. diff --git a/.changeset/renovate-c574b04.md b/.changeset/renovate-c574b04.md new file mode 100644 index 0000000000..e409c71940 --- /dev/null +++ b/.changeset/renovate-c574b04.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-graphql': patch +'@backstage/plugin-graphql-backend': patch +--- + +Updated dependency `@apollo/server` to `^4.0.0`. diff --git a/.changeset/renovate-fb85ae7.md b/.changeset/renovate-fb85ae7.md deleted file mode 100644 index 920469850c..0000000000 --- a/.changeset/renovate-fb85ae7.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -'@backstage/backend-common': patch -'@backstage/backend-test-utils': patch -'@backstage/catalog-client': patch -'@backstage/cli': patch -'@backstage/config-loader': patch -'@backstage/core-app-api': patch -'@backstage/core-components': patch -'@backstage/core-plugin-api': patch -'@backstage/integration-react': patch -'@backstage/integration': patch -'@backstage/release-manifests': patch -'@backstage/test-utils': patch -'@backstage/plugin-adr-backend': patch -'@backstage/plugin-adr': patch -'@backstage/plugin-airbrake-backend': patch -'@backstage/plugin-airbrake': patch -'@backstage/plugin-allure': patch -'@backstage/plugin-analytics-module-ga': patch -'@backstage/plugin-apache-airflow': patch -'@backstage/plugin-api-docs': patch -'@backstage/plugin-apollo-explorer': patch -'@backstage/plugin-app-backend': patch -'@backstage/plugin-auth-backend': patch -'@backstage/plugin-auth-node': patch -'@backstage/plugin-azure-devops-backend': patch -'@backstage/plugin-azure-devops': patch -'@backstage/plugin-azure-sites-backend': patch -'@backstage/plugin-azure-sites': patch -'@backstage/plugin-badges': patch -'@backstage/plugin-bitbucket-cloud-common': patch -'@backstage/plugin-bitrise': patch -'@backstage/plugin-catalog-backend-module-azure': patch -'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch -'@backstage/plugin-catalog-backend-module-bitbucket-server': patch -'@backstage/plugin-catalog-backend-module-bitbucket': patch -'@backstage/plugin-catalog-backend-module-gerrit': patch -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/plugin-catalog-backend-module-gitlab': patch -'@backstage/plugin-catalog-backend-module-msgraph': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/plugin-catalog-graphql': patch -'@backstage/plugin-catalog-import': patch -'@backstage/plugin-circleci': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-code-climate': patch -'@backstage/plugin-code-coverage-backend': patch -'@backstage/plugin-code-coverage': patch -'@backstage/plugin-codescene': patch -'@backstage/plugin-config-schema': patch -'@backstage/plugin-cost-insights': patch -'@backstage/plugin-dynatrace': patch -'@backstage/plugin-entity-feedback-backend': patch -'@backstage/plugin-entity-feedback': patch -'@backstage/plugin-entity-validation': patch -'@backstage/plugin-explore-backend': patch -'@backstage/plugin-explore-react': patch -'@backstage/plugin-explore': patch -'@backstage/plugin-firehydrant': patch -'@backstage/plugin-fossa': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-gcp-projects': patch -'@backstage/plugin-git-release-manager': patch -'@backstage/plugin-github-actions': patch -'@backstage/plugin-github-deployments': patch -'@backstage/plugin-github-issues': patch -'@backstage/plugin-github-pull-requests-board': patch -'@backstage/plugin-gitops-profiles': patch -'@backstage/plugin-gocd': patch -'@backstage/plugin-graphiql': patch -'@backstage/plugin-graphql-backend': patch -'@backstage/plugin-graphql-voyager': patch -'@backstage/plugin-home': patch -'@backstage/plugin-ilert': patch -'@backstage/plugin-jenkins-backend': patch -'@backstage/plugin-jenkins': patch -'@backstage/plugin-kafka': patch -'@backstage/plugin-kubernetes-backend': patch -'@backstage/plugin-kubernetes': patch -'@backstage/plugin-lighthouse': patch -'@backstage/plugin-linguist-backend': patch -'@backstage/plugin-linguist': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-newrelic': patch -'@backstage/plugin-octopus-deploy': patch -'@backstage/plugin-org-react': patch -'@backstage/plugin-org': patch -'@backstage/plugin-pagerduty': patch -'@backstage/plugin-periskop-backend': patch -'@backstage/plugin-periskop': patch -'@backstage/plugin-permission-backend': patch -'@backstage/plugin-permission-common': patch -'@backstage/plugin-permission-node': patch -'@backstage/plugin-playlist-backend': patch -'@backstage/plugin-playlist': patch -'@backstage/plugin-proxy-backend': patch -'@backstage/plugin-rollbar-backend': patch -'@backstage/plugin-rollbar': patch -'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-search': patch -'@backstage/plugin-sentry': patch -'@backstage/plugin-shortcuts': patch -'@backstage/plugin-sonarqube-backend': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-splunk-on-call': patch -'@backstage/plugin-stack-overflow-backend': patch -'@backstage/plugin-stack-overflow': patch -'@backstage/plugin-stackstorm': patch -'@backstage/plugin-tech-insights': patch -'@backstage/plugin-tech-radar': patch -'@backstage/plugin-techdocs-addons-test-utils': patch -'@backstage/plugin-techdocs-backend': patch -'@backstage/plugin-techdocs-module-addons-contrib': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-todo-backend': patch -'@backstage/plugin-todo': patch -'@backstage/plugin-user-settings': patch -'@backstage/plugin-vault-backend': patch -'@backstage/plugin-vault': patch -'@backstage/plugin-xcmetrics': patch ---- - -Updated dependency `msw` to `^1.0.0`. diff --git a/.changeset/rich-clocks-approve.md b/.changeset/rich-clocks-approve.md deleted file mode 100644 index 319a8a7c9c..0000000000 --- a/.changeset/rich-clocks-approve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-lighthouse-backend': patch ---- - -Update README.md; typo with plugin name & removed unneeded "import { Router } from 'express';" diff --git a/.changeset/rich-wombats-rescue.md b/.changeset/rich-wombats-rescue.md deleted file mode 100644 index d62f38cb4a..0000000000 --- a/.changeset/rich-wombats-rescue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Updated the `aria-label` of the `HeaderTabs` component. diff --git a/.changeset/rotten-carrots-cheer.md b/.changeset/rotten-carrots-cheer.md new file mode 100644 index 0000000000..58da6d2a21 --- /dev/null +++ b/.changeset/rotten-carrots-cheer.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Register unhandled rejection and uncaught exception handlers to avoid backend crashes. diff --git a/.changeset/rotten-cats-matter.md b/.changeset/rotten-cats-matter.md deleted file mode 100644 index 2515db9991..0000000000 --- a/.changeset/rotten-cats-matter.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -'@backstage/core-app-api': minor ---- - -`OAuth2` now gets ID tokens from a session with the `openid` scope explicitly -requested. - -This should not be considered a breaking change, because spec-compliant OIDC -providers will already be returning ID tokens if and only if the `openid` scope -is granted. - -This change makes the dependence explicit, and removes the burden on -OAuth2-based providers which require an ID token (e.g. this is done by various -default [auth -handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add -`openid` to their default scopes. _That_ could carry another indirect benefit: -by removing `openid` from the default scopes for a provider, grants for -resource-specific access tokens can avoid requesting excess ID token-related -scopes. diff --git a/.changeset/rotten-panthers-share.md b/.changeset/rotten-panthers-share.md deleted file mode 100644 index b9f0dd6691..0000000000 --- a/.changeset/rotten-panthers-share.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/backend-common': patch -'@backstage/plugin-catalog-backend-module-aws': patch ---- - -AwsS3UrlReader upgraded to use aws-sdk v3 diff --git a/.changeset/selfish-hats-wait.md b/.changeset/selfish-hats-wait.md deleted file mode 100644 index d706d42e8e..0000000000 --- a/.changeset/selfish-hats-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-org': patch ---- - -Add styling to the `MembersListCard` and `ComponentsGrid` to handle overflow text. diff --git a/.changeset/seven-gifts-fetch.md b/.changeset/seven-gifts-fetch.md new file mode 100644 index 0000000000..acb66e2d18 --- /dev/null +++ b/.changeset/seven-gifts-fetch.md @@ -0,0 +1,72 @@ +--- +'@backstage/plugin-techdocs-module-addons-contrib': patch +'@backstage/plugin-github-pull-requests-board': patch +'@backstage/plugin-techdocs-addons-test-utils': patch +'@backstage/plugin-analytics-module-ga': patch +'@backstage/plugin-git-release-manager': patch +'@backstage/plugin-github-deployments': patch +'@backstage/plugin-newrelic-dashboard': patch +'@backstage/core-components': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-cicd-statistics': patch +'@backstage/plugin-entity-feedback': patch +'@backstage/plugin-gitops-profiles': patch +'@backstage/plugin-graphql-voyager': patch +'@backstage/plugin-apache-airflow': patch +'@backstage/plugin-catalog-import': patch +'@backstage/plugin-github-actions': patch +'@backstage/plugin-octopus-deploy': patch +'@backstage/plugin-splunk-on-call': patch +'@backstage/plugin-techdocs-react': patch +'@backstage/plugin-catalog-graph': patch +'@backstage/plugin-catalog-react': patch +'@backstage/plugin-code-coverage': patch +'@backstage/plugin-config-schema': patch +'@backstage/plugin-cost-insights': patch +'@backstage/plugin-tech-insights': patch +'@backstage/plugin-user-settings': patch +'@backstage/plugin-azure-devops': patch +'@backstage/plugin-code-climate': patch +'@backstage/plugin-gcp-projects': patch +'@backstage/plugin-search-react': patch +'@backstage/plugin-azure-sites': patch +'@backstage/plugin-firehydrant': patch +'@backstage/plugin-cloudbuild': patch +'@backstage/plugin-kubernetes': patch +'@backstage/plugin-lighthouse': patch +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-tech-radar': patch +'@backstage/plugin-dynatrace': patch +'@backstage/plugin-gcalendar': patch +'@backstage/plugin-pagerduty': patch +'@backstage/plugin-shortcuts': patch +'@backstage/plugin-sonarqube': patch +'@backstage/plugin-xcmetrics': patch +'@backstage/plugin-airbrake': patch +'@backstage/plugin-api-docs': patch +'@backstage/plugin-circleci': patch +'@backstage/plugin-graphiql': patch +'@backstage/plugin-newrelic': patch +'@backstage/plugin-periskop': patch +'@backstage/plugin-techdocs': patch +'@backstage/plugin-bitrise': patch +'@backstage/plugin-catalog': patch +'@backstage/plugin-explore': patch +'@backstage/plugin-jenkins': patch +'@backstage/plugin-rollbar': patch +'@backstage/plugin-allure': patch +'@backstage/plugin-badges': patch +'@backstage/plugin-bazaar': patch +'@backstage/plugin-search': patch +'@backstage/plugin-sentry': patch +'@backstage/plugin-fossa': patch +'@backstage/plugin-ilert': patch +'@backstage/plugin-kafka': patch +'@backstage/plugin-gocd': patch +'@backstage/plugin-home': patch +'@backstage/plugin-todo': patch +'@backstage/plugin-adr': patch +'@backstage/plugin-org': patch +--- + +Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) diff --git a/.changeset/short-mayflies-fix.md b/.changeset/short-mayflies-fix.md deleted file mode 100644 index 9d68a85da7..0000000000 --- a/.changeset/short-mayflies-fix.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-pagerduty': patch ---- - -Update readme link for discord channel diff --git a/.changeset/short-panthers-float.md b/.changeset/short-panthers-float.md new file mode 100644 index 0000000000..91eafe28aa --- /dev/null +++ b/.changeset/short-panthers-float.md @@ -0,0 +1,5 @@ +--- +'@techdocs/cli': patch +--- + +Adding global-agent to enable the ability to publish through a proxy diff --git a/.changeset/silent-dryers-end.md b/.changeset/silent-dryers-end.md deleted file mode 100644 index d15ea602ae..0000000000 --- a/.changeset/silent-dryers-end.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -Fix the scaffolder validator for arrays when the item is a field in the object diff --git a/.changeset/silly-adults-accept.md b/.changeset/silly-adults-accept.md new file mode 100644 index 0000000000..9db04d2490 --- /dev/null +++ b/.changeset/silly-adults-accept.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Allow replacement of the BuiltinKindsEntityProcessor which enables customization of schema validation and connections emitted. diff --git a/.changeset/silly-suits-run.md b/.changeset/silly-suits-run.md deleted file mode 100644 index ec371e4077..0000000000 --- a/.changeset/silly-suits-run.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': minor ---- - -Add /entities/by-query endpoint returning paginated entities. - -The endpoint supports cursor base pagination and server side sorting of the entities diff --git a/.changeset/silver-bikes-breathe.md b/.changeset/silver-bikes-breathe.md deleted file mode 100644 index 0288580bba..0000000000 --- a/.changeset/silver-bikes-breathe.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -'@backstage/plugin-catalog': minor ---- - -Allow `EntitySwitch` to render all cases that match the condition. - -This change introduces a new parameter for the `EntitySwitch` component -`renderMultipleMatches`. In case the parameter value is `all`, the `EntitySwitch` -will render all `EntitySwitch.Case` that contain `if` parameter, and it -evaluates to true. In case none of the cases match, the default case will be -rendered, if any. - -This means for example in the CI/CD page you can now do the following: - -```tsx - - Jenkins - CodeBuild - No CI/CD - -``` - -This allows the component to have multiple CI/CD systems and all of those are -rendered on the same page. diff --git a/.changeset/silver-lies-rest.md b/.changeset/silver-lies-rest.md deleted file mode 100644 index 34b77f5375..0000000000 --- a/.changeset/silver-lies-rest.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gitlab': patch ---- - -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`. diff --git a/.changeset/six-melons-rhyme.md b/.changeset/six-melons-rhyme.md deleted file mode 100644 index dbb878fc89..0000000000 --- a/.changeset/six-melons-rhyme.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -scaffolder/next: Added the ability to get the fields definition in the schema in the validation function diff --git a/.changeset/slimy-lobsters-kneel.md b/.changeset/slimy-lobsters-kneel.md deleted file mode 100644 index 40ff476a64..0000000000 --- a/.changeset/slimy-lobsters-kneel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-linguist-backend': patch ---- - -Fixed bug in LinguistBackendApi that caused initial batch of entities to be skipped. diff --git a/.changeset/slow-insects-cheat.md b/.changeset/slow-insects-cheat.md deleted file mode 100644 index 70b7bbf69b..0000000000 --- a/.changeset/slow-insects-cheat.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-techdocs': minor -'@backstage/plugin-catalog': minor -'@backstage/plugin-explore': patch ---- - -Add ability to pass icon as function to have ability to customize it by search item diff --git a/.changeset/slow-pens-compare.md b/.changeset/slow-pens-compare.md deleted file mode 100644 index 158cb6f760..0000000000 --- a/.changeset/slow-pens-compare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fix a bug where the batch fetch by ref endpoint did not work in conjunction with filtering (e.g. if authorization was enabled). diff --git a/.changeset/slow-suits-grab.md b/.changeset/slow-suits-grab.md deleted file mode 100644 index 4a741cac6b..0000000000 --- a/.changeset/slow-suits-grab.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-msgraph': patch ---- - -properly support custom graph api URL diff --git a/.changeset/soft-roses-cover.md b/.changeset/soft-roses-cover.md new file mode 100644 index 0000000000..94cbe6d0bd --- /dev/null +++ b/.changeset/soft-roses-cover.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': minor +--- + +Added `isEntityWith` condition helper for `EntitySwitch` case statements. diff --git a/.changeset/sour-dragons-cheat.md b/.changeset/sour-dragons-cheat.md new file mode 100644 index 0000000000..1b577d85f7 --- /dev/null +++ b/.changeset/sour-dragons-cheat.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Add `onboard` command. While still in development, this command aims to guide users in setting up their Backstage App. diff --git a/.changeset/spotty-bees-tell.md b/.changeset/spotty-bees-tell.md deleted file mode 100644 index 5267d8a6a0..0000000000 --- a/.changeset/spotty-bees-tell.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch -'@backstage/plugin-catalog-backend-module-aws': patch ---- - -Fix missing `dependencies` in `package.json` diff --git a/.changeset/spotty-turtles-reply.md b/.changeset/spotty-turtles-reply.md deleted file mode 100644 index 2dfc12a176..0000000000 --- a/.changeset/spotty-turtles-reply.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs': patch ---- - -Copy to clipboard now works in a not secure context. diff --git a/.changeset/spotty-wasps-complain.md b/.changeset/spotty-wasps-complain.md deleted file mode 100644 index 7b1e42b2a0..0000000000 --- a/.changeset/spotty-wasps-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -Fix alignment bug for owners on `TemplateCard` diff --git a/.changeset/strong-crews-repeat.md b/.changeset/strong-crews-repeat.md new file mode 100644 index 0000000000..1e772ae036 --- /dev/null +++ b/.changeset/strong-crews-repeat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-shortcuts': patch +--- + +Allow external links to be added as shortcuts diff --git a/.changeset/stupid-games-brake.md b/.changeset/stupid-games-brake.md deleted file mode 100644 index 0a50a32ffa..0000000000 --- a/.changeset/stupid-games-brake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend': patch ---- - -Updated README instructions diff --git a/.changeset/swift-bags-wave.md b/.changeset/swift-bags-wave.md deleted file mode 100644 index 8f57c7f89b..0000000000 --- a/.changeset/swift-bags-wave.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-sonarqube-react': patch -'@backstage/plugin-sonarqube': patch ---- - -Moved imports from `/alpha` to main public exports. diff --git a/.changeset/swift-meals-live.md b/.changeset/swift-meals-live.md new file mode 100644 index 0000000000..ad8106b04e --- /dev/null +++ b/.changeset/swift-meals-live.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': minor +--- + +Allow `TemplateListPage` and `TemplateWizardPage` to be passed in as props diff --git a/.changeset/tall-chairs-explain.md b/.changeset/tall-chairs-explain.md new file mode 100644 index 0000000000..9709f225b4 --- /dev/null +++ b/.changeset/tall-chairs-explain.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-techdocs-backend': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-explore-backend': patch +--- + +Collator factories instantiated in new backend system modules and now marked as deprecated. Will be continued to be exported publicly until the new backend system is fully rolled out. diff --git a/.changeset/tall-hats-talk.md b/.changeset/tall-hats-talk.md deleted file mode 100644 index b10af002f6..0000000000 --- a/.changeset/tall-hats-talk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Keep custom exports entry points in package.json diff --git a/.changeset/ten-hounds-bathe.md b/.changeset/ten-hounds-bathe.md new file mode 100644 index 0000000000..85bda89138 --- /dev/null +++ b/.changeset/ten-hounds-bathe.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Improve GitlabUrlReader to only load requested sub-path diff --git a/.changeset/ten-mayflies-beam.md b/.changeset/ten-mayflies-beam.md new file mode 100644 index 0000000000..ff7d9e52e9 --- /dev/null +++ b/.changeset/ten-mayflies-beam.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': minor +--- + +Added a `templateFilter` prop to the `` component to allow for filtering of templates through a function. diff --git a/.changeset/ten-tigers-marry.md b/.changeset/ten-tigers-marry.md deleted file mode 100644 index f90f7b3ea2..0000000000 --- a/.changeset/ten-tigers-marry.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -'@backstage/plugin-proxy-backend': patch ---- - -The proxy-backend plugin now supports reviving request bodies that have previously been consumed by an express middleware (e.g. `express.json()`). This is done by setting `reviveConsumedRequestBodies: true` on the proxy `RouterOptions`. In order to preserve the current behavior, the proxy will **not** revive request bodies by default. - -The following is an example of a proxy `createRouter` invocation that revives request bodies: - -```diff -const router = await createRouter({ - config, - logger, - discovery, -+ reviveConsumedRequestBodies: true, -}); -``` diff --git a/.changeset/thick-forks-prove.md b/.changeset/thick-forks-prove.md new file mode 100644 index 0000000000..5025852e79 --- /dev/null +++ b/.changeset/thick-forks-prove.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-scaffolder-react': minor +'@backstage/plugin-scaffolder': minor +--- + +Move `CategoryPicker` from `scaffolder` into `scaffolder-react` +Move `ContextMenu` into `scaffolder-react` and rename it to `ScaffolderPageContextMenu` diff --git a/.changeset/thin-candles-wait.md b/.changeset/thin-candles-wait.md deleted file mode 100644 index c7e18367b5..0000000000 --- a/.changeset/thin-candles-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-sonarqube': patch ---- - -Show a more appropriate icon if there are no code smells and/or vulnerabilities. diff --git a/.changeset/thin-spoons-prove.md b/.changeset/thin-spoons-prove.md new file mode 100644 index 0000000000..a9bf3052f5 --- /dev/null +++ b/.changeset/thin-spoons-prove.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': minor +--- + +To offer better customization options, `ScaffolderPageContextMenu` takes callbacks as props instead of booleans diff --git a/.changeset/thirty-crabs-tell.md b/.changeset/thirty-crabs-tell.md new file mode 100644 index 0000000000..2ca5e8cd34 --- /dev/null +++ b/.changeset/thirty-crabs-tell.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Fixed the font color on `BackstageHeaderLabel` to respect the active page theme. diff --git a/.changeset/tiny-apes-scream.md b/.changeset/tiny-apes-scream.md new file mode 100644 index 0000000000..b4a28e0745 --- /dev/null +++ b/.changeset/tiny-apes-scream.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-common': patch +--- + +Define optional `backstage:permissions` property to parameters and steps used to authorize part of the template using the permission framework diff --git a/.changeset/tiny-llamas-jump.md b/.changeset/tiny-llamas-jump.md deleted file mode 100644 index ccf42cd514..0000000000 --- a/.changeset/tiny-llamas-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Use media queries to change layout instead of `isMobile` prop in `BackstagePage` component diff --git a/.changeset/tricky-jars-film.md b/.changeset/tricky-jars-film.md deleted file mode 100644 index 9533634614..0000000000 --- a/.changeset/tricky-jars-film.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch ---- - -Move `@backstage/backend-defaults` to `devDependencies` diff --git a/.changeset/twelve-cars-push.md b/.changeset/twelve-cars-push.md deleted file mode 100644 index 599d456d2b..0000000000 --- a/.changeset/twelve-cars-push.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -'@backstage/backend-plugin-api': patch -'@backstage/backend-test-utils': patch -'@backstage/backend-dev-utils': patch -'@backstage/backend-defaults': patch -'@backstage/backend-app-api': patch -'@backstage/backend-common': patch -'@backstage/backend-tasks': patch -'@backstage/config-loader': patch -'@backstage/cli-common': patch -'@backstage/create-app': patch -'@backstage/test-utils': patch -'@backstage/dev-utils': patch -'@backstage/codemods': patch -'@backstage/config': patch -'@backstage/theme': patch -'@backstage/cli': patch ---- - -Updated link to docs. diff --git a/.changeset/twelve-parrots-camp.md b/.changeset/twelve-parrots-camp.md new file mode 100644 index 0000000000..ea7e254f29 --- /dev/null +++ b/.changeset/twelve-parrots-camp.md @@ -0,0 +1,5 @@ +--- +'@backstage/eslint-plugin': patch +--- + +Add support for auto-fixing missing imports detected by the `no-undeclared-imports` rule. diff --git a/.changeset/twelve-vans-sell.md b/.changeset/twelve-vans-sell.md new file mode 100644 index 0000000000..25c4a077fd --- /dev/null +++ b/.changeset/twelve-vans-sell.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-graphiql': patch +--- + +Allow to pass lazy GraphQL endpoint URL diff --git a/.changeset/twenty-insects-live.md b/.changeset/twenty-insects-live.md deleted file mode 100644 index d3f8cdfc25..0000000000 --- a/.changeset/twenty-insects-live.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-proxy-backend': patch ---- - -Ensure that `@backstage/plugin-proxy-backend` logs the requests that it proxies when log level is set to `debug`. diff --git a/.changeset/twenty-jeans-speak.md b/.changeset/twenty-jeans-speak.md deleted file mode 100644 index fddcc2eedd..0000000000 --- a/.changeset/twenty-jeans-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Added authentication provider for Azure Easy Authentication. diff --git a/.changeset/unlucky-sloths-explain.md b/.changeset/unlucky-sloths-explain.md deleted file mode 100644 index 3d5f963a73..0000000000 --- a/.changeset/unlucky-sloths-explain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-module-addons-contrib': patch ---- - -Fixed bug in IssueLink component where the URL was not generated properly when the repository was located inside a Gitlab subgroup diff --git a/.changeset/warm-buses-switch.md b/.changeset/warm-buses-switch.md new file mode 100644 index 0000000000..5564f33d67 --- /dev/null +++ b/.changeset/warm-buses-switch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend-node': minor +--- + +Exports services and extension points that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](../docs/features/search/how-to-guides.md#how-to-migrate-to-use-search-together-with-the-new-backend-system). diff --git a/.changeset/warm-vans-fail.md b/.changeset/warm-vans-fail.md deleted file mode 100644 index 6cbd3a4e8f..0000000000 --- a/.changeset/warm-vans-fail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': minor ---- - -Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. diff --git a/.changeset/weak-coats-allow.md b/.changeset/weak-coats-allow.md deleted file mode 100644 index 31fc592326..0000000000 --- a/.changeset/weak-coats-allow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-linguist': patch ---- - -Updated `README.md` to removed images with refresh button as this feature was not implemented in the current version diff --git a/.changeset/weak-turtles-arrive.md b/.changeset/weak-turtles-arrive.md new file mode 100644 index 0000000000..3bb56909f9 --- /dev/null +++ b/.changeset/weak-turtles-arrive.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': minor +--- + +`scaffolder/next`: Export the `TemplateGroupFilter` and `TemplateGroups` and make an extensible component diff --git a/.changeset/wet-lamps-happen.md b/.changeset/wet-lamps-happen.md new file mode 100644 index 0000000000..066b34b23c --- /dev/null +++ b/.changeset/wet-lamps-happen.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-search-backend-module-techdocs': minor +'@backstage/plugin-search-backend-module-catalog': minor +'@backstage/plugin-search-backend-module-explore': minor +--- + +Package introduced to export search backend modules that can be used with the new backend system to extend search with plugin specific functionality, such as collators. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](../docs/features/search/how-to-guides.md#how-to-migrate-to-use-search-together-with-the-new-backend-system). diff --git a/.changeset/what-is-going-on-babe.md b/.changeset/what-is-going-on-babe.md deleted file mode 100644 index c22d69d1de..0000000000 --- a/.changeset/what-is-going-on-babe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Add support for `NotImplementedError`, properly returning 501 as status code. diff --git a/.changeset/wicked-lions-repeat.md b/.changeset/wicked-lions-repeat.md deleted file mode 100644 index c48545c6bc..0000000000 --- a/.changeset/wicked-lions-repeat.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@techdocs/cli': minor -'@backstage/plugin-techdocs-node': minor ---- - -Added support for an HTTPS proxy for techdocs AWS S3 requests diff --git a/.changeset/wicked-spoons-call.md b/.changeset/wicked-spoons-call.md deleted file mode 100644 index c57860349b..0000000000 --- a/.changeset/wicked-spoons-call.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-newrelic': patch ---- - -Updated installation instructions diff --git a/.changeset/wild-ads-pull.md b/.changeset/wild-ads-pull.md deleted file mode 100644 index 5a40787358..0000000000 --- a/.changeset/wild-ads-pull.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-api-docs': patch ---- - -Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. diff --git a/.changeset/wild-bulldogs-suffer.md b/.changeset/wild-bulldogs-suffer.md deleted file mode 100644 index 02f50927e9..0000000000 --- a/.changeset/wild-bulldogs-suffer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gitlab': patch ---- - -filter gitlab groups by prefix diff --git a/.changeset/wise-garlics-camp.md b/.changeset/wise-garlics-camp.md new file mode 100644 index 0000000000..e7639ad71c --- /dev/null +++ b/.changeset/wise-garlics-camp.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-common': patch +--- + +Introduced proxy permission types to be used with the kubernetes proxy endpoint's permission framework integration. diff --git a/.changeset/witty-berries-love.md b/.changeset/witty-berries-love.md new file mode 100644 index 0000000000..00fa230dc8 --- /dev/null +++ b/.changeset/witty-berries-love.md @@ -0,0 +1,5 @@ +--- +'@backstage/repo-tools': patch +--- + +Log API report instructions when api-report is missing. diff --git a/.changeset/witty-geckos-design.md b/.changeset/witty-geckos-design.md deleted file mode 100644 index d482332c23..0000000000 --- a/.changeset/witty-geckos-design.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@backstage/plugin-linguist-backend': patch ---- - -Allow kind to be configurable - -```ts -return createRouter({ schedule: schedule, kind: ['Component'] }, { ...env }); -``` diff --git a/.changeset/witty-squids-fetch.md b/.changeset/witty-squids-fetch.md deleted file mode 100644 index 3e13421038..0000000000 --- a/.changeset/witty-squids-fetch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Added to the template `packages/app/.eslintignore` file to packages to ignore the contents of `packages/app/public`. diff --git a/.changeset/yellow-bananas-yawn.md b/.changeset/yellow-bananas-yawn.md deleted file mode 100644 index d9c522a429..0000000000 --- a/.changeset/yellow-bananas-yawn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -The API report generation process is now able to detect and generate reports for additional entry points declared in the package `"exports"` field. diff --git a/.changeset/young-schools-double.md b/.changeset/young-schools-double.md deleted file mode 100644 index 8cba2ec8f3..0000000000 --- a/.changeset/young-schools-double.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-react': patch ---- - -Do not close `Autocomplete` powered multiple-selection filters when checking boxes diff --git a/.changeset/young-scissors-cough.md b/.changeset/young-scissors-cough.md deleted file mode 100644 index fa35588224..0000000000 --- a/.changeset/young-scissors-cough.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-defaults': patch ---- - -Added a workaround for the cyclic dependency bug across `@backstage/backend-common` and `@backstage/backend-app-api`. diff --git a/.changeset/young-walls-prove.md b/.changeset/young-walls-prove.md deleted file mode 100644 index 33fafa1548..0000000000 --- a/.changeset/young-walls-prove.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-plugin-api': minor ---- - -The GitLab auth provider can now be used to get OpenID tokens. diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 010af451af..b4be92e4ec 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,13 +8,14 @@ yarn.lock @backstage/maintainers @backstage-service */yarn.lock @backstage/maintainers @backstage-service /.changeset/*.md -/cypress/src/integration/plugins/techdocs.spec.ts @backstage/techdocs-core -/docs/assets/search @backstage/techdocs-core -/docs/features/search @backstage/techdocs-core -/docs/features/techdocs @backstage/techdocs-core -/docs/plugins/integrating-search-into-plugins.md @backstage/techdocs-core -/packages/techdocs-cli @backstage/techdocs-core -/packages/techdocs-cli-embedded-app @backstage/techdocs-core +/cypress/src/integration/plugins/techdocs.spec.ts @backstage/techdocs-maintainers +/docs/assets/search @backstage/discoverability-maintainers +/docs/features/search @backstage/discoverability-maintainers +/docs/features/techdocs @backstage/techdocs-maintainers +/docs/plugins/integrating-search-into-plugins.md @backstage/discoverability-maintainers +/packages/cli/src/commands/onboard @backstage/sharks +/packages/techdocs-cli @backstage/techdocs-maintainers +/packages/techdocs-cli-embedded-app @backstage/techdocs-maintainers /plugins/adr @backstage/maintainers @kuangp /plugins/adr-* @backstage/maintainers @kuangp /plugins/allure @backstage/maintainers @deepak-bhardwaj-ps @@ -54,15 +55,15 @@ yarn.lock @backstage/maintainers @back /plugins/fossa @backstage/maintainers @backstage/sda-se-reviewers /plugins/gcalendar @backstage/maintainers @szubster @ptychu @kielosz @alexrybch /plugins/git-release-manager @backstage/maintainers @erikengervall -/plugins/home @backstage/techdocs-core +/plugins/home @backstage/discoverability-maintainers /plugins/ilert @backstage/maintainers @yacut /plugins/jenkins @backstage/maintainers @timja /plugins/jenkins-backend @backstage/maintainers @timja /plugins/kafka @backstage/maintainers @nirga @andrewthauer /plugins/kafka-backend @backstage/maintainers @nirga @andrewthauer -/plugins/kubernetes @backstage/maintainers @backstage/warpspeed -/plugins/kubernetes-* @backstage/maintainers @backstage/warpspeed -/plugins/microsoft-calendar @backstage/maintainers @abhay-soni-developer +/plugins/kubernetes @backstage/maintainers @backstage/kubernetes-maintainers +/plugins/kubernetes-* @backstage/maintainers @backstage/kubernetes-maintainers +/plugins/microsoft-calendar @backstage/maintainers @abhay-soni-developer @NishkarshRaj /plugins/newrelic-dashboard @backstage/maintainers @mufaddal7 /plugins/playlist @backstage/maintainers @kuangp /plugins/playlist-* @backstage/maintainers @kuangp @@ -70,13 +71,13 @@ yarn.lock @backstage/maintainers @back /plugins/rollbar-backend @backstage/maintainers @andrewthauer /plugins/scaffolder-backend-module-rails @backstage/maintainers @angeliski /plugins/scaffolder-backend-module-yeoman @backstage/maintainers @pawelmitka -/plugins/search @backstage/techdocs-core -/plugins/search-* @backstage/techdocs-core +/plugins/search @backstage/discoverability-maintainers +/plugins/search-* @backstage/discoverability-maintainers /plugins/sonarqube @backstage/maintainers @backstage/sda-se-reviewers -/plugins/stack-overflow @backstage/techdocs-core -/plugins/stack-overflow-backend @backstage/techdocs-core -/plugins/techdocs @backstage/techdocs-core -/plugins/techdocs-* @backstage/techdocs-core +/plugins/stack-overflow @backstage/discoverability-maintainers +/plugins/stack-overflow-backend @backstage/discoverability-maintainers +/plugins/techdocs @backstage/techdocs-maintainers +/plugins/techdocs-* @backstage/techdocs-maintainers /plugins/user-settings-backend @backstage/maintainers @backstage/sda-se-reviewers /tech-insights-backend @backstage/maintainers @xantier @iain-b /tech-insights-backend-module-jsonfc @backstage/maintainers @xantier @iain-b diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index 63fa474115..f058475367 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -82,6 +82,7 @@ Debounce debuggability declaratively deduplicated +deliverables dependabot deps destructured @@ -158,6 +159,7 @@ img incentivised Indal indexable +ingestors inlined inlinehilite integrator's @@ -367,6 +369,7 @@ templaters Templaters TFRecord theia +threenager thumbsup todo todos @@ -403,6 +406,7 @@ validator validators varchar VMware +Vodafone VPCs VSCode Wayfair diff --git a/ADOPTERS.md b/ADOPTERS.md index 26f4331b70..61e149e498 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -234,4 +234,5 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [N26](https://n26.com) | [Alexei Timofti](https://www.linkedin.com/in/alexeitimofti) | We use Backstage for our service catalog and are actively looking into adopting other plugins like TechDocs, TechInsights and Software Templates. | | [The LEGO Group](https://www.lego.com) | [Waqas Ali](https://www.linkedin.com/in/waqasali47) | We are building our internal develper portal on top of Backstage. | | [CORS.gmbh](https://www.cors.gmbh) | [@dpfaffenbauer](https://github.com/dpfaffenbauer) | Developer Portal for our Projects we develop for our Customers and Hosting them On Kubernetes. | +| [Comcast](https://comcast.github.io/) | [Ryan Emerle](https://github.com/remerle) | Developer portal enabling discovery of products, services, and documentation throughout the enterprise to ultimately reduce friction and improve time-to-market. | diff --git a/GOVERNANCE.md b/GOVERNANCE.md index 5bafa19c81..3314e40993 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -1,88 +1,233 @@ -# Process for becoming a maintainer +# Project Areas -## a) Your organization is not yet a maintainer +The Backstage project is divided into several project areas, each covering particular parts of the project. The main driver for each area is ownership of code in the main Backstage repository, as well as other repositories in the Backstage GitHub organization. Each area has a set of maintainers and repository content that they own. There may be no overlap in ownership between areas, which means that any given line in the GitHub code owners file should have only one owner specified. Each area is represented by a team in the Backstage GitHub organization. Apart from certain project-wide concerns, such as the release process, each area is self-governing and chooses their own ways of working. Project areas may also have special interest groups (SIGs) related to their area, but this is not required. -- Express interest to the sponsors that your organization is interested in becoming a maintainer. Becoming a maintainer generally means that you are going to be spending substantial time on Backstage for the foreseeable future. You should have domain expertise and be extremely proficient in TypeScript. -- We will expect you to start contributing increasingly complicated PRs, under the guidance of the existing maintainers. -- We may ask you to do some PRs from our backlog. -- As you gain experience with the code base and our standards, we will ask you to do code reviews for incoming PRs. -- After a period of approximately 2-3 months of working together and making sure we see eye to eye, the existing sponsors and maintainers will confer and decide whether to grant maintainer status or not. We make no guarantees on the length of time this will take, but 2-3 months is the approximate goal. +The project areas as well as their maintainers are listed in the [OWNERS.md](./OWNERS.md) file. -## b) Your organization is currently a maintainer +Each project area must have at least one maintainer. Project area maintainers may have shared ownership with the core maintainers, which in that case is considered an incubating area. The project area maintainers help drive work forward in the area, but they might not yet feel ready to take on ownership. The goal should generally be that these project area maintainers eventually become sole maintainers of the project area. This is to allow for a more smooth onboarding and transition of ownership, where members of the community might for example be new to open source maintainership. -To become a maintainer you need to demonstrate the following: +## Adding new project areas -- First decide whether your organization really needs more people with maintainer access. Valid reasons are "blast radius", a large organization that is working on multiple unrelated projects, etc. -- Contact a sponsor for your organization and express interest. -- Start doing PRs and code reviews under the guidance of your maintainer. -- After a period of 1-2 months the existing sponsors will discuss granting maintainer access. -- Maintainer access can be upgraded to sponsor access after another conference of the existing sponsors. +Project areas are added by nominating new maintainers for that area. See the sections for becoming a [Project Area Maintainer](#project-area-maintainer). -# Maintainer responsibilities +Project areas may also by added by splitting existing areas. Every area that is created through this process must have at least one maintainer. -- Monitor email aliases. -- Monitor Discord (delayed response is perfectly acceptable). -- Triage GitHub issues and perform pull request reviews for other maintainers and the community. -- Triage build issues - file issues for known flaky builds or bugs, and either fix or find someone to fix any master build breakages. -- During GitHub issue triage, apply all applicable ([labels](https://github.com/backstage/backstage/labels)) to each new issue. Labels are extremely useful for future issue follow-up. Which labels to apply is somewhat subjective so just use your best judgment. A few of the most important labels that are not self-explanatory are: - - good first issue: Mark any issue that can reasonably be accomplished by a new contributor with this label. - - help wanted: Unless it is immediately obvious that someone is going to work on an issue (and if so assign it), mark it help wanted. -- Make sure that ongoing PRs are moving forward at the right pace or closing them. -- Participate when called upon in the security release process. Note that although this should be a rare occurrence, if a serious vulnerability is found, the process may take up to several full days of work to implement. This reality should be taken into account when discussing time commitment obligations with employers. -- In general, continue to be willing to spend at least 25% of one's time working on Backstage (~1.25 business days per week). -- We currently maintain an "on-call" rotation within the maintainers. Each on-call is 1 week. Although all maintainers are welcome to perform all of the above tasks, it is the on-call maintainer's responsibility to triage incoming issues/questions and marshal ongoing work forward. To reiterate, it is not the responsibility of the on-call maintainer to answer all questions and do all reviews, but it is their responsibility to make sure that everything is being actively covered by someone. +## Removing project areas -# When does a maintainer lose maintainer status +Project areas are removed by removing all maintainers for that area and removing the corresponding team from the Backstage GitHub organization. The project area can be re-added later if there is a need for it. Reasons for removal may include lack of activity, lack of maintainers, or lack of relevance to the project. -If a maintainer is no longer interested or cannot perform the maintainer duties listed above, they should volunteer to be moved to emeritus status. In extreme cases this can also occur by a vote of the sponsors and maintainers per the voting process below. +# Project Roles -# End User Sponsors +## Contributor -## Role of a Backstage End User Sponsor +A Contributor contributes directly to the project and adds value to it. Contributions need not be code. People at the Contributor level may be new contributors, or they may only contribute occasionally. -- Provide support for Backstage by removing blockers, securing funding, providing advocacy, feedback, and ensuring project continuity and long term success. -- Assist Backstage maintainers in prioritizing upcoming roadmap items and planned work. -- Provide neutral mediation for any disputes that arise as part of the project. +### Responsibilities -## Backstage End User Sponsor Membership +- Follow the [CNCF CoC](https://github.com/cncf/foundation/blob/main/code-of-conduct.md) +- Follow the project [contributing guide](CONTRIBUTING.md) + +### How to get involved + +- Participate in community discussions +- Help other users +- Submit bug reports +- Comment on issues +- Try out new releases +- Attend community events + +### How to contribute + +- Report and sometimes resolve issues +- Occasionally submit PRs +- Contribute to the documentation +- Show up at meetings, take notes +- Answer questions from other community members +- Submit feedback on issues and PRs +- Test releases and patches and submit reviews +- Run or help run events +- Promote the project in public + +## Organization Member + +An org member is a frequent contributor that has become a member of the Backstage GitHub organization. In addition to the responsibilities of contributors, an org member is also expected to be reasonably active in the community through continuous contributions of any type. + +An Organization Member must meet the responsibilities and has the requirements of a Contributor. + +### Responsibilities + +- Continues to contribute regularly, as demonstrated by having at least 10 GitHub contributions per year in [Devstats](https://backstage.devstats.cncf.io/d/48/users-statistics-by-repository-group?orgId=1&var-period=y&var-metric=contributions&var-repogroup_name=All&from=now-1y&to=now&var-users=All), or contributions of a similar effort that might not be captured in Devstats. + +### Requirements + +- Must have at least 10 contributions to the projects in the form of: + - Accepted PRs + - Helpful PR reviews + - Resolving GitHub issues + - Or some equivalent contributions to the project +- Must have been contributing for at least 3 months +- Or is the member of a team that owns a project area, in which case the above requirements do not apply and the member is instead vetted by the project area maintainers + +### Becoming an Organization Member + +Open an issue towards [the community repository](https://github.com/backstage/community) using the [org membership request template](https://github.com/backstage/community/issues/new?template=org_member.yaml&title=Org+Member%3A+%3Cyour-github-login%3E). + +### Privileges + +- Membership in the Backstage GitHub organization + +## Plugin Maintainer + +A Plugin Maintainer is responsible for maintaining an individual Backstage plugin or module. This includes reviewing contributions and responding to issues towards an individual plugin, as well as keeping the plugin up to date. + +Plugin Maintainer is a lightweight form of ownership that is primarily reflected though code owners of the plugin packages in the [CODEOWNERS](./.github/CODEOWNERS) file. Each plugin can have one or more maintainers. If a plugin becomes a significant part of the Backstage ecosystem, it may be promoted to be a distinct project area instead. + +A Plugin Maintainer has all the rights and responsibilities of an Organization Member. + +### Responsibilities + +- Review the majority of PRs towards the plugin +- Respond to GitHub issues related to the plugin +- Keep the plugin up-to-date with Backstage libraries and other dependencies +- Follow the [reviewing guide](REVIEWING.md) + +### Requirements + +- Is an Organization Member +- Display knowledge of Backstage's review process and best practices for plugin design +- Is supportive of new and occasional contributors and helps get useful PRs in shape to merge + +### Privileges + +- GitHub code owner of the plugin directory, with rights to approve and merge PRs towards the plugin + +### Becoming a Plugin Maintainer + +To become a Plugin Maintainer, you first need to be an Organization Member. You can then file a pull request towards [CODEOWNERS.md](./.github/CODEOWNERS) requesting to be added as a code owner of the plugin directory. Existing code owners of that plugin alongside the core maintainers will then review the request. + +## Project Area Maintainer + +Project Area Maintainers are owners of a particular project area. They are expected to review and merge pull requests towards their area, and also drive development and manage tech health. A Project Area Maintainer also need to commit a certain number of hours per month towards the project, and exercise judgment for the good of the project, independent of their employer. Project Area Maintainers should also mentor new maintainers and participate in and lead community meetings related to their area. New Project Area Maintainers need to be approved by the existing project area maintainers, or the core maintainers if it is a new area. + +The maintainers of a project area may be represented by a team in external organization. In this case, the state as a project area maintainer is tied to the membership in that team. New members of the team may automatically be added as maintainers, as well as removed when they leave. This process is governed autonomously by the team of project area maintainers. + +A Project Area Maintainer has all the rights and responsibilities of an Organization Member. + +### Responsibilities + +- Review PRs towards their project area. Project area maintainers are expected to review at least 20 PRs per year, or the majority of all PRs towards the area, if it is less than 20 +- Follow the [reviewing guide](REVIEWING.md) +- Triage and respond to issues related to their project area +- Mentor new project area maintainers +- Write refactoring PRs +- Determine strategy and policy for the project area +- Participate in or leading community meetings related to their project area + +### Requirements + +- Is an Organization Member +- Have made at least 5 meaningful contributions towards the project area +- Demonstrates knowledge of their project area, and how it fits into the larger Backstage project +- Is able to exercise judgment for the good of the project, independent of their employer, friends, or team +- Mentors other contributors and project area maintainers +- Can commit to spending at least 16 hours per month working on the project, preferably distributed evenly across the month + +### Privileges + +- Approve and merge PRs towards their project area +- Drive the direction and roadmap of their project area + +### Becoming a Project Area Maintainer + +If you are interested in becoming a project area maintainer, reach out to the existing maintainers for that area. If you wish to become a maintainer for a new area, reach out to the core maintainers. + +Any current project area maintainer or core maintainer may nominate a new project area maintainer by opening a PR towards the [OWNERS.md](OWNERS.md) file. A majority of the project area maintainers for that area must approve the PR. If there are no existing maintainers for that area, the PR must be approved by a majority of the core maintainers. + +## Core Maintainer + +Core Maintainers are responsible for the Backstage project as a whole. They help review and merge project-level pull requests as well as coordinate work affecting multiple project areas. A core maintainer needs to commit the majority of their working time towards the project, and exercise judgment for the good of the project, independent of their employer. Core maintainers should also mentor and seek out new maintainers, lead community meetings, and communicate with the CNCF on behalf of the project. To become a core maintainer one needs to have been the maintainer of a number of different project areas, demonstrate a deep knowledge of large parts of the Backstage project, and be backed by the existing core maintainers. + +A Core Maintainer have all the rights and responsibilities of a Project Area Maintainer. + +### Responsibilities + +- Take part in the incoming issue and PR triage and review process. PRs are shared equally among all maintainers +- Mentor new Project Area Maintainers and Plugin Maintainers +- Drive refactoring and manage tech health across the entire project +- Participate in CNCF maintainer activities +- Respond to security incidents in accordance to our [security policy](./SECURITY.md) +- Determine strategy and policy for the project +- Participate in or leading community meetings + +### Requirements + +- Experience as a Project Area Maintainer for at least 6 months +- Demonstrates a broad knowledge of the project across multiple areas +- Is able to exercise judgment for the good of the project, independent of their employer, friends, or team +- Mentors other contributors +- Can commit to spending at least 10 days per month working on the project + +### Privileges + +- Approve PRs that fall outside any specific project area +- Merge PRs to any area of the project +- Represent the project in public as a Maintainer +- Communicate with the CNCF on behalf of the project +- Have a vote in Maintainer decision-making meetings + +### Becoming a Core Maintainer + +Any core maintainer or end user sponsor may nominate a new core maintainer by opening a PR towards the [OWNERS.md](OWNERS.md) file. Core maintainers must be approved by a majority of the existing core maintainers and end user sponsors. + +## End User Sponsors + +### Role of a Backstage End User Sponsor + +- Provide support for Backstage by removing blockers, securing funding, providing advocacy, feedback, and ensuring project continuity and long term success +- Assist Backstage maintainers in prioritizing upcoming roadmap items and planned work +- Provide neutral mediation for any disputes that arise as part of the project + +### Backstage End User Sponsor Membership The End User Sponsors group comprises at most 5 people. To be eligible for membership in the group, you or the company where you work you must: - Be responsible for and end user of a production Backstage deployment of non-trivial size - Be active contributors to the open source project - Be willing and able to attend regularly-scheduled End User Sponsor meetings -- Abide by [Backstage’s Code of Conduct](./CODE_OF_CONDUCT.md). +- Abide by [CNCF CoC](https://github.com/cncf/foundation/blob/main/code-of-conduct.md) Candidates for membership will be nominated by current Sponsor members or by Backstage maintainers. If there are more nominations than Sponsor seats remaining, existing sponsors shall vote on the candidates, and the candidates with the most votes will become Sponsors. Any ties will be broken by current Backstage sponsors. -# Reviewers - -The project also contains a team called [@backstage/reviewers](https://github.com/orgs/backstage/teams/reviewers). This is the team of people who are the fallback in [`CODEOWNERS`](./.github/CODEOWNERS). This team will typically contain the maintainers, and a small number of additional people who are permitted to approve and merge pull requests. The purpose of this group is to offload some of the review work from the maintainers, simplifying and speeding up the review process for contributors. - -This responsibility is distinct from the maintainer role. A reviewer must not approve and merge changes that have a level of impact that a maintainer should oversee; see below for clarification. For that class of changes, a reviewer can still review the pull request thoroughly without approving it (e.g. with a comment on the pull request), and is expected to notify `@backstage/maintainers` for final approval. Note that it is best to not use the GitHub review approve functionality for this, since that would let Hall of Fame members self-merge the pull request before maintainers get the chance to look at it. - -The following is a non-exhaustive list of types of change, for which a reviewer should defer final decision and merge to a maintainer: - -- A larger refactoring that significantly affects the structure of/between packages -- Changes that settle or alter the trajectory of contested ongoing topics in issues or elsewhere -- Changes that affect the [Architecture Decision Records](./docs/architecture-decisions) -- Changes to APIs that have large customer impact, such as the core APIs in `@backstage/core-*` packages, or significant `@backstage/cli` changes. -- Pull requests whose build checks are not passing fully -- Additions and removals of entire packages -- Releases (e.g. pull requests titled `Version Packages`) - -A maintainer may suggest an addition to the reviewers team by opening a pull request that modifies [`OWNERS.md`](./OWNERS.md) accordingly. Prospective reviewers are not expected to do this themselves, but should rather ask a maintainer to sponsor their addition. All of the maintainers and sponsors are called to vote on the addition (see the section below about voting). If the vote passes, the pull request can be approved and merged, and the corresponding addition to the GitHub team can be made. - -A reviewer can elect to remove themselves from the reviewers group by opening, or asking a maintainer to open, a pull request that modifies [`OWNERS.md`](./OWNERS.md) accordingly. A maintainer will approve and merge the pull request, and the corresponding removal from the GitHub team can be made. - -A maintainer can call on the other maintainers and sponsors for a vote to remove a reviewer (see the section below about conflict resolution and voting). If the vote passes, a maintainer creates a pull request that modifies [`OWNERS.md`](./OWNERS.md) accordingly. After approval by another maintainer, the pull request can be merged, and the corresponding removal from the GitHub team can be made. - # Conflict resolution and voting -In general, we prefer that technical issues and membership are amicably worked out between the persons involved. If a dispute cannot be decided independently, the sponsors and maintainers can be called in to decide an issue. If the sponsors and maintainers themselves cannot decide an issue, the issue will be resolved by voting. +In general, we prefer that technical issues and membership are amicably worked out between the persons involved. If a dispute cannot be decided independently, the sponsors and core maintainers can be called in to decide an issue. If the sponsors and maintainers themselves cannot decide an issue, the issue will be resolved by voting. -In all cases in this document where voting is mentioned, the voting process is a simple majority in which each sponsor receives two votes and each maintainer receives one vote. If such a majority is reached, the vote is said to have _passed_. +In all cases in this document where voting is mentioned, the voting process is a simple majority in which each sponsor receives two votes and each core maintainer receives one vote. If such a majority is reached, the vote is said to have _passed_. -# Adding new projects to the Backstage GitHub organization +## Inactivity -New projects will be added to the Backstage organization via GitHub issue discussion in one of the existing projects in the organization. Once sufficient discussion has taken place (~3-5 business days but depending on the volume of conversation), the maintainers of the project where the issue was opened (since different projects in the organization may have different maintainers) will decide whether the new project should be added. See the section above on voting if the maintainers cannot easily decide. +It is important for contributors to be and stay active to set an example and show commitment to the project. Inactivity is harmful to the project as it may lead to unexpected delays, contributor attrition, and a loss of trust in the project. + +Inactivity is measured by periods of no contributions for longer than: + +- Core Maintainer: 2 months +- Project Area Maintainer: 4 months +- Plugin Maintainer: 6 months +- Organization Member: 8 months + +Consequences of being inactive include: + +- Involuntary removal or demotion +- Being asked to move to Emeritus status + +## Involuntary Removal or Demotion + +Involuntary removal/demotion of a contributor happens when responsibilities and requirements aren't being met. This may include repeated patterns of inactivity, extended period of inactivity, a period of failing to meet the requirements of your role, and/or a violation of the Code of Conduct. This process is important because it protects the community and its deliverables while also opens up opportunities for new contributors to step in. + +Involuntary removal or demotion is handled through a vote by a majority of the current Core Maintainers. Some aspects of this process may be automated, such as removal after periods of inactivity. + +## Stepping Down/Emeritus Process + +If and when contributors' commitment levels change, contributors can consider stepping down (moving down the contributor ladder) vs moving to emeritus status (completely stepping away from the project). + +Contact the Maintainers about changing to Emeritus status, or reducing your contributor level. diff --git a/OWNERS.md b/OWNERS.md index 6615046540..08736d5723 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -1,43 +1,91 @@ - See [CONTRIBUTING.md](CONTRIBUTING.md) for general contribution guidelines. - See [GOVERNANCE.md](GOVERNANCE.md) for governance guidelines and responsibilities. -This page lists all active sponsors and maintainers. +## Core Maintainers -# Sponsors +Team: @backstage/maintainers -- Niklas Gustavsson ([protocol7](https://github.com/protocol7)) (ngn@spotify.com) -- Dave Zolotusky ([dzolotusky](https://github.com/dzolotusky)) (dzolo@spotify.com) -- Lee Mills ([leemills83](https://github.com/leemills83)) (leem@spotify.com) +| Maintainer | Organization | GitHub | Discord | +| --------------- | ------------ | ----------------------------------------------- | ------------- | +| 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` | -# Maintainers +## Project Areas -- Patrik Oldsberg ([rugvip](https://github.com/rugvip)) (Discord: @Rugvip) -- Fredrik Adelöw ([freben](https://github.com/freben)) (Discord: @freben) -- Ben Lambert ([benjdlambert](https://github.com/benjdlambert)) (Discord: @blam) -- Johan Haals ([jhaals](https://github.com/jhaals)) (Discord: @jhaals) +These are the separate project areas of Backstage, each with their own project area maintainers -# Reviewers +### Catalog -See [`GOVERNANCE.md`](./GOVERNANCE.md) for details about how the reviewers team -works. +Team: @backstage/catalog-maintainers -- Patrik Oldsberg ([rugvip](https://github.com/rugvip)) (Discord: @Rugvip) -- Fredrik Adelöw ([freben](https://github.com/freben)) (Discord: @freben) -- Ben Lambert ([benjdlambert](https://github.com/benjdlambert)) (Discord: @blam) -- Johan Haals ([jhaals](https://github.com/jhaals)) (Discord: @jhaals) -- Himanshu Mishra ([OrkoHunter](https://github.com/OrkoHunter)) (Discord: @OrkoHunter) -- Tim Hansen ([timbonicus](https://github.com/timbonicus)) (Discord: @timbonicus) +| Name | Organization | Team | GitHub | Discord | +| ---- | ------------ | --------- | ---------------------------- | ------- | +| TBD | Spotify | Chipmunks | [TBD](http://github.com/TBD) | - | -# Emeritus maintainers +### Discoverability -- Stefan Ålund ([stefanalund](https://github.com/stefanalund)) (Discord: @stalund) +Team: @backstage/discoverability-maintainers -# Hall of Fame +Scope: Discoverability within Backstage, including the home page, information architecture, and search -People that have made significant contributions to the project and earned write access. +| Name | Organization | Team | GitHub | Discord | +| ------------------------ | ------------ | ---- | ---------------------------------------- | ------------------ | +| Avantika Iyer | Spotify | BUX | [tikabom](http://github.com/tikabom) | - | +| Camila Belo | Spotify | BUX | [camilaibs](http://github.com/camilaibs) | Camila Loiola#0226 | +| Emma Indal | Spotify | BUX | [emmaindal](http://github.com/emmaindal) | emmaindal#7503 | +| Raghunandan Balachandran | Spotify | BUX | [soapraj](http://github.com/soapraj) | raghunandanb#1114 | +| Renan Mendes Carvalho | Spotify | BUX | [aitherios](http://github.com/aitherios) | aitherios#0593 | -- Andrew Thauer - Wealthsimple (GitHub: [andrewthauer](https://github.com/andrewthauer)) -- Oliver Sand - SDA SE (GitHub: [Fox32](https://github.com/Fox32)) -- David Tuite - Roadie (GitHub: [dtuite](https://github.com/dtuite)) -- Adam Harvey - Cisco (GitHub: [adamdmharvey](https://github.com/adamdmharvey)) -- Dominik Henneke - SDA SE (GitHub: [dhenneke](https://github.com/dhenneke)) +### Kubernetes + +Team: @backstage/kubernetes-maintainers + +Scope: The Kubernetes plugin and the base it provides for other plugins to build upon. + +| Name | Organization | Team | GitHub | Discord | +| -------------- | ------------ | ---- | ---------------------------------------- | ------------ | +| Matthew Clarke | Spotify | | [mclarke47](http://github.com/mclarke47) | mclarke#0725 | + +### TechDocs + +Team: @backstage/techdocs-maintainers + +Scope: The TechDocs plugin and related tooling + +| Name | Organization | Team | GitHub | Discord | +| ------------------------ | ------------ | ------------ | ------------------------------------------------ | ------------------ | +| Morgan Bentell | Spotify | Pulp Fiction | [agentbellnorm](http://github.com/agentbellnorm) | morganbentell#9030 | +| Raghunandan Balachandran | Spotify | Pulp Fiction | [soapraj](http://github.com/soapraj) | raghunandanb#1114 | + +## Sponsors + +| Name | Organization | GitHub | Email | +| ----------------- | ------------ | ------------------------------------------- | ----------------- | +| Niklas Gustavsson | Spotify | [protocol7](https://github.com/protocol7) | ngn@spotify.com | +| Dave Zolotusky | Spotify | [dzolotusky](https://github.com/dzolotusky) | dzolo@spotify.com | +| Lee Mills | Spotify | [leemills83](https://github.com/leemills83) | leem@spotify.com | + +## Organization Members + +| Name | Organization | GitHub | Discord | +| ------------------ | ------------------------- | ----------------------------------------------- | ------------------------------ | +| Adam Harvey | Cisco | [adamdmharvey](https://github.com/adamdmharvey) | `adamharvey#3739` | +| Andre Wanlin | Keyloop | [awanlin](https://github.com/awanlin) | `Ahhhndre#3095` | +| Andrew Thauer | Wealthsimple | [andrewthauer](https://github.com/andrewthauer) | `andrewthauer#3060` | +| Brian Fletcher | RoadieHQ | [punkle](https://github.com/punkle) | `Brian Fletcher#7051` | +| David Tuite | Roadie | [dtuite](https://github.com/dtuite) | `David Tuite (roadie.io)#1010` | +| Himanshu Mishra | Harness.io | [OrkoHunter](https://github.com/OrkoHunter) | `OrkoHunter#1520` | +| Jamie Klassen | VMware | [jamieklassen](https://github.com/jamieklassen) | `jamieklassen#3047` | +| Jussi Hallila | Roadie | [Xantier](https://github.com/Xantier) | `Xantier#0086` | +| Mark Avery | Cvent | [webark](https://github.com/webark) | `webark#8471` | +| Patrick Jungermann | Bonial International GmbH | [pjungermann](https://github.com/pjungermann) | `pjungermann#6933` | +| Phil Kuang | FactSet Research Systems | [kuangp](https://github.com/kuangp) | `pkuang#3202` | +| Taras Mankovski | Frontside | [taras](https://github.com/taras) | `tarasm#1256` | + +## Emeritus Core Maintainers + +| Maintainer | Organization | GitHub | Discord | +| ------------ | ------------ | --------------------------------------------- | -------------- | +| Stefan Ålund | Spotify | [stefanalund](https://github.com/stefanalund) | `stalund#9602` | diff --git a/docs/features/kubernetes/installation.md b/docs/features/kubernetes/installation.md index ae7826a804..17028ef90f 100644 --- a/docs/features/kubernetes/installation.md +++ b/docs/features/kubernetes/installation.md @@ -75,6 +75,7 @@ export default async function createPlugin( logger: env.logger, config: env.config, catalogApi, + permissions: env.permissions, }).build(); return router; } diff --git a/docs/features/kubernetes/proxy.md b/docs/features/kubernetes/proxy.md index 5848d62e3e..b53dfeb29d 100644 --- a/docs/features/kubernetes/proxy.md +++ b/docs/features/kubernetes/proxy.md @@ -22,6 +22,7 @@ import { discoveryApiRef, googleAuthApiRef, useApi, + identityApiRef, } from '@backstage/core-plugin-api'; const CLUSTER_NAME = ''; // use a known cluster name @@ -32,6 +33,10 @@ const token = await googleAuthApi.getAccessToken( 'https://www.googleapis.com/auth/cloud-platform', ); +// get a backstage ID token +const identityApi = useApi(identityApiRef); +const { token: userToken } = await identityApi.getCredentials(); + const discoveryApi = useApi(discoveryApiRef); const kubernetesBaseUrl = await discoveryApi.getBaseUrl('kubernetes'); const kubernetesProxyEndpoint = `${kubernetesBaseUrl}/proxy`; @@ -40,8 +45,9 @@ const kubernetesProxyEndpoint = `${kubernetesBaseUrl}/proxy`; await fetch(`${kubernetesProxyEndpoint}/api/v1/namespaces`, { method: 'GET', headers: { - 'X-Kubernetes-Cluster': CLUSTER_NAME, - Authorization: `Bearer ${token}`, + 'Backstage-Kubernetes-Cluster': CLUSTER_NAME, + 'Backstage-Kubernetes-Authorization': `Bearer ${token}`, + Authorization: `Bearer ${userToken}`, }, }); ``` @@ -49,16 +55,19 @@ await fetch(`${kubernetesProxyEndpoint}/api/v1/namespaces`, { ## How it works The proxy will interpret the -[`X-Kubernetes-Cluster` -header](https://backstage.io/docs/reference/plugin-kubernetes-backend.header_kubernetes_cluster) -as the name of the cluster to target. This name will be compared to each cluster +[`Backstage-Kubernetes-Cluster`](https://backstage.io/docs/reference/plugin-kubernetes-backend.header_kubernetes_cluster) +header as the name of the cluster to target. This name will be compared to each cluster returned by all the configured [cluster locators](https://backstage.io/docs/features/kubernetes/configuration#clusterlocatormethods) -- the first cluster whose [`name` field](https://backstage.io/docs/features/kubernetes/configuration#clustersname) matches the value in the header will be targeted. -Then the request will be forwarded verbatim (but with the endpoint's base URL -prefix stripped) to the cluster. +Then the request will be forwarded to the cluster. + +Overall, the only changes to each request are: + +- the endpoint's base URL prefix is stripped. +- the `Backstage-Kubernetes-Authorization` header becomes the `Authorization` header that is used when forwarding the request. ## Authentication @@ -73,9 +82,59 @@ providers](https://backstage.io/docs/features/kubernetes/authentication#client-s The proxy has no provisions for mTLS, so it cannot be used to connect to clusters using the [x509 Client Certs](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#x509-client-certs) -authentication strategy. [Bearer -tokens](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#putting-a-bearer-token-in-a-request) -will be forwarded as-is. +authentication strategy.\ +The current `/proxy` Implementation expects a +[Bearer +token](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#putting-a-bearer-token-in-a-request) +to be provided as a `Backstage-Kubernetes-Authorization` header for a target cluster. This token will be used as the `Authorization` header when forwarding a request to a target cluster. + +## How to disable the proxy endpoint via PermissionPolicy + +The kubernetes plugin can disable the use of the `proxy` endpoint by leveraging the permission framework. This integration allows admins to use well defined PermissionPolicies to restrict the use of the endpoint all together. The `proxy` endpoint can return 403 errors even if it has a valid ID token attached that a cluster would authorize thus allowing integrators the confidence that Backstage is not accessing kubernetes clusters on behalf of undesired parties. + +This feature assumes your backstage instance has enabled the [permissions framework](https://backstage.io/docs/permissions/getting-started) + +A sample policy like: + +[packages/backend/src/plugins/permissions.ts](https://github.com/backstage/backstage/blob/master/packages/backend/src/plugins/permission.ts) + +```typescript +import { BackstageIdentityResponse } from '@backstage/plugin-auth-node'; +import { + AuthorizeResult, + PolicyDecision, +} from '@backstage/plugin-permission-common'; +import { + PermissionPolicy, + PolicyQuery, +} from '@backstage/plugin-permission-node'; + +class KubernetesDenyAllProxyEndpointPolicy implements PermissionPolicy { + async handle( + request: PolicyQuery, + user?: BackstageIdentityResponse, + ): Promise { + if (request.permission.name === 'kubernetes.proxy') { + return { + result: AuthorizeResult.DENY, + }; + } + return { result: AuthorizeResult.ALLOW }; + } +} +``` + +would leverage the permission framework to return the following response: + +```json +{ + "error": { + "name": "NotAllowedError" + } +} +``` + +even if a valid ID token was attached that a cluster would authorize. ## Other known limitations diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md index 5b28e259b5..abb29ab4eb 100644 --- a/docs/features/search/how-to-guides.md +++ b/docs/features/search/how-to-guides.md @@ -51,7 +51,7 @@ The TechDocs plugin has supported integrations to Search, meaning that it provides a default collator factory ready to be used. The purpose of this guide is to walk you through how to register the -[DefaultTechDocsCollatorFactory](https://github.com/backstage/backstage/blob/master/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.ts) +[DefaultTechDocsCollatorFactory](https://github.com/backstage/backstage/blob/de294ce5c410c9eb56da6870a1fab795268f60e3/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.ts) in your App, so that you can get TechDocs documents indexed. If you have been through the @@ -369,3 +369,31 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => ( ``` There are other more specific search results layout components that also accept result item extensions, check their documentation: [SearchResultList](https://backstage.io/storybook/?path=/story/plugins-search-searchresultlist--with-result-item-extensions) and [SearchResultGroup](https://backstage.io/storybook/?path=/story/plugins-search-searchresultgroup--with-result-item-extensions). + +## How to migrate your backend installation to use Search together with the new backend system + +> DISCLAIMER: The new backend system is in alpha, and so are the search backend support for the new backend system. We don't recommend you to migrate your backend installations to the new system yet. But if you want to experiment, this is the guide for you! + +Recently, the Backstage maintainers [announced the new Backend System](https://backstage.io/blog/2023/02/15/backend-system-alpha). The search plugins are now migrated to support the new backend system. In this guide you will learn how to update your backend set up. + +In packages/backend-next/index.ts + +```ts +import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; +import { searchModuleElasticsearchEngine } from '@backstage/plugin-search-backend-module-elasticsearch/alpha'; +import { searchModuleCatalogCollator } from '@backstage/plugin-search-backend-module-catalog/alpha'; +import { searchModuleTechDocsCollator } from '@backstage/plugin-search-backend-module-techdocs/alpha'; +import { searchModuleExploreCollator } from '@backstage/plugin-search-backend-module-explore/alpha'; + +const backend = createBackend(); +// adding the search plugin to the backend +backend.add(searchPlugin()); +// (optional) the default search engine is Lunr, if you want to extend the search backend with another search engine. +backend.add(searchModuleElasticsearchEngine()); +// extending search with collator modules to start index documents, take in optional schedule parameters. +backend.add(searchModuleCatalogCollator()); +backend.add(searchModuleTechDocsCollator()); +backend.add(searchModuleExploreCollator()); + +backend.start(); +``` diff --git a/docs/features/software-catalog/extending-the-model.md b/docs/features/software-catalog/extending-the-model.md index bdd043b8a8..c254d7d0b6 100644 --- a/docs/features/software-catalog/extending-the-model.md +++ b/docs/features/software-catalog/extending-the-model.md @@ -170,6 +170,7 @@ its schema. There is a builtin processor that implements this for all known core kinds and matches the data against their fixed validation schema. This processor can be replaced when building the backend catalog using the `CatalogBuilder`, with a processor of your own that validates the data differently. +This replacement processor must have a name that matches the builtin processor, `BuiltinKindsEntityProcessor`. This type of extension is high risk, and may have high impact across the ecosystem depending on the type of change that is made. It is therefore not diff --git a/docs/features/software-catalog/external-integrations.md b/docs/features/software-catalog/external-integrations.md index 6f957625bd..0f2459d6e0 100644 --- a/docs/features/software-catalog/external-integrations.md +++ b/docs/features/software-catalog/external-integrations.md @@ -506,9 +506,10 @@ import { processingResult, CatalogProcessor, CatalogProcessorEmit, - LocationSpec, } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; + // A processor that reads from the fictional System-X export class SystemXReaderProcessor implements CatalogProcessor { constructor(private readonly reader: UrlReader) {} diff --git a/docs/features/software-templates/configuration.md b/docs/features/software-templates/configuration.md index ff5191bed2..24b8c530b8 100644 --- a/docs/features/software-templates/configuration.md +++ b/docs/features/software-templates/configuration.md @@ -93,3 +93,18 @@ You can also further customize groups by passing in a `titleComponent` instead of a `title` which will be a component to use as the header instead of just the default `ContentHeader` with the `title` set as it's value. ![Grouped Templates](../../assets/software-templates/grouped-templates.png) + +There is also an option to hide some templates. +You can have several use cases for that: + +- it's still in an experimental phase, so you can combine it with feature flagging for example +- you don't want to make them accessible from template list, but only open it on some action with pre-filled data. +- show different set of templates depends on target environment + +```typescript jsx + + entity?.metadata?.tags?.includes('experimental') ?? false + } +/> +``` diff --git a/docs/features/software-templates/index.md b/docs/features/software-templates/index.md index 5911e192b1..fbccf8848c 100644 --- a/docs/features/software-templates/index.md +++ b/docs/features/software-templates/index.md @@ -58,6 +58,10 @@ It shouldn't take too long, and you'll have a success screen! If it fails, you'll be able to click on each section to get the log from the step that failed which can be helpful in debugging. +You can also cancel the running process. Once you clicked on button "Cancel", the abort signal +will be sent to a task and all next steps won't be executed. The current step will be cancelled +only if it supports it. + ![Templating failed](../../assets/software-templates/failed.png) ## View Component in Catalog diff --git a/docs/features/software-templates/testing-scaffolder-alpha.md b/docs/features/software-templates/testing-scaffolder-alpha.md index c0b97e897c..02e579ef83 100644 --- a/docs/features/software-templates/testing-scaffolder-alpha.md +++ b/docs/features/software-templates/testing-scaffolder-alpha.md @@ -52,33 +52,54 @@ And this API should be the exact same as the previous Router, so you should be a ```tsx - entity?.metadata?.tags?.includes('recommended') ?? false, - }, - ]} - /> - } - > - - - {/* ... other extensions */} - - - - {/* ... other layouts */} - - + path="/create" + element={ + {/* highlight-remove-next-line */} + + entity?.metadata?.tags?.includes('recommended') ?? false, + }, + ]} + /> + } +> + + + {/* ... other extensions */} + + + + {/* ... other layouts */} + + ``` +Optionally, you can choose to run the two side by side by using `FeatureFlags` in your `App.tsx` if you wish, but, we would also recommend duplicating any `CustomFieldExtensions` too as the new `CustomFieldExtensions` might not be compatible with the old form. + +```tsx + + }> + + + + + + + }> + + + + + +``` + +You should then be able to enable the `scaffolder-next-preview` feature flag under `/settings/feature-flags` in Backstage. + ### Make the required changes to your `CustomFieldExtensions` There's differently named function for creating field extensions part of the `/alpha` exports as these are the ones that can contain breaking changes because of the breaking changes that have been applied in `react-jsonschema-form`. @@ -197,9 +218,9 @@ You will need to change the import for `FieldValidation` to point at the new `re ```ts /* highlight-remove-next-line */ -- import { FieldValidation } from '@rjsf/core'; +import { FieldValidation } from '@rjsf/core'; /* highlight-add-next-line */ -+ import { FieldValidation } from '@rjsf/utils; +import { FieldValidation } from '@rjsf/utils; import { KubernetesValidatorFunctions } from '@backstage/catalog-model'; export const entityNamePickerValidation = ( diff --git a/docs/features/software-templates/writing-custom-actions.md b/docs/features/software-templates/writing-custom-actions.md index 3e89e89582..7a841dfd0e 100644 --- a/docs/features/software-templates/writing-custom-actions.md +++ b/docs/features/software-templates/writing-custom-actions.md @@ -71,7 +71,7 @@ You can also choose to define your custom action using JSON schema instead of `z ```ts title="With JSON Schema" import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; -import fs from 'fs-extra'; +import { writeFile } from 'fs'; export const createNewFileAction = () => { return createTemplateAction<{ contents: string; filename: string }>({ @@ -95,9 +95,12 @@ export const createNewFileAction = () => { }, }, async handler(ctx) { - await fs.outputFile( + const { signal } = ctx; + await writeFile( `${ctx.workspacePath}/${ctx.input.filename}`, ctx.input.contents, + { signal }, + _ => {}, ); }, }); diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index a272f05f3f..15e6a833cc 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -472,6 +472,20 @@ owner: kind: [Group, User] ``` +#### `catalogFilter` + +The `catalogFilter` allow you to filter the list entities using any of the [catalog api filters](https://backstage.io/docs/features/software-catalog/software-catalog-api#filtering): + +For example, if you want to show users in the `default` namespace, and groups with the `github.com/team-slug` annotation, you can do the following: + +```yaml +catalogFilter: + - kind: [User] + metadata.namespace: default + - kind: [Group] + metadata.annotations.github.com/team-slug: { exists: true } +``` + ## `spec.steps` - `Action[]` The `steps` is an array of the things that you want to happen part of this diff --git a/docs/features/techdocs/cli.md b/docs/features/techdocs/cli.md index b174896d6a..76589de5a8 100644 --- a/docs/features/techdocs/cli.md +++ b/docs/features/techdocs/cli.md @@ -200,6 +200,15 @@ Options: -h, --help display help for command ``` +#### Publishing from behind a proxy + +For users attempting to publish TechDocs content behind a proxy, the TechDocs CLI leverages `global-agent` to navigate the proxy to successfully connect to that location. To enable `global-agent`, the following variables need to be set prior to running the techdocs-cli command: + +```bash +export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY} +export GLOBAL_AGENT_NO_PROXY=${NO_PROXY} +``` + ### Migrate content for case-insensitive access Prior to the beta version of TechDocs (`v[0.11.0]`), TechDocs were stored in diff --git a/docs/integrations/azure/discovery.md b/docs/integrations/azure/discovery.md index d1309a80eb..8dd5da85c9 100644 --- a/docs/integrations/azure/discovery.md +++ b/docs/integrations/azure/discovery.md @@ -60,6 +60,7 @@ catalog: host: selfhostedazure.yourcompany.com organization: myorg project: myproject + branch: development ``` The parameters available are: @@ -69,6 +70,7 @@ The parameters available are: - **`project:`** _(optional)_ Your project slug. Wildcards are supported as show on the examples above. If not set, all projects will be searched. For a project name containing spaces, use both single and double quotes as in `project: '"My Project Name"'`. - **`repository:`** _(optional)_ The repository name. Wildcards are supported as show on the examples above. If not set, all repositories will be searched. - **`path:`** _(optional)_ Where to find catalog-info.yaml files. Defaults to /catalog-info.yaml. +- **`branch:`** _(optional)_ The branch name to use. - **`schedule`** _(optional)_: - **`frequency`**: How often you want the task to run. The system does its best to avoid overlapping invocations. @@ -79,9 +81,17 @@ The parameters available are: - **`scope`** _(optional)_: `'global'` or `'local'`. Sets the scope of concurrency control. -_Note:_ the path parameter follows the same rules as the search on Azure DevOps -web interface. For more details visit the -[official search documentation](https://docs.microsoft.com/en-us/azure/devops/project/search/get-started-search?view=azure-devops). +_Note:_ + +- The path parameter follows the same rules as the search on Azure DevOps web interface. For more details visit the [official search documentation](https://docs.microsoft.com/en-us/azure/devops/project/search/get-started-search?view=azure-devops). +- To use branch parameters, it is necessary that the desired branch be added to the "Searchable branches" list within Azure DevOps Repositories. To do this, follow the instructions below: + +1. Access your Azure DevOps and open the repository in which you want to add the branch. +2. Click on "Settings" in the lower-left corner of the screen. +3. Select the "Options" option in the left navigation bar. +4. In the "Searchable branches" section, click on the "Add" button to add a new branch. +5. In the window that appears, enter the name of the branch you want to add and click "Add". +6. The added branch will now appear in the "Searchable branches" list. As this provider is not one of the default providers, you will first need to install the Azure catalog plugin: diff --git a/docs/integrations/gitlab/discovery.md b/docs/integrations/gitlab/discovery.md index 6d0bb7e2e2..45991b2cf5 100644 --- a/docs/integrations/gitlab/discovery.md +++ b/docs/integrations/gitlab/discovery.md @@ -21,6 +21,7 @@ catalog: gitlab: yourProviderId: host: gitlab-host # Identifies one of the hosts set up in the integrations + branch: main # Optional. Used to discover on a specific branch fallbackBranch: main # Optional. Fallback to be used if there is no default branch configured at the Gitlab repository. It is only used, if `branch` is undefined. Uses `master` as default group: example-group # Optional. Group and subgroup (if needed) to look for repositories. If not present the whole instance will be scanned entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` diff --git a/docs/integrations/gitlab/org.md b/docs/integrations/gitlab/org.md index 7ddc5202b5..d78b0ed388 100644 --- a/docs/integrations/gitlab/org.md +++ b/docs/integrations/gitlab/org.md @@ -2,15 +2,14 @@ id: org title: GitLab Organizational Data sidebar_label: Org Data -description: Importing users and groups from a GitLab organization into Backstage +description: Importing users and groups from GitLab into Backstage --- -The Backstage catalog can be set up to ingest organizational data - users and -teams - directly from an organization in GitLab. The result -is a hierarchy of +The Backstage catalog can be set up to ingest organizational data -- users and +groups -- directly from GitLab. The result is a hierarchy of [`User`](../../features/software-catalog/descriptor-format.md#kind-user) and -[`Group`](../../features/software-catalog/descriptor-format.md#kind-group) kind -entities that mirror your org setup. +[`Group`](../../features/software-catalog/descriptor-format.md#kind-group) +entities that mirrors your org setup. ```yaml integrations: @@ -19,10 +18,11 @@ integrations: token: ${GITLAB_TOKEN} ``` -This will query all users and groups from your gitlab installation. Depending on the size -of the Gitlab Instance, this can take some time and resources. +This will query all users and groups from your GitLab instance. Depending on the +amount of data, this can take significant time and resources. -The token that is used for the Organization Integration, has to be an Admin Personal Access Token (PAT). +The token used must have the `read_api` scope, and the Users and Groups fetched +will be those visible to the account which provisioned the token. ```yaml catalog: @@ -35,6 +35,7 @@ catalog: groupPattern: '[\s\S]*' # Optional. Filters found groups based on provided pattern. Defaults to `[\s\S]*`, which means to not filter anything ``` -When the `group` parameter is provided, the corresponding path prefix will be stripped out from each matching group -when computing the unique entity name. e.g. If `group` is `org/teams`, the name for `org/teams/avengers/gotg` will -be `avengers-gotg`. +When the `group` parameter is provided, the corresponding path prefix will be +stripped out from each matching group when computing the unique entity name. +e.g. If `group` is `org/teams`, the name for `org/teams/avengers/gotg` will be +`avengers-gotg`. diff --git a/docs/local-dev/cli-build-system.md b/docs/local-dev/cli-build-system.md index a86c0eaa35..a5df84f8dc 100644 --- a/docs/local-dev/cli-build-system.md +++ b/docs/local-dev/cli-build-system.md @@ -505,6 +505,7 @@ of all supported file extensions: | `.jpg` | URL Path | Image | | `.png` | URL Path | Image | | `.svg` | URL Path | Image | +| `.md` | URL Path | Markdown File | | `.icon.svg` | React Component | SVG converted into a [MUI SvgIcon](https://mui.com/components/icons/#svgicon) | ## Jest Configuration diff --git a/docs/local-dev/cli-commands.md b/docs/local-dev/cli-commands.md index 174fb3e348..c4c057ffe6 100644 --- a/docs/local-dev/cli-commands.md +++ b/docs/local-dev/cli-commands.md @@ -73,7 +73,7 @@ Build packages in the project, excluding bundled app and backend packages. Options: --all Build all packages, including bundled app and backend packages. - --since <ref> Only build packages and their dev dependents that changed since the specified ref + --since Only build packages and their dev dependents that changed since the specified ref ``` ## repo lint @@ -86,8 +86,8 @@ Usage: backstage-cli repo lint [options] Lint all packages in the project Options: - --format <format> Lint report output format (default: "eslint-formatter-friendly") - --since <ref> Only lint packages that changed since the specified ref + --format Lint report output format (default: "eslint-formatter-friendly") + --since Only lint packages that changed since the specified ref --fix Attempt to automatically fix violations ``` @@ -101,8 +101,8 @@ Usage: backstage-cli package start [options] Start a package for local development Options: - --config <path> Config files to load instead of app-config.yaml (default: []) - --role <name> Run the command with an explicit package role + --config Config files to load instead of app-config.yaml (default: []) + --role Run the command with an explicit package role --check Enable type checking and linting if available --inspect Enable debugger in Node.js environments --inspect-brk Enable debugger in Node.js environments, breaking before code starts @@ -118,11 +118,11 @@ Usage: backstage-cli package build [options] Build a package for production deployment or publishing Options: - --role <name> Run the command with an explicit package role + --role Run the command with an explicit package role --minify Minify the generated code. Does not apply to app or backend packages. --skip-build-dependencies Skip the automatic building of local dependencies. Applies to backend packages only. --stats If bundle stats are available, write them to the output directory. Applies to app packages only. - --config <path> Config files to load instead of app-config.yaml. Applies to app packages only. (default: []) + --config Config files to load instead of app-config.yaml. Applies to app packages only. (default: []) ``` ## package lint @@ -138,7 +138,7 @@ Usage: backstage-cli package lint [options] Lint a package Options: - --format <format> Lint report output format (default: "eslint-formatter-friendly") + --format Lint report output format (default: "eslint-formatter-friendly") --fix Attempt to automatically fix violations ``` @@ -212,14 +212,13 @@ backstage-cli new --select plugin --option id=foo ``` This command is typically added as script in the root `package.json` to be -executed with `yarn backstage-create`, using options that are appropriate for -the organization that owns the app repo. For example you may have it set up like -this: +executed with `yarn new`, using options that are appropriate for the organization +that owns the app repo. For example you may have it set up like this: ```json { "scripts": { - "backstage-create": "backstage-cli create --scope internal --no-private --npm-registry https://acme.org/npm" + "new": "backstage-cli new --scope internal --no-private --npm-registry https://acme.org/npm" } } ``` @@ -228,10 +227,10 @@ this: Usage: backstage-cli create [options] Options: - --select <name> Select the thing you want to be creating upfront - --option <name>=<value> Pre-fill options for the creation process (default: []) - --scope <scope> The scope to use for new packages - --npm-registry <URL> The package registry to use for new packages + --select Select the thing you want to be creating upfront + --option = Pre-fill options for the creation process (default: []) + --scope The scope to use for new packages + --npm-registry The package registry to use for new packages --no-private Do not mark new packages as private -h, --help display help for command ``` @@ -249,7 +248,7 @@ Usage: backstage-cli config:docs [options] Browse the configuration reference documentation Options: - --package <name> Only include the schema that applies to the given package + --package Only include the schema that applies to the given package -h, --help display help for command ``` @@ -269,12 +268,12 @@ yarn backstage-cli config:print --frontend --package my-app Usage: backstage-cli config:print [options] Options: - --package <name> Only load config schema that applies to the given package + --package Only load config schema that applies to the given package --lax Do not require environment variables to be set --frontend Print only the frontend configuration --with-secrets Include secrets in the printed configuration - --format <format> Format to print the configuration in, either json or yaml [yaml] - --config <path> Config files to load instead of app-config.yaml (default: []) + --format Format to print the configuration in, either json or yaml [yaml] + --config Config files to load instead of app-config.yaml (default: []) -h, --help display help for command ``` @@ -288,11 +287,11 @@ local packages in the repo. Usage: backstage-cli config:check [options] Options: - --package <name> Only load config schema that applies to the given package + --package Only load config schema that applies to the given package --lax Do not require environment variables to be set --frontend Only validate the frontend configuration --deprecated List all deprecated configuration settings - --config <path> Config files to load instead of app-config.yaml (default: []) + --config Config files to load instead of app-config.yaml (default: []) -h, --help display help for command ``` @@ -310,8 +309,8 @@ Usage: backstage-cli config:schema [options] Print configuration schema Options: - --package <name> Only output config schema that applies to the given package - --format <format> Format to print the schema in, either json or yaml [yaml] + --package Only output config schema that applies to the given package + --format Format to print the schema in, either json or yaml [yaml] -h, --help display help for command ``` @@ -326,8 +325,8 @@ Usage: backstage-cli versions:bump [options] Options: -h, --help display help for command - --pattern <glob> Override glob for matching packages to upgrade - --release <version|next|main> Bump to a specific Backstage release line or version (default: "main") + --pattern Override glob for matching packages to upgrade + --release Bump to a specific Backstage release line or version (default: "main") ``` ## versions:check diff --git a/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md index e714301ded..103e463cda 100644 --- a/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md +++ b/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md @@ -91,7 +91,7 @@ This enables decisions based on characteristics of the resource, but it's import Install the missing module: ```bash -$ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permission-node zod +$ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permission-node zod@~3.18.0 ``` Create a new `plugins/todo-list-backend/src/service/rules.ts` file and append the following code: diff --git a/docs/plugins/composability.md b/docs/plugins/composability.md index 1c64fd3f68..124a612f26 100644 --- a/docs/plugins/composability.md +++ b/docs/plugins/composability.md @@ -480,7 +480,7 @@ function isKind(kind: string) { ``` The `@backstage/catalog` plugin provides a couple of built-in conditions, -`isKind`, `isComponentType`, and `isNamespace`. +`isKind`, `isComponentType`, `isResourceType`, `isEntityWith`, and `isNamespace`. In addition to the `EntitySwitch` component, the catalog plugin also exports a new `EntityLayout` component. It is a tweaked version and replacement for the diff --git a/docs/plugins/feature-flags.md b/docs/plugins/feature-flags.md index a572143d6e..7b7a6c1435 100644 --- a/docs/plugins/feature-flags.md +++ b/docs/plugins/feature-flags.md @@ -37,7 +37,11 @@ Defining feature flag in the application is done by adding feature flags in`feat const app = createApp({ // ... featureFlags: [ - { name: 'tech-radar', description: 'Enables the tech radar plugin' }, + { + pluginId: '', // pluginId is required for feature flags in plugins. It can be left blank for a feature flag leveraged in the application. + name: 'tech-radar', + description: 'Enables the tech radar plugin', + }, ], // ... }); diff --git a/docs/plugins/integrating-search-into-plugins.md b/docs/plugins/integrating-search-into-plugins.md index 4e829b6ae9..7fb8e40b20 100644 --- a/docs/plugins/integrating-search-into-plugins.md +++ b/docs/plugins/integrating-search-into-plugins.md @@ -142,7 +142,7 @@ export class FaqCollatorFactory implements DocumentCollatorFactory { To verify your implementation works as expected make sure to add tests for it. For your convenience, there is the [`TestPipeline`](https://backstage.io/docs/reference/plugin-search-backend-node.testpipeline) utility that emulates a pipeline into which you can integrate your custom collator. -Look at [DefaultTechDocsCollatorFactory test](https://github.com/backstage/backstage/blob/master/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.test.ts), for an example. +Look at [DefaultTechDocsCollatorFactory test](https://github.com/backstage/backstage/blob/de294ce5c410c9eb56da6870a1fab795268f60e3/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.test.ts), for an example. #### 6. Make your plugins collator discoverable for others diff --git a/docs/releases/v1.12.0-changelog.md b/docs/releases/v1.12.0-changelog.md new file mode 100644 index 0000000000..7a8b52e33b --- /dev/null +++ b/docs/releases/v1.12.0-changelog.md @@ -0,0 +1,2933 @@ +# Release v1.12.0 + +## @backstage/backend-plugin-api@0.5.0 + +### Minor Changes + +- c1ee073a82b: Added `lastModifiedAt` field on `UrlReaderService` responses and a `lastModifiedAfter` option to `UrlReaderService.readUrl`. + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/backend-tasks@0.5.0 + +### Minor Changes + +- 1578276708a: add functionality to get descriptions from the scheduler for triggering + +### Patch Changes + +- f0685193efa: Added the adapted query to mysql and sqlite3 databases to not returning warning on logs +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/catalog-client@1.4.0 + +### Minor Changes + +- 8c030b1826c: Add `queryEntities` method to `CatalogApi`. + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- c630360631f: Ensure that `getEntitiesByRefs` returns `undefined` instead of `null` for missing items +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + +## @backstage/core-app-api@1.6.0 + +### Minor Changes + +- 456eaa8cf83: `OAuth2` now gets ID tokens from a session with the `openid` scope explicitly + requested. + + This should not be considered a breaking change, because spec-compliant OIDC + providers will already be returning ID tokens if and only if the `openid` scope + is granted. + + This change makes the dependence explicit, and removes the burden on + OAuth2-based providers which require an ID token (e.g. this is done by various + default [auth + handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add + `openid` to their default scopes. _That_ could carry another indirect benefit: + by removing `openid` from the default scopes for a provider, grants for + resource-specific access tokens can avoid requesting excess ID token-related + scopes. + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## @backstage/core-plugin-api@1.5.0 + +### Minor Changes + +- ab750ddc4f2: The GitLab auth provider can now be used to get OpenID tokens. + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## @techdocs/cli@1.4.0 + +### Minor Changes + +- 8e465ce52e2: Running `@techdocs/cli generate` with the `--verbose` flag will now print the mkdocs output. +- ea2bbef1b16: Added support for an HTTPS proxy for techdocs AWS S3 requests + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.6.0 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog@1.9.0 + +### Minor Changes + +- 23cc40039c0: Allow `EntitySwitch` to render all cases that match the condition. + + This change introduces a new parameter for the `EntitySwitch` component + `renderMultipleMatches`. In case the parameter value is `all`, the `EntitySwitch` + will render all `EntitySwitch.Case` that contain `if` parameter, and it + evaluates to true. In case none of the cases match, the default case will be + rendered, if any. + + This means for example in the CI/CD page you can now do the following: + + ```tsx + + Jenkins + CodeBuild + No CI/CD + + ``` + + This allows the component to have multiple CI/CD systems and all of those are + rendered on the same page. + +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item + +- c9a9f3c834f: Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. + +### Patch Changes + +- 3fa41696820: Make the "Copied!" message disappear automatically after some time +- 7e8930ae1c6: Fix icon alignment in `CatalogSearchResultListItem` +- dbbde6ed353: fix entity switch rendering when there is no default case +- cb8ec97cdeb: Change black & white colors to be theme aware +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-catalog-backend@1.8.0 + +### Minor Changes + +- 7f4ea3d3602: Add /entities/by-query endpoint returning paginated entities. + + The endpoint supports cursor base pagination and server side sorting of the entities + +### Patch Changes + +- e675f902980: Add deprecations for symbols that were moved to `@backstage/plugin-catalog-node` a long time ago: + + - `CatalogProcessor` + - `CatalogProcessorCache` + - `CatalogProcessorEmit` + - `CatalogProcessorEntityResult` + - `CatalogProcessorErrorResult` + - `CatalogProcessorLocationResult` + - `CatalogProcessorParser` + - `CatalogProcessorRefreshKeysResult` + - `CatalogProcessorRelationResult` + - `CatalogProcessorResult` + - `DeferredEntity` + - `EntityProvider` + - `EntityProviderConnection` + - `EntityProviderMutation` + - `EntityRelationSpec` + - `processingResult` + + Also moved over and deprecated the following symbols: + + - `locationSpecToLocationEntity` + - `locationSpecToMetadataName` + +- ac8929f2f31: Fix export of `defaultCatalogCollatorEntityTransformer`. + +- 928a12a9b3e: Internal refactor of `/alpha` exports. + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +- f093ce83d58: Fix a bug where the batch fetch by ref endpoint did not work in conjunction with filtering (e.g. if authorization was enabled). + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-permission-node@0.7.6 + - @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/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.6 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.3.0 + +### Minor Changes + +- a811bd246c4: Added endpoint to get a list of known incremental entity providers + +### Patch Changes + +- 90469c02c8c: Renamed `incrementalIngestionEntityProviderCatalogModule` to `catalogModuleIncrementalIngestionEntityProvider` 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. +- bf611cf019a: Fix missing `dependencies` in `package.json` +- 6e612b58577: Move `@backstage/backend-defaults` to `devDependencies` +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @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/plugin-events-node@0.2.4 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.0 + +### Minor Changes + +- a1efcf9a658: Initial version of the plugin. + +### Patch Changes + +- 561ce41191d: Added a `catalogModulePuppetDbEntityProvider` alpha export for the new backend system +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 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/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-react@1.4.0 + +### Minor Changes + +- 0a5b73b2926: Add possibility to re-use EntityPicker for filters with multiple select. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 24916d23494: Do not close `Autocomplete` powered multiple-selection filters when checking boxes +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-permission-react@0.4.11 + +## @backstage/plugin-firehydrant@0.2.0 + +### Minor Changes + +- e2e3dd08a54: Allow firehydrant to use component annotation + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-linguist-backend@0.2.0 + +### Minor Changes + +- 4a1c318853d: **BREAKING** The linguist-backend `createRouter` now requires that the `tokenManger` is passed to the router. + +### Patch Changes + +- 8a298b47240: Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API). + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +- 2ea57821629: Fixed bug in LinguistBackendApi that caused initial batch of entities to be skipped. + +- b271d5ca052: Allow kind to be configurable + + ```ts + return createRouter({ schedule: schedule, kind: ['Component'] }, { ...env }); + ``` + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-octopus-deploy@0.1.0 + +### Minor Changes + +- b7fff1171f0: Initial version + +### Patch Changes + +- cb0fc15a992: Added Octopus Deploy logo +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-scaffolder@1.12.0 + +### Minor Changes + +- 0d61fcca9c3: Update `EntityPicker` to use the fully qualified entity ref instead of the humanized version. +- 8f4d13f21cf: Move `useTaskStream`, `TaskBorder`, `TaskLogStream` and `TaskSteps` into `scaffolder-react`. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- be3cddaab5f: Getting credentials in the RepoUrlPicker now also works for targets without owner (e.g. Bitbucket Server). +- cb8ec97cdeb: Change black & white colors to be theme aware +- eb877bad736: Create an "Other Templates" group when groups are given to scaffolder/next. +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 0aae4596296: Fix the scaffolder validator for arrays when the item is a field in the object +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-scaffolder-react@1.2.0 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-scaffolder-common@1.2.6 + +## @backstage/plugin-scaffolder-backend@1.12.0 + +### Minor Changes + +- 7d724d8ef56: Added the ability to be able to define an actions `input` and `output` schema using `zod` instead of hand writing types and `jsonschema` + +### Patch Changes + +- 860de10fa67: Make identity valid if subject of token is a backstage server-2-server auth token +- 65454876fb2: Minor API report tweaks +- c6c78b4acbe: throw error from catalog:fetch scaffolder action when entity is null and optional is false +- 9968f455921: catalog write action should allow any shape of object +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 7af12854970: Extended scaffolder action `catalog:fetch` to fetch multiple catalog entities by entity references. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @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 + - @backstage/plugin-scaffolder-common@1.2.6 + - @backstage/plugin-scaffolder-node@0.1.1 + +## @backstage/plugin-scaffolder-react@1.2.0 + +### Minor Changes + +- 8f4d13f21cf: Move `useTaskStream`, `TaskBorder`, `TaskLogStream` and `TaskSteps` into `scaffolder-react`. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- c8d78b9ae9d: fix bug with `hasErrors` returning false when dealing with empty objects +- 9b8c374ace5: Remove timer for skipped steps in Scaffolder Next's TaskSteps +- 44941fc97eb: scaffolder/next: Move the `uiSchema` to its own property in the validation `context` to align with component development and access of `ui:options` +- d9893263ba9: scaffolder/next: Fix for steps without properties +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- cc418d652a7: scaffolder/next: Added the ability to get the fields definition in the schema in the validation function +- d4100d0ec42: Fix alignment bug for owners on `TemplateCard` +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-scaffolder-common@1.2.6 + +## @backstage/plugin-stackstorm@0.1.0 + +### Minor Changes + +- f3a15259e91: Add StackStorm plugin to Backstage which is interfacing with StackStorm API. It allows users to view workflow executions, packs and actions. For installation and configuration instructions please view [README.md](https://github.com/backstage/backstage/tree/master/plugins/stackstorm/README.md) + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-techdocs@1.6.0 + +### Minor Changes + +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 54a1e133b56: Fix bug that caused next and previous links not to work with certain versions of mkdocs-material +- f320c299c67: The HTML tag attributes in the documentation content inserted to shadow DOM is preserved to improve accessibility +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 8adfda60ae1: Updated dependency `jss` to `~10.10.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 238cf657c09: Copy to clipboard now works in a not secure context. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-techdocs-backend@1.6.0 + +### Minor Changes + +- 92b495328bd: Introduced alpha export of the `techdocsPlugin` using the new backend system. + +### Patch Changes + +- 40298b02778: Techdocs backend explains a bit more about what might have caused the docs not being found when building techdocs. +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-techdocs-node@1.6.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-techdocs-node@1.6.0 + +### Minor Changes + +- ea2bbef1b16: Added support for an HTTPS proxy for techdocs AWS S3 requests + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- bf493710f50: Update to a newer version of `@trendyol-js/openstack-swift-sdk` +- bfe350ef4ce: Fixed bug that prevented deletion of stale files when non-empty directories where tried to be deleted as well. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/integration-aws-node@0.1.2 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/app-defaults@1.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/core-app-api@1.6.0 + - @backstage/theme@0.2.18 + - @backstage/plugin-permission-react@0.4.11 + +## @backstage/backend-app-api@0.4.1 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- 915e46622cf: Add support for `NotImplementedError`, properly returning 501 as status code. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config-loader@1.1.9 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/backend-common@0.18.3 + +### Patch Changes + +- f75097868a7: Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres + + The example config below connects to the database as user `v-backstage-123` but sets the ownership of + the create schemas and tables to `backstage` + + ```yaml + backend: + database: + client: pg + pluginDivisionMode: schema + role: backstage + connection: + user: v-backstage-123 + ... + ``` + +- 928a12a9b3e: Internal refactor of `/alpha` exports. + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 + +- c1ee073a82b: Added `lastModifiedAt` field on `UrlReaderService` responses and a `lastModifiedAfter` option to `UrlReaderService.readUrl`. + +- 482dae5de1c: Updated link to docs. + +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + - @backstage/config-loader@1.1.9 + - @backstage/integration@1.4.3 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/integration-aws-node@0.1.2 + - @backstage/types@1.0.2 + +## @backstage/backend-defaults@0.1.8 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- 5d0693edc09: Added a workaround for the cyclic dependency bug across `@backstage/backend-common` and `@backstage/backend-app-api`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + +## @backstage/backend-dev-utils@0.1.1 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + +## @backstage/backend-test-utils@0.1.35 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/catalog-model@1.2.1 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/cli@0.22.4 + +### Patch Changes + +- 1ad8d885d30: Fixed a bug where additional backend package entry points where not properly marked as internal during local development. +- 2011b86052c: Added templates for new plugin Web and Node.js libraries. +- 867f4752ca1: Updated the ESLint plugin configuration that is enabled through `yarn start --check` to only pick up valid source files. +- b4cd145b574: Added a new `migrate package-exports` command that synchronizes package exports fields in all `package.json`s. +- 9bf50a36674: Bumped the `msw` version in templates to 1.0.0 +- 8bf24946c66: Adjust express dependencies to be the same as the rest of the project +- 17271841de8: Updated frontend plugin template to use some more recent features +- 4b4998466b4: Updated dependency `del` to `^7.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- a11b9a23f5a: Keep custom exports entry points in package.json +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/eslint-plugin@0.1.2 + - @backstage/errors@1.1.5 + - @backstage/config-loader@1.1.9 + - @backstage/release-manifests@0.0.9 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/cli-common@0.1.12 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + +## @backstage/codemods@0.1.44 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## @backstage/config@1.0.7 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/types@1.0.2 + +## @backstage/config-loader@1.1.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/core-components@0.12.5 + +### Patch Changes + +- 8bbf95b5507: Button labels in the sidebar (previously displayed in uppercase) will be displayed in the case that is provided without any transformations. + For example, a sidebar button with the label "Search" will appear as Search, "search" will appear as search, "SEARCH" will appear as SEARCH etc. + This can potentially affect any overriding styles previously applied to change the appearance of Button labels in the Sidebar. +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- e1aae2f5a0c: Updated the `aria-label` of the `HeaderTabs` component. +- 6a51a49a810: Fix bug where `` component would not take into account header styles defined in `columns[*].headerStyle`. +- fa004f66871: Use media queries to change layout instead of `isMobile` prop in `BackstagePage` component +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/version-bridge@1.0.3 + +## @backstage/create-app@0.4.38 + +### Patch Changes + +- b4627f23b28: Bumped create-app version. +- 0eceadb9502: Bumped create-app version. +- 482dae5de1c: Updated link to docs. +- 6ace2dd2c58: Added to the template `packages/app/.eslintignore` file to packages to ignore the contents of `packages/app/public`. +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## @backstage/dev-utils@1.0.13 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/app-defaults@1.2.1 + +## @backstage/errors@1.1.5 + +### Patch Changes + +- 3bf83a2aabf: Added `NotImplementedError`, which can be used when the server does not recognize the request method and is incapable of supporting it for any resource. +- Updated dependencies + - @backstage/types@1.0.2 + +## @backstage/eslint-plugin@0.1.2 + +### Patch Changes + +- a061c466d66: Fixing a bug that we should check internal dependencies too + +## @backstage/integration@1.4.3 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + +## @backstage/integration-aws-node@0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + +## @backstage/integration-react@1.1.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/release-manifests@0.0.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +## @backstage/repo-tools@0.1.3 + +### Patch Changes + +- 32a4a05838c: Tweaked type dependency check to trim wildcard type imports. +- 6ba8faf22ac: The API report generation process is now able to detect and generate reports for additional entry points declared in the package `"exports"` field. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + +## @backstage/test-utils@1.2.6 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/core-app-api@1.6.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.11 + +## @backstage/theme@0.2.18 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + +## @backstage/plugin-adr@0.4.1 + +### Patch Changes + +- d293f4aaf83: Updated readme instructions +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-adr-backend@0.3.1 + +### Patch Changes + +- 2a73ded3861: Support MADR v3 format +- 8bf24946c66: Adjust express dependencies to be the same as the rest of the project +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-adr-common@0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-airbrake@0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/dev-utils@1.0.13 + - @backstage/theme@0.2.18 + +## @backstage/plugin-airbrake-backend@0.2.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + +## @backstage/plugin-allure@0.1.32 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-analytics-module-ga@0.1.27 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-apache-airflow@0.2.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + +## @backstage/plugin-api-docs@0.9.1 + +### Patch Changes + +- 095e755d9b5: Add ApiDefinitionDialog component for fast access to the API definition in ProvidedApiCards and ConsumedApiCards. +- 8bc7dcec820: Fix dark theme Swagger's clear button font color. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 9820eb5d24f: Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-apollo-explorer@0.1.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-app-backend@0.3.43 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config-loader@1.1.9 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-backend@0.18.1 + +### Patch Changes + +- e262738b8a0: Handle difference in expiration time between Microsoft session and Backstage session which caused the Backstage token to be invalid during a time frame. +- 86cece2c1fb: Updated dependency `@types/passport-microsoft` to `^1.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 529de8c4211: Added authentication provider for Azure Easy Authentication. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-node@0.2.12 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + +## @backstage/plugin-azure-devops@0.2.7 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-devops-backend@0.3.22 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-sites@0.1.5 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-azure-sites-backend@0.1.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-badges@0.2.40 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-badges-backend@0.1.37 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-bazaar@0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/cli@0.22.4 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-bazaar-backend@0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-bitbucket-cloud-common@0.2.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/integration@1.4.3 + +## @backstage/plugin-bitrise@0.1.43 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-catalog-backend-module-aws@0.1.17 + +### Patch Changes + +- 90469c02c8c: Renamed `awsS3EntityProviderCatalogModule` to `catalogModuleAwsS3EntityProviders` 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. +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 +- bf611cf019a: Fix missing `dependencies` in `package.json` +- 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/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-kubernetes-common@0.6.1 + +## @backstage/plugin-catalog-backend-module-azure@0.1.14 + +### Patch Changes + +- 90469c02c8c: Renamed `azureDevOpsEntityProviderCatalogModule` to `catalogModuleAzureDevOpsEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- c17fa101825: Add branch filter support + +- 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`. +- 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 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.10 + +### Patch Changes + +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.10 + +### Patch Changes + +- 90469c02c8c: Renamed `bitbucketCloudEntityProviderCatalogModule` to `catalogModuleBitbucketCloudEntityProvider` 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`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.8 + +### Patch Changes + +- 90469c02c8c: Renamed `bitbucketServerEntityProviderCatalogModule` to `catalogModuleBitbucketServerEntityProvider` 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`. +- 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/plugin-catalog-backend-module-gerrit@0.1.11 + +### Patch Changes + +- 90469c02c8c: Renamed `gerritEntityProviderCatalogModule` to `catalogModuleGerritEntityProvider` 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`. +- 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/plugin-catalog-backend-module-github@0.2.6 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 90469c02c8c: Renamed `githubEntityProviderCatalogModule` to `catalogModuleGithubEntityProvider` 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`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @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/plugin-catalog-common@1.0.12 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-gitlab@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 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.10 + +### Patch Changes + +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.2 + +### Patch Changes + +- a4ebd513527: Revert using `baseUrl` for MS Graph provider as it breaks token retrieval +- 26eef93c547: Fixed msgraph catalog backend to use user.select option when fetching user from AzureAD +- 90469c02c8c: Renamed `microsoftGraphOrgEntityProviderCatalogModule` to `catalogModuleMicrosoftGraphOrgEntityProvider` 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`. +- 2c234a89325: properly support custom graph api URL +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-common@1.0.12 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-catalog-graph@0.2.28 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-catalog-graphql@0.3.19 + +### Patch Changes + +- b990021ddeb: Updated dependency `@graphql-codegen/cli` to `^3.0.0`. + Updated dependency `@graphql-codegen/graphql-modules-preset` to `^3.0.0`. + Updated dependency `@graphql-codegen/typescript` to `^3.0.0`. + Updated dependency `@graphql-codegen/typescript-resolvers` to `^3.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-import@0.9.6 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-node@1.3.4 + +### Patch Changes + +- e675f902980: Added `locationSpecToMetadataName` and `locationSpecToLocationEntity` as their new home, moved over from the backend package where they now are marked as deprecated. +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/types@1.0.2 + +## @backstage/plugin-cicd-statistics@0.1.18 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-cicd-statistics@0.1.18 + +## @backstage/plugin-circleci@0.3.16 + +### Patch Changes + +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-cloudbuild@0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-code-climate@0.1.16 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-code-coverage@0.2.9 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-code-coverage-backend@0.2.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + +## @backstage/plugin-codescene@0.1.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-config-schema@0.1.39 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + +## @backstage/plugin-cost-insights@0.12.5 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-cost-insights-common@0.1.1 + +## @backstage/plugin-dynatrace@3.0.0 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-entity-feedback@0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-entity-feedback-common@0.1.0 + +## @backstage/plugin-entity-feedback-backend@0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-entity-feedback-common@0.1.0 + +## @backstage/plugin-entity-validation@0.1.1 + +### Patch Changes + +- 47d246691ac: Fixed bug in EntityVaidation plugin where string in text box was unable to be updated. +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/theme@0.2.18 + +## @backstage/plugin-events-backend@0.2.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- a5de745ac17: Updated README instructions +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-events-backend-module-aws-sqs@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `awsSqsConsumingEventPublisherEventsModule` to `eventsModuleAwsSqsConsumingEventPublisher` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-events-backend-module-azure@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `azureDevOpsEventRouterEventsModule` to `eventsModuleAzureDevOpsEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `bitbucketCloudEventRouterEventsModule` to `eventsModuleBitbucketCloudEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + +## @backstage/plugin-events-backend-module-gerrit@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `gerritEventRouterEventsModule` to `eventsModuleGerritEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + +## @backstage/plugin-events-backend-module-github@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `githubEventRouterEventsModule` to `eventsModuleGithubEventRouter` and `githubWebhookEventsModule` to `eventsModuleGithubWebhook`, to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-events-backend-module-gitlab@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `gitlabEventRouterEventsModule` to `eventsModuleGitlabEventRouter` and `gitlabWebhookEventsModule` to `eventsModuleGitlabWebhook` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-events-backend-test-utils@0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.4 + +## @backstage/plugin-events-node@0.2.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + +## @backstage/plugin-explore@0.4.1 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-explore-react@0.0.27 + - @backstage/theme@0.2.18 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-explore-backend@0.0.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-explore-react@0.0.27 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-explore-common@0.0.1 + +## @backstage/plugin-fossa@0.2.48 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gcalendar@0.3.12 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gcp-projects@0.3.35 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-git-release-manager@0.3.29 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-actions@0.5.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-deployments@0.1.47 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-issues@0.2.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-pull-requests-board@0.1.10 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gitops-profiles@0.3.34 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gocd@0.1.22 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-graphiql@0.2.48 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-graphql-backend@0.1.33 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-graphql@0.3.19 + - @backstage/config@1.0.7 + +## @backstage/plugin-graphql-voyager@0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-home@0.4.32 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-ilert@0.2.5 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-jenkins@0.7.15 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-jenkins-common@0.1.14 + - @backstage/theme@0.2.18 + +## @backstage/plugin-jenkins-backend@0.1.33 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-jenkins-common@0.1.14 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-jenkins-common@0.1.14 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + +## @backstage/plugin-kafka@0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-kafka-backend@0.2.36 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-kubernetes@0.7.9 + +### Patch Changes + +- 8adeb19b37d: GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-kubernetes-common@0.6.1 + +## @backstage/plugin-kubernetes-backend@0.9.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-kubernetes-common@0.6.1 + +## @backstage/plugin-kubernetes-common@0.6.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-lighthouse@0.4.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-lighthouse-backend@0.1.1 + +### Patch Changes + +- 46829bc2f0e: Update README.md; typo with plugin name & removed unneeded "import { Router } from 'express';" +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-lighthouse-common@0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + +## @backstage/plugin-linguist@0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- ab997ce243f: Updated `README.md` to removed images with refresh button as this feature was not implemented in the current version +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-microsoft-calendar@0.1.1 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-newrelic@0.3.34 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 66fdf05a1ef: Updated installation instructions +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-newrelic-dashboard@0.2.9 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-org@0.6.6 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 36bccb5252f: Fix small UI-glitch in MemberListCard +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- a06fcac4040: Add styling to the `MembersListCard` and `ComponentsGrid` to handle overflow text. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-org-react@0.1.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-pagerduty@0.5.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 9c08ecbaa4b: Update readme link for discord channel +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-periskop@0.1.14 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-periskop-backend@0.1.14 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-permission-backend@0.5.18 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-permission-common@0.7.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-permission-node@0.7.6 + +### Patch Changes + +- 27a103ca07b: Changed the `createPermissionIntegrationRouter` API to allow `getResources`, `resourceType` and `rules` to be optional +- 37e9215c793: Update the service-to-service auth docs URL in error message. + \`\` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-permission-react@0.4.11 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-playlist@0.1.7 + +### Patch Changes + +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 122a37a880e: Internal update to work with newer versions of react-router +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/theme@0.2.18 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-playlist-common@0.1.5 + +## @backstage/plugin-playlist-backend@0.2.6 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-playlist-common@0.1.5 + +## @backstage/plugin-playlist-common@0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 + +## @backstage/plugin-proxy-backend@0.2.37 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +- 3e3eea4bc7e: The proxy-backend plugin now supports reviving request bodies that have previously been consumed by an express middleware (e.g. `express.json()`). This is done by setting `reviveConsumedRequestBodies: true` on the proxy `RouterOptions`. In order to preserve the current behavior, the proxy will **not** revive request bodies by default. + + The following is an example of a proxy `createRouter` invocation that revives request bodies: + + ```diff + const router = await createRouter({ + config, + logger, + discovery, + + reviveConsumedRequestBodies: true, + }); + ``` + +- 4acd93dae1d: Ensure that `@backstage/plugin-proxy-backend` logs the requests that it proxies when log level is set to `debug`. + +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-rollbar@0.4.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-rollbar-backend@0.1.40 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.18 + +### Patch Changes + +- 62414770ead: allow container runner to be undefined in cookiecutter plugin +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/plugin-scaffolder-node@0.1.1 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.16 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + +## @backstage/plugin-scaffolder-common@1.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-node@0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.6 + +## @backstage/plugin-search@1.1.1 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend@1.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend-module-elasticsearch@1.1.4 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend-module-pg@0.5.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend-node@1.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-common@1.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 + - @backstage/types@1.0.2 + +## @backstage/plugin-search-react@1.5.1 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 553f3c95011: Correctly disable next button in `SearchPagination` on last page +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-sentry@0.5.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-shortcuts@0.3.8 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware + +- 7c38e565d1f: Fixed bug in LocalStoredShortcuts client where adding new Shortcut results in replacing entire shortcut list. + + Refactored LocalStoredShortcuts client to listen to `storageApi` updates to ensure that local state is always up to date. + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + +## @backstage/plugin-sonarqube@0.6.5 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 8ae65a0bc1d: Moved imports from `/alpha` to main public exports. +- d3d624e8e8d: Show a more appropriate icon if there are no code smells and/or vulnerabilities. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-sonarqube-react@0.1.4 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-sonarqube-backend@0.1.8 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + +## @backstage/plugin-sonarqube-react@0.1.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 8ae65a0bc1d: Moved imports from `/alpha` to main public exports. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-splunk-on-call@0.4.5 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-stack-overflow@0.1.12 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 3ef5fb09ca5: Export api ref and StackOverflowApi type +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-search-react@1.5.1 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-home@0.4.32 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-stack-overflow-backend@0.1.12 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-tech-insights@0.3.8 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-insights-backend@0.5.9 + +### Patch Changes + +- f244b589163: Add DB index to improve latency of latest fact query +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.1 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.1 + +## @backstage/plugin-tech-insights-node@0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-radar@0.6.2 + +### Patch Changes + +- e14dcfa4994: Update colors to match Zalando's tech radar, also add coloring on title and legend to match ring color. +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.11 + +### Patch Changes + +- 2b00d8a225c: Fix bug/problem with test helper +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-search-react@1.5.1 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 37cf85fb85c: Fixed bug in IssueLink component where the URL was not generated properly when the repository was located inside a Gitlab subgroup +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-techdocs-react@1.1.4 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 8adfda60ae1: Updated dependency `jss` to `~10.10.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/version-bridge@1.0.3 + +## @backstage/plugin-todo@0.2.18 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-todo-backend@0.1.40 + +### Patch Changes + +- 4120513412a: todo-backend is now exposed as a plugin which uses the new plugin system +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.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/plugin-user-settings@0.7.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/core-app-api@1.6.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + +## @backstage/plugin-user-settings-backend@0.1.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## @backstage/plugin-vault@0.1.10 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-vault-backend@0.2.10 + +### Patch Changes + +- 66b3a3956b8: Ignore the `eslint` error +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + +## @backstage/plugin-xcmetrics@0.2.36 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## example-app@0.2.81 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-scaffolder-react@1.2.0 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-tech-insights@0.3.8 + - @backstage/plugin-search-react@1.5.1 + - @backstage/plugin-scaffolder@1.12.0 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/plugin-explore@0.4.1 + - @backstage/plugin-search@1.1.1 + - @backstage/cli@0.22.4 + - @backstage/plugin-kubernetes@0.7.9 + - @backstage/plugin-tech-radar@0.6.2 + - @backstage/plugin-microsoft-calendar@0.1.1 + - @backstage/plugin-newrelic-dashboard@0.2.9 + - @backstage/plugin-code-coverage@0.2.9 + - @backstage/plugin-azure-sites@0.1.5 + - @backstage/plugin-gcalendar@0.3.12 + - @backstage/plugin-shortcuts@0.3.8 + - @backstage/plugin-org@0.6.6 + - @backstage/plugin-api-docs@0.9.1 + - @backstage/plugin-stackstorm@0.1.0 + - @backstage/plugin-circleci@0.3.16 + - @backstage/plugin-playlist@0.1.7 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-cost-insights@0.12.5 + - @backstage/plugin-jenkins@0.7.15 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/plugin-airbrake@0.3.16 + - @backstage/plugin-apache-airflow@0.2.9 + - @backstage/plugin-azure-devops@0.2.7 + - @backstage/plugin-badges@0.2.40 + - @backstage/plugin-catalog-import@0.9.6 + - @backstage/plugin-cloudbuild@0.3.16 + - @backstage/plugin-dynatrace@3.0.0 + - @backstage/plugin-entity-feedback@0.1.1 + - @backstage/plugin-gcp-projects@0.3.35 + - @backstage/plugin-github-actions@0.5.16 + - @backstage/plugin-gocd@0.1.22 + - @backstage/plugin-graphiql@0.2.48 + - @backstage/plugin-home@0.4.32 + - @backstage/plugin-kafka@0.3.16 + - @backstage/plugin-lighthouse@0.4.1 + - @backstage/plugin-linguist@0.1.1 + - @backstage/plugin-newrelic@0.3.34 + - @backstage/plugin-pagerduty@0.5.9 + - @backstage/plugin-rollbar@0.4.16 + - @backstage/plugin-sentry@0.5.1 + - @backstage/plugin-stack-overflow@0.1.12 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.11 + - @backstage/plugin-todo@0.2.18 + - @backstage/plugin-user-settings@0.7.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @internal/plugin-catalog-customized@0.0.8 + - @backstage/plugin-catalog-graph@0.2.28 + - @backstage/app-defaults@1.2.1 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-search-common@1.2.2 + +## example-backend@0.2.81 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-todo-backend@0.1.40 + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.4 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/plugin-techdocs-backend@1.6.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/plugin-tech-insights-backend@0.5.9 + - @backstage/plugin-adr-backend@0.3.1 + - @backstage/plugin-auth-backend@0.18.1 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-linguist-backend@0.2.0 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-events-backend@0.2.4 + - @backstage/plugin-app-backend@0.3.43 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/plugin-azure-devops-backend@0.3.22 + - @backstage/plugin-azure-sites-backend@0.1.5 + - @backstage/plugin-code-coverage-backend@0.2.9 + - @backstage/plugin-entity-feedback-backend@0.1.1 + - @backstage/plugin-explore-backend@0.0.5 + - @backstage/plugin-graphql-backend@0.1.33 + - @backstage/plugin-jenkins-backend@0.1.33 + - @backstage/plugin-kubernetes-backend@0.9.4 + - @backstage/plugin-permission-backend@0.5.18 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-playlist-backend@0.2.6 + - @backstage/plugin-proxy-backend@0.2.37 + - @backstage/plugin-rollbar-backend@0.1.40 + - @backstage/plugin-lighthouse-backend@0.1.1 + - @backstage/config@1.0.7 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.11 + - @backstage/plugin-badges-backend@0.1.37 + - example-app@0.2.81 + - @backstage/plugin-search-backend@1.2.4 + - @backstage/plugin-kafka-backend@0.2.36 + - @backstage/plugin-search-backend-module-pg@0.5.4 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + - @backstage/plugin-tech-insights-node@0.4.1 + +## example-backend-next@0.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/plugin-todo-backend@0.1.40 + - @backstage/plugin-techdocs-backend@1.6.0 + - @backstage/backend-defaults@0.1.8 + - @backstage/plugin-app-backend@0.3.43 + +## e2e-test@0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.38 + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + +## techdocs-cli-embedded-app@0.2.80 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/cli@0.22.4 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/app-defaults@1.2.1 + +## @internal/plugin-catalog-customized@0.0.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/plugin-catalog-react@1.4.0 + +## @internal/plugin-todo-list@1.0.11 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @internal/plugin-todo-list-backend@1.0.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + +## @internal/plugin-todo-list-common@1.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 diff --git a/docs/releases/v1.12.0.md b/docs/releases/v1.12.0.md new file mode 100644 index 0000000000..789be8beca --- /dev/null +++ b/docs/releases/v1.12.0.md @@ -0,0 +1,62 @@ +--- +id: v1.12.0 +title: v1.12.0 +description: Backstage Release v1.12.0 +--- + +These are the release notes for the v1.12.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 + +This release mostly contains a bunch of smaller additions and bug fixes, but on top of that, there’s also some quality of life improvements and features as listed below. Enjoy! + +### Using `zod` for action definitions + +As a convenience, it is now possible to define your action inputs and outputs as `zod` schemas. This tends to be more convenient than writing JSON schema by hand, and gives you instant type feedback in your editor. + +Added by [@zcason](https://github.com/zcason) in [#15561](https://github.com/backstage/backstage/pull/15561) + +### Reading paginated data from the catalog + +The catalog has a new backend endpoint and corresponding client method, for fetching entities with proper cursor based pagination and server side filtering and ordering. This will be used to target performance hot-spots in the frontend and elsewhere. + +Added by [@vinzscam](https://github.com/vinzscam) in [#12246](https://github.com/backstage/backstage/pull/12246) + +### Renamed backend system related plugin exports + +As we settle the new backend system bit by bit, we have renamed a number of exports from individual plugins, to match the new [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). If you are already leveraging the new backend system, you may find that you need to update some imports. For example, `githubEntityProviderCatalogModule` was renamed to `catalogModuleGithubEntityProvider`. These were considered non-breaking since they are still in alpha. More details can be found in [#16760](https://github.com/backstage/backstage/pull/16760) and [#16764](https://github.com/backstage/backstage/pull/16764). + +### New plugin: `catalog-backend` `puppetdb` module + +Added a `catalogModulePuppetDbEntityProvider` alpha export for the new backend system. Contributed by [@tdabasinskas](https://github.com/tdabasinskas) in [#16184](https://github.com/backstage/backstage/pull/16184) + +### New plugin: Octopus deploy + +[Octopus](https://octopus.com) deployment plugin. Contributed by [@jmezach](https://github.com/jmezach) in [#16353](https://github.com/backstage/backstage/pull/16353) + +### New plugin: StackStorm + +Integration with [StackStorm](https://stackstorm.com). Contributed by [@pamelin](https://github.com/pamelin) in [#16152](https://github.com/backstage/backstage/pull/16152) + +## 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.12.0-changelog.md) +- Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) + +Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.13.0-next.0-changelog.md b/docs/releases/v1.13.0-next.0-changelog.md new file mode 100644 index 0000000000..3075d80f61 --- /dev/null +++ b/docs/releases/v1.13.0-next.0-changelog.md @@ -0,0 +1,2387 @@ +# Release v1.13.0-next.0 + +## @backstage/app-defaults@1.3.0-next.0 + +### Minor Changes + +- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/theme@0.2.18 + +## @backstage/core-app-api@1.7.0-next.0 + +### Minor Changes + +- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## @backstage/test-utils@1.3.0-next.0 + +### Minor Changes + +- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.4 + +## @backstage/plugin-catalog@1.10.0-next.0 + +### Minor Changes + +- 4dbf3d3e4da: Added a new EntitySwitch isResourceType to allow different views depending on Resource type +- fc6cab4eb48: Added `isEntityWith` condition helper for `EntitySwitch` case statements. + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-catalog-backend-module-gitlab@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 + +## @backstage/plugin-entity-feedback@0.2.0-next.0 + +### Minor Changes + +- 7eba760e6f6: Added an endpoint to fetch anonymous aggregated results from an entity + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-kubernetes-backend@0.10.0-next.0 + +### Minor Changes + +- 804f6d16b0c: **BREAKING**: `KubernetesBuilder.create` now requires a `permissions` field of type `PermissionEvaluator`. The kubernetes `/proxy` endpoint now requires two tokens: the `Backstage-Kubernetes-Authorization` header should contain a bearer token for the target cluster, and the `Authorization` header should contain a backstage identity token. The kubernetes `/proxy` endpoint now requires a `Backstage-Kubernetes-Cluster` header replacing the previously required `X-Kubernetes-Cluster` header. + +### Patch Changes + +- 75d4985f5e8: Fixes bug whereby backstage crashes when bad credentials are provided to the kubernetes plugin. +- 83d250badc6: Fix parsing error when kubernetes api is returning badly structured data. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/plugin-kubernetes-common@0.6.2-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + +## @backstage/plugin-scaffolder@1.13.0-next.0 + +### Minor Changes + +- cdab34fd9a2: scaffolder/next: removing the `routeRefs` and exporting the originals on `scaffolderPlugin.routes.x` instead +- e5ad1bd61ec: Allow `TemplateListPage` and `TemplateWizardPage` to be passed in as props +- 92cf86a4b5d: Added a `templateFilter` prop to the `` component to allow for filtering of templates through a function. +- 259d3407b9b: Move `CategoryPicker` from `scaffolder` into `scaffolder-react` + Move `ContextMenu` into `scaffolder-react` and rename it to `ScaffolderPageContextMenu` + +### Patch Changes + +- e27ddc36dad: Added a possibility to cancel the running task (executing of a scaffolder template) + +- 57c1b4752fa: Allow use of `{ exists: true }` value inside filters to filter entities that has that key. + + this example will filter all entities that has the annotation `someAnnotation` set to any value. + + ```yaml + ui:options: + catalogFilter: + kind: Group + metadata.annotations.someAnnotation: { exists: true } + ``` + +- 7a6b16cc506: `scaffolder/next`: Bump `@rjsf/*` deps to 5.3.1 + +- f84fc7fd040: Updated dependency `@rjsf/validator-ajv8` to `5.3.0`. + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.3.0-next.0 + - @backstage/plugin-scaffolder-common@1.2.7-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.1.0-next.0 + +### Minor Changes + +- 1ad400bb2de: Add Gitlab Scaffolder Plugin + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/errors@1.1.5 + +## @backstage/plugin-scaffolder-react@1.3.0-next.0 + +### Minor Changes + +- 259d3407b9b: Move `CategoryPicker` from `scaffolder` into `scaffolder-react` + Move `ContextMenu` into `scaffolder-react` and rename it to `ScaffolderPageContextMenu` +- 2cfd03d7376: To offer better customization options, `ScaffolderPageContextMenu` takes callbacks as props instead of booleans +- 48da4c46e45: `scaffolder/next`: Export the `TemplateGroupFilter` and `TemplateGroups` and make an extensible component + +### Patch Changes + +- e27ddc36dad: Added a possibility to cancel the running task (executing of a scaffolder template) +- 7a6b16cc506: `scaffolder/next`: Bump `@rjsf/*` deps to 5.3.1 +- f84fc7fd040: Updated dependency `@rjsf/validator-ajv8` to `5.3.0`. +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## @backstage/plugin-vault-backend@0.3.0-next.0 + +### Minor Changes + +- 5e959c9eb62: Allow generic Vault clients to be passed into the builder + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/errors@1.1.5 + +## @backstage/backend-app-api@0.4.2-next.0 + +### Patch Changes + +- 8cce2205a39: Register unhandled rejection and uncaught exception handlers to avoid backend crashes. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-node@0.7.7-next.0 + +## @backstage/backend-common@0.18.4-next.0 + +### Patch Changes + +- 420164593cf: Improve GitlabUrlReader to only load requested sub-path +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/integration-aws-node@0.1.2 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/backend-defaults@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/backend-plugin-api@0.5.1-next.0 + +## @backstage/backend-plugin-api@0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + +## @backstage/backend-tasks@0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/backend-test-utils@0.1.36-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + +## @backstage/cli@0.22.6-next.0 + +### Patch Changes + +- b9839d7135c: Fixed backend start command on Windows by removing the use of platform dependent path joins. +- c07c3b7364b: Add `onboard` command. While still in development, this command aims to guide users in setting up their Backstage App. +- Updated dependencies + - @backstage/eslint-plugin@0.1.3-next.0 + - @backstage/config@1.0.7 + - @backstage/release-manifests@0.0.9 + - @backstage/cli-common@0.1.12 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/core-components@0.12.6-next.0 + +### Patch Changes + +- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- 7245e744ab1: Fixed the font color on `BackstageHeaderLabel` to respect the active page theme. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/version-bridge@1.0.3 + +## @backstage/create-app@0.4.39-next.0 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## @backstage/dev-utils@1.0.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/app-defaults@1.3.0-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/test-utils@1.3.0-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/eslint-plugin@0.1.3-next.0 + +### Patch Changes + +- 911c25de59c: Add support for auto-fixing missing imports detected by the `no-undeclared-imports` rule. + +## @backstage/integration-react@1.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/repo-tools@0.1.4-next.0 + +### Patch Changes + +- 9129ca8cabb: Log API report instructions when api-report is missing. +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.1.5 + +## @techdocs/cli@1.4.1-next.0 + +### Patch Changes + +- b348420a804: Adding global-agent to enable the ability to publish through a proxy +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/cli-common@0.1.12 + - @backstage/plugin-techdocs-node@1.6.1-next.0 + +## @backstage/plugin-adr@0.4.2-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-adr-backend@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-airbrake@0.3.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/test-utils@1.3.0-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/dev-utils@1.0.14-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-airbrake-backend@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-allure@0.1.33-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-analytics-module-ga@0.1.28-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-apache-airflow@0.2.10-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + +## @backstage/plugin-api-docs@0.9.2-next.0 + +### Patch Changes + +- ca50c3bbea1: Corrected styling of nested objects in AsyncAPI to avoid inappropriate uppercase text transformation of nested objects. +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-catalog@1.10.0-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-apollo-explorer@0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-app-backend@0.3.44-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/config-loader@1.1.9 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-backend@0.18.2-next.0 + +### Patch Changes + +- d8f774c30df: Enforce the secret visibility of certificates and client secrets in the auth backend. Also, document all known options for each auth plugin. +- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + +## @backstage/plugin-auth-node@0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-azure-devops@0.2.8-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-devops-backend@0.3.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-sites@0.1.6-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-azure-sites-backend@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-badges@0.2.41-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-badges-backend@0.1.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-bazaar@0.2.7-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-catalog@1.10.0-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/cli@0.22.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-bazaar-backend@0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + +## @backstage/plugin-bitrise@0.1.44-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-catalog-backend@1.8.1-next.0 + +### Patch Changes + +- c9a0fdcd2c8: Fix deprecated types. +- 899ebfd8e02: Add full text search support to the `by-query` endpoint. +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.0 + - @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/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-catalog-backend-module-aws@0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/plugin-kubernetes-common@0.6.2-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-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.1.15-next.0 + +### Patch Changes + +- 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 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.11-next.0 + +### Patch Changes + +- 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-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.9-next.0 + +### Patch Changes + +- 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/plugin-catalog-node@1.3.5-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.12-next.0 + +### Patch Changes + +- 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/plugin-catalog-node@1.3.5-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @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-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + - @backstage/plugin-permission-common@0.7.4 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.11-next.0 + +### Patch Changes + +- c9a0fdcd2c8: Fix deprecated types. +- Updated dependencies + - @backstage/config@1.0.7 + - @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-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.3-next.0 + +### Patch Changes + +- c9a0fdcd2c8: Fix deprecated types. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.10-next.0 + +### Patch Changes + +- c9a0fdcd2c8: Fix deprecated types. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @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 + +## @backstage/plugin-catalog-graph@0.2.29-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-catalog-graphql@0.3.20-next.0 + +### Patch Changes + +- e47e69eadf0: Updated dependency `@apollo/server` to `^4.0.0`. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-import@0.9.7-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-common@1.0.12 + +## @backstage/plugin-catalog-node@1.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + +## @backstage/plugin-catalog-react@1.4.1-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + +## @backstage/plugin-cicd-statistics@0.1.19-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cicd-statistics@0.1.19-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-circleci@0.3.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-cloudbuild@0.3.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-code-climate@0.1.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-code-coverage@0.2.10-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-code-coverage-backend@0.2.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-codescene@0.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-config-schema@0.1.40-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + +## @backstage/plugin-cost-insights@0.12.6-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-cost-insights-common@0.1.1 + +## @backstage/plugin-dynatrace@3.0.1-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-entity-feedback-backend@0.1.2-next.0 + +### Patch Changes + +- 7eba760e6f6: Added an endpoint to fetch anonymous aggregated results from an entity +- Updated dependencies + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-auth-node@0.2.13-next.0 + +## @backstage/plugin-entity-feedback-common@0.1.1-next.0 + +### Patch Changes + +- 7eba760e6f6: Added an endpoint to fetch anonymous aggregated results from an entity + +## @backstage/plugin-entity-validation@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-catalog-common@1.0.12 + +## @backstage/plugin-events-backend@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## @backstage/plugin-events-backend-module-aws-sqs@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-events-node@0.2.5-next.0 + +## @backstage/plugin-events-backend-module-azure@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## @backstage/plugin-events-backend-module-gerrit@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## @backstage/plugin-events-backend-module-github@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## @backstage/plugin-events-backend-module-gitlab@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## @backstage/plugin-events-backend-test-utils@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.5-next.0 + +## @backstage/plugin-events-node@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.0 + +## @backstage/plugin-explore@0.4.2-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-explore-react@0.0.27 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-explore-backend@0.0.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-firehydrant@0.2.1-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-fossa@0.2.49-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gcalendar@0.3.13-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gcp-projects@0.3.36-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-git-release-manager@0.3.30-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-actions@0.5.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-deployments@0.1.48-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-issues@0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-pull-requests-board@0.1.11-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gitops-profiles@0.3.35-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gocd@0.1.23-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-graphiql@0.2.49-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-graphql-backend@0.1.34-next.0 + +### Patch Changes + +- e47e69eadf0: Updated dependency `@apollo/server` to `^4.0.0`. +- Updated dependencies + - @backstage/plugin-catalog-graphql@0.3.20-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-graphql-voyager@0.1.2-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-home@0.4.33-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-ilert@0.2.6-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-jenkins@0.7.16-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-jenkins-common@0.1.14 + +## @backstage/plugin-jenkins-backend@0.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-jenkins-common@0.1.14 + - @backstage/plugin-permission-common@0.7.4 + +## @backstage/plugin-kafka@0.3.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-kafka-backend@0.2.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-kubernetes@0.7.10-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/plugin-kubernetes-common@0.6.2-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-kubernetes-common@0.6.2-next.0 + +### Patch Changes + +- 804f6d16b0c: Introduced proxy permission types to be used with the kubernetes proxy endpoint's permission framework integration. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-permission-common@0.7.4 + +## @backstage/plugin-lighthouse@0.4.2-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-lighthouse-backend@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-linguist@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-linguist-backend@0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-microsoft-calendar@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-newrelic@0.3.35-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-newrelic-dashboard@0.2.10-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-octopus-deploy@0.1.1-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-org@0.6.7-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-org-react@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-pagerduty@0.5.10-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-periskop@0.1.15-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-periskop-backend@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + +## @backstage/plugin-permission-backend@0.5.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + +## @backstage/plugin-permission-node@0.7.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + +## @backstage/plugin-playlist@0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-playlist-common@0.1.5 + +## @backstage/plugin-playlist-backend@0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + - @backstage/plugin-playlist-common@0.1.5 + +## @backstage/plugin-proxy-backend@0.2.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + +## @backstage/plugin-rollbar@0.4.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-rollbar-backend@0.1.41-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-scaffolder-backend@1.12.1-next.0 + +### Patch Changes + +- e23abb37ec1: Rename output parameter `mergeRequestURL` of `publish:gitlab:merge-request` action to `mergeRequestUrl`. +- e27ddc36dad: Added a possibility to cancel the running task (executing of a scaffolder template) +- c9a0fdcd2c8: Fix deprecated types. +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/plugin-scaffolder-common@1.2.7-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @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-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.1-next.0 + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.1-next.0 + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-common@1.2.7-next.0 + +### Patch Changes + +- 48da4c46e45: Export `typeguard` for `isTemplateEntityV1beta3` +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-node@0.1.2-next.0 + +### Patch Changes + +- e27ddc36dad: Added a possibility to cancel the running task (executing of a scaffolder template) +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.0 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## @backstage/plugin-search@1.1.2-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend@1.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + - @backstage/plugin-search-backend-node@1.1.5-next.0 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend-module-elasticsearch@1.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.5-next.0 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend-module-pg@0.5.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.5-next.0 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend-node@1.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-react@1.5.2-next.0 + +### Patch Changes + +- b2e182cdfa4: Fixes a UI bug in search result item which rendered the item text with incorrect font size and color +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-sentry@0.5.2-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-shortcuts@0.3.9-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- 99df676e324: Allow external links to be added as shortcuts +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + +## @backstage/plugin-sonarqube@0.6.6-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-sonarqube-react@0.1.4 + +## @backstage/plugin-sonarqube-backend@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-splunk-on-call@0.4.6-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-stack-overflow@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-home@0.4.33-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-stack-overflow-backend@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-stackstorm@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-tech-insights@0.3.9-next.0 + +### Patch Changes + +- f538b9c5b83: The `Check` type now optionally includes the `failureMetadata` and `successMetadata` as returned by the `runChecks` call. +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-insights-backend@0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.0 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.0 + +## @backstage/plugin-tech-insights-node@0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-radar@0.6.3-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-techdocs@1.6.1-next.0 + +### Patch Changes + +- b2e182cdfa4: Fixes a UI bug in search result item which rendered the item text with incorrect font size and color +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.12-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-catalog@1.10.0-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/test-utils@1.3.0-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-techdocs@1.6.1-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-techdocs-backend@1.6.1-next.0 + +### Patch Changes + +- 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/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-search-common@1.2.2 + - @backstage/plugin-techdocs-node@1.6.1-next.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-techdocs-node@1.6.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/integration-aws-node@0.1.2 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-techdocs-react@1.1.5-next.0 + +### Patch Changes + +- 7e0c7b09a47: Fix a bug that caused the header to not render when generating a document for the first time +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/version-bridge@1.0.3 + +## @backstage/plugin-todo@0.2.19-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-todo-backend@0.1.41-next.0 + +### Patch Changes + +- 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/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## @backstage/plugin-user-settings@0.7.2-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + +## @backstage/plugin-user-settings-backend@0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + +## @backstage/plugin-vault@0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## @backstage/plugin-xcmetrics@0.2.37-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## example-app@0.2.82-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.9.2-next.0 + - @backstage/plugin-scaffolder@1.13.0-next.0 + - @backstage/plugin-scaffolder-react@1.3.0-next.0 + - @backstage/plugin-entity-feedback@0.2.0-next.0 + - @backstage/plugin-tech-insights@0.3.9-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/app-defaults@1.3.0-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-techdocs@1.6.1-next.0 + - @backstage/cli@0.22.6-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.10-next.0 + - @backstage/plugin-apache-airflow@0.2.10-next.0 + - @backstage/plugin-catalog-import@0.9.7-next.0 + - @backstage/plugin-github-actions@0.5.17-next.0 + - @backstage/plugin-catalog-graph@0.2.29-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/plugin-code-coverage@0.2.10-next.0 + - @backstage/plugin-cost-insights@0.12.6-next.0 + - @backstage/plugin-user-settings@0.7.2-next.0 + - @backstage/plugin-azure-devops@0.2.8-next.0 + - @backstage/plugin-gcp-projects@0.3.36-next.0 + - @backstage/plugin-azure-sites@0.1.6-next.0 + - @backstage/plugin-cloudbuild@0.3.17-next.0 + - @backstage/plugin-kubernetes@0.7.10-next.0 + - @backstage/plugin-lighthouse@0.4.2-next.0 + - @backstage/plugin-tech-radar@0.6.3-next.0 + - @backstage/plugin-dynatrace@3.0.1-next.0 + - @backstage/plugin-gcalendar@0.3.13-next.0 + - @backstage/plugin-pagerduty@0.5.10-next.0 + - @backstage/plugin-shortcuts@0.3.9-next.0 + - @backstage/plugin-airbrake@0.3.17-next.0 + - @backstage/plugin-circleci@0.3.17-next.0 + - @backstage/plugin-graphiql@0.2.49-next.0 + - @backstage/plugin-newrelic@0.3.35-next.0 + - @backstage/plugin-explore@0.4.2-next.0 + - @backstage/plugin-jenkins@0.7.16-next.0 + - @backstage/plugin-rollbar@0.4.17-next.0 + - @backstage/plugin-badges@0.2.41-next.0 + - @backstage/plugin-search@1.1.2-next.0 + - @backstage/plugin-sentry@0.5.2-next.0 + - @backstage/plugin-kafka@0.3.17-next.0 + - @backstage/plugin-gocd@0.1.23-next.0 + - @backstage/plugin-home@0.4.33-next.0 + - @backstage/plugin-todo@0.2.19-next.0 + - @backstage/plugin-org@0.6.7-next.0 + - @internal/plugin-catalog-customized@0.0.9-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/plugin-linguist@0.1.2-next.0 + - @backstage/plugin-microsoft-calendar@0.1.2-next.0 + - @backstage/plugin-playlist@0.1.8-next.0 + - @backstage/plugin-stack-overflow@0.1.13-next.0 + - @backstage/plugin-stackstorm@0.1.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-search-common@1.2.2 + +## example-backend@0.2.82-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.1-next.0 + - @backstage/plugin-kubernetes-backend@0.10.0-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.2-next.0 + - @backstage/plugin-auth-backend@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @backstage/plugin-graphql-backend@0.1.34-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.0 + - example-app@0.2.82-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-adr-backend@0.3.2-next.0 + - @backstage/plugin-app-backend@0.3.44-next.0 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-azure-devops-backend@0.3.23-next.0 + - @backstage/plugin-azure-sites-backend@0.1.6-next.0 + - @backstage/plugin-badges-backend@0.1.38-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.0 + - @backstage/plugin-code-coverage-backend@0.2.10-next.0 + - @backstage/plugin-events-backend@0.2.5-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + - @backstage/plugin-explore-backend@0.0.6-next.0 + - @backstage/plugin-jenkins-backend@0.1.34-next.0 + - @backstage/plugin-kafka-backend@0.2.37-next.0 + - @backstage/plugin-lighthouse-backend@0.1.2-next.0 + - @backstage/plugin-linguist-backend@0.2.1-next.0 + - @backstage/plugin-permission-backend@0.5.19-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + - @backstage/plugin-playlist-backend@0.2.7-next.0 + - @backstage/plugin-proxy-backend@0.2.38-next.0 + - @backstage/plugin-rollbar-backend@0.1.41-next.0 + - @backstage/plugin-search-backend@1.2.5-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.5-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.5-next.0 + - @backstage/plugin-search-backend-node@1.1.5-next.0 + - @backstage/plugin-search-common@1.2.2 + - @backstage/plugin-tech-insights-backend@0.5.10-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.0 + - @backstage/plugin-tech-insights-node@0.4.2-next.0 + - @backstage/plugin-techdocs-backend@1.6.1-next.0 + - @backstage/plugin-todo-backend@0.1.41-next.0 + +## example-backend-next@0.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.1-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @backstage/backend-defaults@0.1.9-next.0 + - @backstage/plugin-app-backend@0.3.44-next.0 + - @backstage/plugin-techdocs-backend@1.6.1-next.0 + - @backstage/plugin-todo-backend@0.1.41-next.0 + +## e2e-test@0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.39-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.1.5 + +## techdocs-cli-embedded-app@0.2.81-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.10.0-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/app-defaults@1.3.0-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/test-utils@1.3.0-next.0 + - @backstage/plugin-techdocs@1.6.1-next.0 + - @backstage/cli@0.22.6-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @internal/plugin-catalog-customized@0.0.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.10.0-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + +## @internal/plugin-todo-list@1.0.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @internal/plugin-todo-list-backend@1.0.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 diff --git a/microsite/.prettierignore b/microsite/.prettierignore index b52c4a85c3..65d3600479 100644 --- a/microsite/.prettierignore +++ b/microsite/.prettierignore @@ -1 +1,2 @@ +build .docusaurus diff --git a/microsite/README.md b/microsite/README.md index 723baa1a54..26c25dc175 100644 --- a/microsite/README.md +++ b/microsite/README.md @@ -1,6 +1,6 @@ # Backstage Documentation -This folder holds the service and configuration that runs Backstage's documentation hosted at https://backstage.io. +This folder holds the service and configuration that runs Backstage's documentation hosted at . It pulls content in from the [root `/docs`](../docs/) folder and builds it into the resulting HTML web site. @@ -20,13 +20,13 @@ Testing the web site locally is a great way to see what final website will look ## Installation -``` +```bash $ yarn install ``` ## Local Development -``` +```bash $ yarn start ``` @@ -34,7 +34,7 @@ This command starts a local development server and opens up a browser window. Mo ## Build -``` +```bash $ yarn build ``` @@ -107,30 +107,30 @@ For more information about blog posts, click [here](https://docusaurus.io/docs/e 1. Create the doc as a new markdown file in `/docs`, example `docs/newly-created-doc.md`: -```md ---- -id: newly-created-doc -title: This Doc Needs To Be Edited ---- + ```md + --- + id: newly-created-doc + title: This Doc Needs To Be Edited + --- -My new content here.. -``` + My new content here.. + ``` -1. Refer to that doc's ID in an existing sidebar in `website/sidebars.json`: +2. Refer to that doc's ID in an existing sidebar in `website/sidebars.json`: -```javascript -// Add newly-created-doc to the Getting Started category of docs -{ - "docs": { - "Getting Started": [ - "quick-start", - "newly-created-doc" // new doc here - ], - ... - }, - ... -} -``` + ```javascript + // Add newly-created-doc to the Getting Started category of docs + { + "docs": { + "Getting Started": [ + "quick-start", + "newly-created-doc" // new doc here + ], + ... + }, + ... + } + ``` For more information about adding new docs, click [here](https://docusaurus.io/docs/en/navigation) @@ -138,30 +138,30 @@ For more information about adding new docs, click [here](https://docusaurus.io/d 1. Make sure there is a header link to your blog in `website/siteConfig.js`: -`website/siteConfig.js` + `website/siteConfig.js` -```javascript -headerLinks: [ - ... - { blog: true, label: 'Blog' }, - ... -] -``` + ```javascript + headerLinks: [ + ... + { blog: true, label: 'Blog' }, + ... + ] + ``` 2. Create the blog post with the format `YYYY-MM-DD-My-Blog-Post-Title.md` in `website/blog`: -`website/blog/2018-05-21-New-Blog-Post.md` + `website/blog/2018-05-21-New-Blog-Post.md` -```markdown ---- -author: Frank Li -authorURL: https://twitter.com/foobarbaz -authorFBID: 503283835 -title: New Blog Post ---- + ```markdown + --- + author: Frank Li + authorURL: https://twitter.com/foobarbaz + authorFBID: 503283835 + title: New Blog Post + --- -Lorem Ipsum... -``` + Lorem Ipsum... + ``` For more information about blog posts, click [here](https://docusaurus.io/docs/en/adding-blog) @@ -169,43 +169,44 @@ For more information about blog posts, click [here](https://docusaurus.io/docs/e 1. Add links to docs, custom pages or external links by editing the `headerLinks` field of `website/siteConfig.js`: -`website/siteConfig.js` + `website/siteConfig.js` -```javascript -{ - headerLinks: [ - ... - /* you can add docs */ - { doc: 'my-examples', label: 'Examples' }, - /* you can add custom pages */ - { page: 'help', label: 'Help' }, - /* you can add external links */ - { href: 'https://github.com/facebook/docusaurus', label: 'GitHub' }, - ... - ], - ... -} -``` + ```javascript + { + headerLinks: [ + ... + /* you can add docs */ + { doc: 'my-examples', label: 'Examples' }, + /* you can add custom pages */ + { page: 'help', label: 'Help' }, + /* you can add external links */ + { href: 'https://github.com/facebook/docusaurus', label: 'GitHub' }, + ... + ], + ... + } + ``` For more information about the navigation bar, click [here](https://docusaurus.io/docs/en/navigation) ### Adding custom pages 1. Docusaurus uses React components to build pages. The components are saved as .js files in `website/pages/en`: -1. If you want your page to show up in your navigation header, you will need to update `website/siteConfig.js` to add to the `headerLinks` element: -`website/siteConfig.js` +2. If you want your page to show up in your navigation header, you will need to update `website/siteConfig.js` to add to the `headerLinks` element: -```javascript -{ - headerLinks: [ - ... - { page: 'my-new-custom-page', label: 'My New Custom Page' }, - ... - ], - ... -} -``` + `website/siteConfig.js` + + ```javascript + { + headerLinks: [ + ... + { page: 'my-new-custom-page', label: 'My New Custom Page' }, + ... + ], + ... + } + ``` Learn more about [Docusaurus custom pages](https://docusaurus.io/docs/en/custom-pages). @@ -216,4 +217,19 @@ Full documentation can be found on the [Docusaurus website](https://docusaurus.i ## Additional notes - If you want to make images zoomable on click, add the `data-zoomable` attribute to your `img` element. + - In a docs or blog `.md` file, convert `![This is image](/microsite/static/img/code.png)` syntax to `This is image` + +- Code block line highlighting uses [custom magic comments](https://docusaurus.io/docs/markdown-features/code-blocks#custom-magic-comments). Currently, we have the following magic comments: + - Highlight line(s) + - `highlight-next-line` + - `highlight-start` + - `highlight-end` + - Add line(s) + - `highlight-add-next-line` + - `highlight-add-start` + - `highlight-add-end` + - Remove line(s) + - `highlight-remove-next-line` + - `highlight-remove-start` + - `highlight-remove-end` diff --git a/microsite/blog/2023-03-15-backstage-turns-3.md b/microsite/blog/2023-03-15-backstage-turns-3.md new file mode 100644 index 0000000000..317cdc0c4d --- /dev/null +++ b/microsite/blog/2023-03-15-backstage-turns-3.md @@ -0,0 +1,84 @@ +--- +title: Backstage Turns Three! +author: Ben Lambert +authorURL: https://github.com/benjdlambert +authorImageURL: https://avatars.githubusercontent.com/u/3645856?v=4 +--- + +![backstage turns 3 header image](assets/2023-03-15/birthday.gif) + +**TL;DR** Spotify released Backstage into open source three years ago today. Since then, the community has grown by leaps and bounds to stretch across the globe (and the Discord server!). Now that Backstage is a threenager, the growing pains are real. So, on this birthday, we want to cover our collective efforts to make it easier to adopt and contribute to Backstage. + + + +## They grow up so fast, don’t they? + +Happy birthday, Backstage! Three years ago, Spotify released its homegrown developer portal into the wild after a small team collaborated on an internal Hack Week project. We’d had a lot of conversations with companies looking to build out something similar to what we’d been running for years, so our Hack Week sprint started as an experiment to see if the Backstage core plugins could be valuable in open source. + +It's cliché at this point — because we’ve said it a million times — but no one could have predicted what came next. + +In three short years, Backstage has grown to a Cloud Native Computing Foundation Incubating project, with more than 900 adopters and 1000+ contributors worldwide. Companies like CVS Health, Siemens, LinkedIn, REI, Vodafone, and Lego are building out their own developer portals from the Backstage framework and bringing their learnings to the project. + +A few more stats we love to see (mainly coming from the [project repo](https://github.com/backstage/backstage)): + +- 3k+ project forks +- 38k+ commits +- 12k+ PRs +- 15k+ total contributions +- 21k+ stars on GitHub +- 9k+ Discord members +- 100+ open source plugins in the [plugin marketplace](https://backstage.io/plugins) + +But, without a doubt, the best thing about the Backstage project is the people in this community. People who are curious, collaborative, and excited to share knowledge. People who’ll sift through Discord at all hours to answer questions and support one another. People who come from all over the world but share a common trait: being passionate about enabling developers to do their best work. + +Don’t take our word for it! Take a look at this birthday video we put together with a few community members. + +
+ +
+ +## The growing pains are real + +But it's not all sunshine and roses in Backstage-land. If Year 1 was about getting this community going and Year 2 was focused on maturing the platform, then Year 3 needs to address some of the inevitable growing pains a project undergoes as it gains ground. + +We hear two things pretty consistently from the community: + +- **Backstage is a steep learning curve:** Over the past three years, the project has grown in scope and breadth which can translate to complexity. This is especially true for newcomers looking to get their arms wrapped around the key concepts. +- **Backstage has barriers to adoption:** Backstage adopters tell us driving widespread adoption of their developer portal remains the biggest challenge they face. Adoption barriers can be technical but are often cultural. + +The maintainers and some of our most involved community members are actively tackling how we can make the Backstage onboarding process easier for contributors. There are also lots of ways the project could better support adopters on that journey and make adoption faster and smoother. + +We’re looking at everything from cleaning up documentation to opinionated catalog ingestors being discussed in both the Catalog and Adoption monthly SIGs (running meeting notes [here](https://docs.google.com/document/d/1xg57CDfX2R5jTGbbWANzifm2szEb664kuTwfEEvKgZU/) and [here](https://docs.google.com/document/d/1zeYSzXYgh897bxPQmwy2btOwCFlEjlUDLf00riySLRc)). A few priorities that we’ve already mapped out: + +- Make it easier to install, customize, and maintain Backstage +- Provide Golden Paths for adoption +- Improve the experience and the content on [backstage.io](https://backstage.io/docs/overview/what-is-backstage) + +Because there are now so many mature adopters — Spotify included — there’s so much knowledge on how to create a roadmap for adoption and use cases, how to roll out your developer portal to your teams and drive inner source contributions, how to measure and attribute developer productivity gains, etc. + +Our goal is to tap into the knowledge those adopters have gained and create more tangible resources for the entire community. But we can’t do it without help. And that’s where you come in! + +## Getting (more) involved + +We’re very grateful for the Backstage ride-or-dies: the contributors who show up to every community session, attend every SIG, and are always ready to jump in on any PR or issue. + +But one of the areas where we think the project could greatly improve (and better address some of the growing pains I mentioned above!) is more active contribution — both the total number of people contributing and what they’re contributing. + +We’ve already shared a bit on this but the maintainer team is starting to address this challenge by proposing the following three initiatives: + +- Introduce more steps in between first-time contributor and maintainer in the form of a contributor ladder (loosely based on the [CNCF Project Template](https://github.com/cncf/project-template/blob/main/CONTRIBUTOR_LADDER.md)). +- Change the ownership model, for example, divide the project up into several project areas, each covering particular parts of the project. +- Introduce a new process for large contributions in the form of Backstage Enhancement Proposals (BEPs). + +These two RFCs on [Updated Backstage Governance](https://github.com/backstage/backstage/issues/15317) and [Backstage Enhancement Proposals](https://github.com/backstage/backstage/issues/15318) remain open so feel free to read and join the discussion! Watch this space as we’ll share more on the go-forward governance and BEPs plan soon. + +But if you’re brand-new and just looking to get your feet wet, we’ve also [compiled some small steps](https://backstage.io/docs/getting-started/getting-involved/) you can take to get involved: + +- Report (or squash) bugs: Look through the GitHub issues for [bugs](https://github.com/backstage/backstage/labels/bug), [good first issues](https://github.com/backstage/backstage/labels/good%20first%20issue) or [help wanted](https://github.com/backstage/backstage/labels/help%20wanted) +- Build or suggest a plugin: The Backstage project grows with every new plugin that gets added +- Add non-code contributions: We welcome things that help the community at large, but may not fit into the scope of the core project +- Write documentation or improve the website: The current documentation and project site are pretty limited. Better content helps a lot of those growing pains. +- Contribute to Storybook: Help us [create new components](https://github.com/backstage/backstage/labels/help%20wanted) or improve stories for the existing ones +- Submit feedback: The best way to send feedback is to file [an issue](https://github.com/backstage/backstage/issues) with as much detail as possible +- Add your company to ADOPTERS: Adding your company to [ADOPTERS](https://github.com/backstage/backstage/blob/master/ADOPTERS.md) really helps the project, you can do this by filling out this [adopter form](https://form.typeform.com/to/zcOaKikB) diff --git a/microsite/blog/assets/2023-03-15/birthday.gif b/microsite/blog/assets/2023-03-15/birthday.gif new file mode 100644 index 0000000000..0c489bc536 Binary files /dev/null and b/microsite/blog/assets/2023-03-15/birthday.gif differ diff --git a/microsite/data/plugins/backstage-analytics-module-ga.yaml b/microsite/data/plugins/analytics-module-ga.yaml similarity index 100% rename from microsite/data/plugins/backstage-analytics-module-ga.yaml rename to microsite/data/plugins/analytics-module-ga.yaml diff --git a/microsite/data/plugins/backstage-plugin-api-linter.yaml b/microsite/data/plugins/api-linter.yaml similarity index 91% rename from microsite/data/plugins/backstage-plugin-api-linter.yaml rename to microsite/data/plugins/api-linter.yaml index ae2a451ea7..a68da228eb 100644 --- a/microsite/data/plugins/backstage-plugin-api-linter.yaml +++ b/microsite/data/plugins/api-linter.yaml @@ -1,5 +1,5 @@ --- -title: backstage-plugin-api-linter +title: API Linter author: Zalando authorUrl: https://github.com/zalando category: Linting diff --git a/microsite/data/plugins/aws-codeservices.yaml b/microsite/data/plugins/aws-codeservices.yaml new file mode 100644 index 0000000000..34fa335923 --- /dev/null +++ b/microsite/data/plugins/aws-codeservices.yaml @@ -0,0 +1,10 @@ +--- +title: AWS Code Services +author: Amazon Web Services +authorUrl: https://aws.amazon.com/ +category: CI/CD +description: View resources related to AWS CodePipeline, AWS CodeBuild and AWS CodeDeploy for your components in Backstage. +documentation: https://github.com/awslabs/aws-codeservices-plugins-for-backstage#readme +iconUrl: https://github.com/awslabs/aws-codeservices-plugins-for-backstage/blob/main/docs/images/codepipeline-logo.png?raw=true +npmPackageName: '@aws/aws-codeservices-plugin-for-backstage' +addedDate: '2023-01-17' diff --git a/microsite/data/plugins/aws-codesuite.yaml b/microsite/data/plugins/aws-codesuite.yaml deleted file mode 100644 index d1fd039b9b..0000000000 --- a/microsite/data/plugins/aws-codesuite.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: AWS CodeSuite -author: Amazon Web Services -authorUrl: https://aws.amazon.com/ -category: CI/CD -description: View resources related to AWS CodePipeline, AWS CodeBuild and AWS CodeDeploy for your components in Backstage. -documentation: https://github.com/awslabs/aws-codesuite-plugins-for-backstage#readme -iconUrl: https://github.com/awslabs/aws-codesuite-plugins-for-backstage/blob/main/docs/images/codepipeline-logo.png?raw=true -npmPackageName: '@aws/aws-codesuite-plugin-for-backstage' -addedDate: '2023-01-17' diff --git a/microsite/data/plugins/cloudsmith.yaml b/microsite/data/plugins/cloudsmith.yaml index 650f0b253c..4a07318a67 100644 --- a/microsite/data/plugins/cloudsmith.yaml +++ b/microsite/data/plugins/cloudsmith.yaml @@ -1,6 +1,6 @@ --- title: Cloudsmith -author: Roadie +author: roadie.io authorUrl: https://roadie.io category: CI/CD description: Show Cloudsmith Repository stats, Quota, Audit logs and Security scans for specific repositories. diff --git a/microsite/data/plugins/github-pull-requests-board.yaml b/microsite/data/plugins/github-pull-requests-board.yaml index 09776eb468..9fe2570f91 100644 --- a/microsite/data/plugins/github-pull-requests-board.yaml +++ b/microsite/data/plugins/github-pull-requests-board.yaml @@ -1,5 +1,5 @@ --- -title: Github Pull Requests Board +title: GitHub Pull Requests Board author: DAZN authorUrl: https://engineering.dazn.com category: Source Control Mgmt diff --git a/microsite/data/plugins/backstage-plugin-ldap-auth.yml b/microsite/data/plugins/ldap-auth.yml similarity index 100% rename from microsite/data/plugins/backstage-plugin-ldap-auth.yml rename to microsite/data/plugins/ldap-auth.yml diff --git a/microsite/data/plugins/microsoft-calendar.yaml b/microsite/data/plugins/microsoft-calendar.yaml new file mode 100644 index 0000000000..183c991761 --- /dev/null +++ b/microsite/data/plugins/microsoft-calendar.yaml @@ -0,0 +1,15 @@ +title: Microsoft Calendar +author: StatusNeo +authorUrl: https://statusneo.com/ +category: Productivity +description: | + The plugin integrates with your Microsoft Calendar. + It displays all your calendars and events in it. +documentation: https://github.com/backstage/backstage/tree/master/plugins/microsoft-calendar +iconUrl: /img/outlook-statusneo.png +npmPackageName: '@backstage/plugin-microsoft-calendar' +tags: + - Microsoft + - calendar + - Management +addedDate: '2023-03-15' diff --git a/microsite/data/plugins/scaffolder-backend-roadie-aws.yaml b/microsite/data/plugins/scaffolder-backend-roadie-aws.yaml index e8e67dbdad..65808b9af2 100644 --- a/microsite/data/plugins/scaffolder-backend-roadie-aws.yaml +++ b/microsite/data/plugins/scaffolder-backend-roadie-aws.yaml @@ -1,9 +1,9 @@ --- -title: Scaffolder AWS cli actions +title: Scaffolder AWS CLI actions author: roadie.io authorUrl: https://roadie.io/?utm_source=backstage.io&utm_medium=marketplace&utm_campaign=scaffolder-aws category: Scaffolder -description: Here you can find some AWS cli actions +description: Scaffolder actions you can trigger for Amazon Web Services. documentation: https://github.com/RoadieHQ/roadie-backstage-plugins/blob/main/plugins/scaffolder-actions/scaffolder-backend-module-aws/README.md iconUrl: https://upload.wikimedia.org/wikipedia/commons/9/93/Amazon_Web_Services_Logo.svg npmPackageName: '@roadiehq/scaffolder-backend-module-aws' diff --git a/microsite/data/plugins/statusneo-github-plugin.yaml b/microsite/data/plugins/statusneo-github-plugin.yaml new file mode 100644 index 0000000000..9c56dd4ae4 --- /dev/null +++ b/microsite/data/plugins/statusneo-github-plugin.yaml @@ -0,0 +1,13 @@ +title: Statusneo GitHub Plugin +author: Statusneo +authorUrl: https://statusneo.com/ +category: GitHub +description: Provides status cards GitHub pull requests and GitHub actions. +documentation: https://github.com/StatusNeo/backstage-plugin-github +iconUrl: /img/github-statusneo.png +npmPackageName: '@statusneo/backstage-plugin-github' +tags: + - GitHub + - Monitoring + - Productivity +addedDate: '2023-02-15' diff --git a/microsite/data/plugins/vault.yaml b/microsite/data/plugins/vault.yaml index 29e20417d8..37d474371b 100644 --- a/microsite/data/plugins/vault.yaml +++ b/microsite/data/plugins/vault.yaml @@ -2,7 +2,7 @@ title: Vault author: Spread Group authorUrl: https://github.com/ivangonzalezacuna -category: Vault +category: Security description: Visualize a list of the secrets stored in your HashiCorp Vault instance. documentation: https://github.com/backstage/backstage/tree/master/plugins/vault iconUrl: /img/vault.png diff --git a/microsite/docusaurus.config.js b/microsite/docusaurus.config.js index 025c773a9c..549974a168 100644 --- a/microsite/docusaurus.config.js +++ b/microsite/docusaurus.config.js @@ -16,6 +16,11 @@ // @ts-check +/** @type{import('prism-react-renderer').PrismTheme} **/ +// @ts-ignore +const prismTheme = require('prism-react-renderer/themes/vsDark'); +prismTheme.plain.backgroundColor = '#232323'; + /** @type {import('@docusaurus/types').Config} */ module.exports = { title: 'Backstage Software Catalog and Developer Platform', @@ -55,7 +60,7 @@ module.exports = { path: 'blog', }, theme: { - customCss: 'src/css/customTheme.css', + customCss: 'src/theme/customTheme.scss', }, gtag: { trackingID: 'G-KSEVGGNCJW', @@ -158,7 +163,7 @@ module.exports = { position: 'left', }, { - to: 'docs/releases/v1.11.0', + to: 'docs/releases/v1.12.0', label: 'Releases', position: 'left', }, @@ -266,10 +271,11 @@ module.exports = { searchParameters: {}, }, prism: { + theme: prismTheme, magicComments: [ // Extend the default highlight class name { - className: 'theme-code-block-highlighted-line', + className: 'code-block-highlight-line', line: 'highlight-next-line', block: { start: 'highlight-start', end: 'highlight-end' }, }, diff --git a/microsite/package.json b/microsite/package.json index cb71d5a25a..09409518ee 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -17,7 +17,7 @@ "docusaurus": "docusaurus" }, "devDependencies": { - "@docusaurus/module-type-aliases": "2.3.1", + "@docusaurus/module-type-aliases": "2.4.0", "@spotify/prettier-config": "^14.0.0", "@tsconfig/docusaurus": "^1.0.6", "@types/webpack-env": "^1.18.0", @@ -29,12 +29,13 @@ }, "prettier": "@spotify/prettier-config", "dependencies": { - "@docusaurus/core": "2.3.1", + "@docusaurus/core": "2.4.0", "@docusaurus/plugin-client-redirects": "^2.3.1", - "@docusaurus/preset-classic": "2.3.1", + "@docusaurus/preset-classic": "2.4.0", "@swc/core": "^1.3.36", "clsx": "^1.1.1", "docusaurus-plugin-sass": "^0.2.3", + "prism-react-renderer": "^1.3.5", "react": "^17.0.2", "react-dom": "^17.0.2", "sass": "^1.57.1", diff --git a/microsite/sidebars.json b/microsite/sidebars.json index ebb387f81c..09727685a0 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -1,6 +1,7 @@ { "releases": { "Release Notes": [ + "releases/v1.12.0", "releases/v1.11.0", "releases/v1.10.0", "releases/v1.9.0", diff --git a/microsite/src/components/bannerSection/bannerSection.module.scss b/microsite/src/components/bannerSection/bannerSection.module.scss index 2beabf9738..64f4967d11 100644 --- a/microsite/src/components/bannerSection/bannerSection.module.scss +++ b/microsite/src/components/bannerSection/bannerSection.module.scss @@ -1,5 +1,41 @@ +@use 'src/theme/variables'; + .bannerSection { + --diagonalBorderHeight: 40px; + display: block; + background: var(--ifm-background-color); + + @media (min-width: variables.$desktopUpBreakpoint) { + --diagonalBorderHeight: 80px; + } + + &:global(:is(.diagonalBorder, .diagonalBottomBorder)) { + padding-bottom: var(--diagonalBorderHeight); + + & + section { + margin-top: calc(var(--diagonalBorderHeight) * -1); + padding-top: var(--diagonalBorderHeight); + } + } + + &:global(.diagonalBorder) { + clip-path: polygon( + 0 var(--diagonalBorderHeight), + 100% 0, + 100% calc(100% - var(--diagonalBorderHeight)), + 0 100% + ); + } + + &:global(.diagonalBottomBorder) { + clip-path: polygon( + 0 0, + 100% 0, + 100% calc(100% - var(--diagonalBorderHeight)), + 0 100% + ); + } &:global(.greyBackground) { background: linear-gradient(90.49deg, #121212 15.36%, #282828 70.44%); diff --git a/microsite/src/components/bannerSection/bannerSection.tsx b/microsite/src/components/bannerSection/bannerSection.tsx index 64c8d246c8..5dc99eecf0 100644 --- a/microsite/src/components/bannerSection/bannerSection.tsx +++ b/microsite/src/components/bannerSection/bannerSection.tsx @@ -6,6 +6,8 @@ import bannerStyles from './bannerSection.module.scss'; export type IBannerSectionProps = PropsWithChildren<{ className?: string; greyBackground?: boolean; + diagonalBorder?: boolean; + diagonalBottomBorder?: boolean; greenGradientBackground?: boolean; greenBottomGradientBackground?: boolean; greenCallToActionGradientBackground?: boolean; @@ -15,6 +17,8 @@ export const BannerSection = ({ children, className, greyBackground = false, + diagonalBorder = false, + diagonalBottomBorder = false, greenGradientBackground = false, greenBottomGradientBackground = false, greenCallToActionGradientBackground = false, @@ -22,6 +26,8 @@ export const BannerSection = ({
{ return (
- + { - + @@ -199,7 +199,7 @@ const Community = () => { - + Community initiatives} > @@ -223,7 +223,7 @@ const Community = () => { - + Trainings and Certifications diff --git a/microsite/src/pages/demos/index.tsx b/microsite/src/pages/demos/index.tsx index 2ca77e5c89..1221c38a63 100644 --- a/microsite/src/pages/demos/index.tsx +++ b/microsite/src/pages/demos/index.tsx @@ -167,6 +167,8 @@ const Demos = () => { {demoItems.map((demoItem, index) => ( 0 && index < demoItems.length - 1} greyBackground={index % 2 === 0} className={demosStyles.banner} > diff --git a/microsite/src/pages/getting-involved/index.tsx b/microsite/src/pages/getting-involved/index.tsx new file mode 100644 index 0000000000..d838f5d25b --- /dev/null +++ b/microsite/src/pages/getting-involved/index.tsx @@ -0,0 +1,6 @@ +import React from 'react'; +import { Redirect } from '@docusaurus/router'; + +export default () => { + return ; +}; diff --git a/microsite/src/pages/home/_home.tsx b/microsite/src/pages/home/_home.tsx index ea22062d28..deb0d4cd6f 100644 --- a/microsite/src/pages/home/_home.tsx +++ b/microsite/src/pages/home/_home.tsx @@ -28,7 +28,7 @@ const HomePage = () => { return (
- + { - + { - +
{
- +

Learn more about the software catalog

@@ -196,7 +196,7 @@ const HomePage = () => {
- +
{
- +

Build your own software templates

@@ -260,7 +260,7 @@ const HomePage = () => {
- +
{
- +

Learn more about TechDocs

@@ -320,7 +320,7 @@ const HomePage = () => {
- +
{
- +

Learn more about Backstage Search

@@ -381,7 +381,7 @@ const HomePage = () => {
- + { - +

Learn more about the K8s plugin

@@ -437,7 +437,7 @@ const HomePage = () => {
- +
{
- +

Build a plugin

diff --git a/microsite/src/pages/home/home.module.scss b/microsite/src/pages/home/home.module.scss index 57f2b9acde..5877f7b5f5 100644 --- a/microsite/src/pages/home/home.module.scss +++ b/microsite/src/pages/home/home.module.scss @@ -1,4 +1,4 @@ -$desktopUpBreakpoint: 997px; +@use '../../theme/variables.scss'; .homePage { font-size: 1.25rem; @@ -70,7 +70,7 @@ $desktopUpBreakpoint: 997px; } .catalogContainer { - @media (min-width: $desktopUpBreakpoint) { + @media (min-width: variables.$desktopUpBreakpoint) { grid-template-columns: repeat(4, 1fr); picture { @@ -85,7 +85,7 @@ $desktopUpBreakpoint: 997px; } .softwareTemplatesContainer { - @media (min-width: $desktopUpBreakpoint) { + @media (min-width: variables.$desktopUpBreakpoint) { grid: repeat(2, auto) / repeat(4, 1fr); picture { diff --git a/microsite/src/pages/plugins/_pluginCard.tsx b/microsite/src/pages/plugins/_pluginCard.tsx index 99f27b865d..d6b4017db5 100644 --- a/microsite/src/pages/plugins/_pluginCard.tsx +++ b/microsite/src/pages/plugins/_pluginCard.tsx @@ -35,9 +35,7 @@ export const PluginCard = ({ by {author}

- - {category} - + {category} } body={

{description}

} diff --git a/microsite/src/pages/plugins/plugins.module.scss b/microsite/src/pages/plugins/plugins.module.scss index d21444583a..bb08c2fd33 100644 --- a/microsite/src/pages/plugins/plugins.module.scss +++ b/microsite/src/pages/plugins/plugins.module.scss @@ -30,4 +30,8 @@ display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); } + + :global(.fit-content) { + width: fit-content; + } } diff --git a/microsite/src/css/customTheme.css b/microsite/src/theme/customTheme.scss similarity index 86% rename from microsite/src/css/customTheme.css rename to microsite/src/theme/customTheme.scss index 4ba7f1df86..f216762418 100644 --- a/microsite/src/css/customTheme.css +++ b/microsite/src/theme/customTheme.scss @@ -75,4 +75,12 @@ border-left: 3px solid rgba(255, 0, 0, 0.5); } +.code-block-highlight-line { + background-color: rgba(255, 255, 255, 0.08); + display: block; + margin: 0 calc(-1 * var(--ifm-pre-padding)); + padding: 0 var(--ifm-pre-padding); + border-left: 3px solid rgb(255, 255, 255, 0.5); +} + /* #endregion */ diff --git a/microsite/src/theme/variables.scss b/microsite/src/theme/variables.scss new file mode 100644 index 0000000000..3d74e59c9c --- /dev/null +++ b/microsite/src/theme/variables.scss @@ -0,0 +1,2 @@ +$xlUpBreakpoint: 1441px; +$desktopUpBreakpoint: 997px; diff --git a/microsite/static/img/github-statusneo.png b/microsite/static/img/github-statusneo.png new file mode 100644 index 0000000000..927ace351a Binary files /dev/null and b/microsite/static/img/github-statusneo.png differ diff --git a/microsite/static/img/outlook-statusneo.png b/microsite/static/img/outlook-statusneo.png new file mode 100644 index 0000000000..99e3b6a0bc Binary files /dev/null and b/microsite/static/img/outlook-statusneo.png differ diff --git a/microsite/yarn.lock b/microsite/yarn.lock index a9db81ead4..021d21a043 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -1660,9 +1660,9 @@ __metadata: languageName: node linkType: hard -"@docusaurus/core@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/core@npm:2.3.1" +"@docusaurus/core@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/core@npm:2.4.0" dependencies: "@babel/core": ^7.18.6 "@babel/generator": ^7.18.7 @@ -1674,13 +1674,13 @@ __metadata: "@babel/runtime": ^7.18.6 "@babel/runtime-corejs3": ^7.18.6 "@babel/traverse": ^7.18.8 - "@docusaurus/cssnano-preset": 2.3.1 - "@docusaurus/logger": 2.3.1 - "@docusaurus/mdx-loader": 2.3.1 + "@docusaurus/cssnano-preset": 2.4.0 + "@docusaurus/logger": 2.4.0 + "@docusaurus/mdx-loader": 2.4.0 "@docusaurus/react-loadable": 5.5.2 - "@docusaurus/utils": 2.3.1 - "@docusaurus/utils-common": 2.3.1 - "@docusaurus/utils-validation": 2.3.1 + "@docusaurus/utils": 2.4.0 + "@docusaurus/utils-common": 2.4.0 + "@docusaurus/utils-validation": 2.4.0 "@slorber/static-site-generator-webpack-plugin": ^4.0.7 "@svgr/webpack": ^6.2.1 autoprefixer: ^10.4.7 @@ -1740,40 +1740,40 @@ __metadata: react-dom: ^16.8.4 || ^17.0.0 bin: docusaurus: bin/docusaurus.mjs - checksum: 812aecae45af3f4d02fd16e89517ca9f1ba22821a078aaa890f5797ac7e0cc0c79e7623eb999e885cf7e7652a6ffda8ff7c06dfd85ca29aaab600993c3d9980d + checksum: 04d30e31e9c4198ce3f4a47c4f59943f357ef96a5cfa10674fd3049d4cf067c15fa0ae184383ba3e420f59a9b3077ed1cf1f373626399f0e46cea6fcf0897d7b languageName: node linkType: hard -"@docusaurus/cssnano-preset@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/cssnano-preset@npm:2.3.1" +"@docusaurus/cssnano-preset@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/cssnano-preset@npm:2.4.0" dependencies: cssnano-preset-advanced: ^5.3.8 postcss: ^8.4.14 postcss-sort-media-queries: ^4.2.1 tslib: ^2.4.0 - checksum: a3d00ce86b16caffde36734bb2f4541d2c0df5e8ab6891a78ad05bccc631a895fecb04c385626ebcb8f905510c28fa6158288585673ae96565532d4ee4b60d4f + checksum: b8982230ec014378a5453453df400a328a6ecdeecffb666ead5cfbeb5dc689610f0e62ee818ffcc8adc270c7c47cb818ad730c769eb8fa689dd79d4f9d448b6d languageName: node linkType: hard -"@docusaurus/logger@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/logger@npm:2.3.1" +"@docusaurus/logger@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/logger@npm:2.4.0" dependencies: chalk: ^4.1.2 tslib: ^2.4.0 - checksum: eff5f258aeac9c643431426256e3bc4515074cc3cc754fa643579ba427ba232ecace9a9579ae5af542330b22d7361892a1eaf84526983a0c821c5ca3ee895176 + checksum: 0424b77e2abaa50f20d6042ededf831157852656d1242ae9b0829b897e6f5b1e1e5ea30df599839e0ec51c72e42a5a867b136387dd5359032c735f431eddd078 languageName: node linkType: hard -"@docusaurus/mdx-loader@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/mdx-loader@npm:2.3.1" +"@docusaurus/mdx-loader@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/mdx-loader@npm:2.4.0" dependencies: "@babel/parser": ^7.18.8 "@babel/traverse": ^7.18.8 - "@docusaurus/logger": 2.3.1 - "@docusaurus/utils": 2.3.1 + "@docusaurus/logger": 2.4.0 + "@docusaurus/utils": 2.4.0 "@mdx-js/mdx": ^1.6.22 escape-html: ^1.0.3 file-loader: ^6.2.0 @@ -1790,16 +1790,16 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 4a1c9ef0e8506ab4d9cb4714ff7437664e238e0f2878a5eb4a2e082897bbee7ae8d0b61ba9d45ffa820beb5ce75aa0050201db815b00c18fc136aaa4c6411c21 + checksum: 3d4e7bf6840fa7dcf4250aa5ea019f80dac6cc38e9f8b9a0515b81b6c0f6d6f4ed4103f521784e70db856aec06cff4be176ef281e1cac53afc82bc1182bbf9ad languageName: node linkType: hard -"@docusaurus/module-type-aliases@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/module-type-aliases@npm:2.3.1" +"@docusaurus/module-type-aliases@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/module-type-aliases@npm:2.4.0" dependencies: "@docusaurus/react-loadable": 5.5.2 - "@docusaurus/types": 2.3.1 + "@docusaurus/types": 2.4.0 "@types/history": ^4.7.11 "@types/react": "*" "@types/react-router-config": "*" @@ -1809,19 +1809,19 @@ __metadata: peerDependencies: react: "*" react-dom: "*" - checksum: 74f799f81455dc8ff3e6edf07428996764014c2c7b416e6b5d160af15f00ad3aa1ab75dee5356645ec7f2ea832fb2aca6e9a32b19d64abeb9e3d57c4195f1e50 + checksum: fc655d9dc77d88ba9d10abe602c9fd5533992b14de495e4f3e4caea368693a7b7e5a805fb2938287bed949900e7e3d7f94bea3c1a8727b45e19c85996965d0c7 languageName: node linkType: hard "@docusaurus/plugin-client-redirects@npm:^2.3.1": - version: 2.3.1 - resolution: "@docusaurus/plugin-client-redirects@npm:2.3.1" + version: 2.4.0 + resolution: "@docusaurus/plugin-client-redirects@npm:2.4.0" dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/logger": 2.3.1 - "@docusaurus/utils": 2.3.1 - "@docusaurus/utils-common": 2.3.1 - "@docusaurus/utils-validation": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/logger": 2.4.0 + "@docusaurus/utils": 2.4.0 + "@docusaurus/utils-common": 2.4.0 + "@docusaurus/utils-validation": 2.4.0 eta: ^2.0.0 fs-extra: ^10.1.0 lodash: ^4.17.21 @@ -1829,21 +1829,21 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: bb730359c7f9015108a3d4ec8a570e9c73847349747bf71711f522a7dc40007786b7cd25cebc845eeb16b3505e8068242559a2eda790f4c07d4083d9014a6f84 + checksum: e0a82b71521752fb338b928fd0e04c78f01a1b8f240ffde12631a25711cdf63b0bf1a56d1ee19e479ea11d33ef9aabf337071f2eb5dcd55b4f17228374ceae26 languageName: node linkType: hard -"@docusaurus/plugin-content-blog@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/plugin-content-blog@npm:2.3.1" +"@docusaurus/plugin-content-blog@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/plugin-content-blog@npm:2.4.0" dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/logger": 2.3.1 - "@docusaurus/mdx-loader": 2.3.1 - "@docusaurus/types": 2.3.1 - "@docusaurus/utils": 2.3.1 - "@docusaurus/utils-common": 2.3.1 - "@docusaurus/utils-validation": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/logger": 2.4.0 + "@docusaurus/mdx-loader": 2.4.0 + "@docusaurus/types": 2.4.0 + "@docusaurus/utils": 2.4.0 + "@docusaurus/utils-common": 2.4.0 + "@docusaurus/utils-validation": 2.4.0 cheerio: ^1.0.0-rc.12 feed: ^4.2.2 fs-extra: ^10.1.0 @@ -1856,21 +1856,21 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: abc668ceab15269f57be7f74acbec2e139b4f6b90af8771d246a9036d124b49b0d9fd4890e9566df7a4ba960f2da0316c18741eed1be0646f2b4602465219ddd + checksum: e912ea1a01c1769b374aecf1af72cef96dbed5faa01b74cc12d951dd5dccc089994ff649f0a18f994e39730338f99c0aa12f3b2a1eefc40888f1fb7956cece29 languageName: node linkType: hard -"@docusaurus/plugin-content-docs@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/plugin-content-docs@npm:2.3.1" +"@docusaurus/plugin-content-docs@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/plugin-content-docs@npm:2.4.0" dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/logger": 2.3.1 - "@docusaurus/mdx-loader": 2.3.1 - "@docusaurus/module-type-aliases": 2.3.1 - "@docusaurus/types": 2.3.1 - "@docusaurus/utils": 2.3.1 - "@docusaurus/utils-validation": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/logger": 2.4.0 + "@docusaurus/mdx-loader": 2.4.0 + "@docusaurus/module-type-aliases": 2.4.0 + "@docusaurus/types": 2.4.0 + "@docusaurus/utils": 2.4.0 + "@docusaurus/utils-validation": 2.4.0 "@types/react-router-config": ^5.0.6 combine-promises: ^1.1.0 fs-extra: ^10.1.0 @@ -1883,132 +1883,132 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: bcf8d921407d11b497926a1f61a1dc8c96f82fbe5a1959cc106b082e555f8fb6f42cf9262a658acf33d9543e5eb3e778049d91f71e4a2855993dc759c845cf31 + checksum: 5a273e80f2c28e4a33ab994e8702b3afaff04eb73f156a0a3e42cd9d182f8e1ed2b794348b090ec170cc1e4aba2e997d1fb6e8684f73ac6698bf66d96114c57b languageName: node linkType: hard -"@docusaurus/plugin-content-pages@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/plugin-content-pages@npm:2.3.1" +"@docusaurus/plugin-content-pages@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/plugin-content-pages@npm:2.4.0" dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/mdx-loader": 2.3.1 - "@docusaurus/types": 2.3.1 - "@docusaurus/utils": 2.3.1 - "@docusaurus/utils-validation": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/mdx-loader": 2.4.0 + "@docusaurus/types": 2.4.0 + "@docusaurus/utils": 2.4.0 + "@docusaurus/utils-validation": 2.4.0 fs-extra: ^10.1.0 tslib: ^2.4.0 webpack: ^5.73.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 8543050ed7330f54a28c0daeef11662eed3f3a08a6d0015b1a32db3d5e9ec46f0c6a8a5a4cb3e871ce953074d60424cc418b7ffa280695294626855a7a1a146a + checksum: 5381e913101f271476cbdc264e6058a0cbe0835ed4a823e430540da545253c1dc56578c66a6d978ee2f1aca114110aba529443ae835f26ef0eaf7de1ed6a5001 languageName: node linkType: hard -"@docusaurus/plugin-debug@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/plugin-debug@npm:2.3.1" +"@docusaurus/plugin-debug@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/plugin-debug@npm:2.4.0" dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/types": 2.3.1 - "@docusaurus/utils": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/types": 2.4.0 + "@docusaurus/utils": 2.4.0 fs-extra: ^10.1.0 react-json-view: ^1.21.3 tslib: ^2.4.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: e660575f900eedbeab6e222eb4f8ef6a7a49815c91a97839a4839737c0b3101698bf7c6e035cbafaa49010340010a9ec0d37270dc81a470b3bae42662c7a24b8 + checksum: 921614843453ef189dfa2ada31e7abed8f976b0c314f7486fde35f976911de2ab307863608326e96bea67468e98dc648aeea82dbad04d0701c3c48c92bd40c6c languageName: node linkType: hard -"@docusaurus/plugin-google-analytics@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/plugin-google-analytics@npm:2.3.1" +"@docusaurus/plugin-google-analytics@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/plugin-google-analytics@npm:2.4.0" dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/types": 2.3.1 - "@docusaurus/utils-validation": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/types": 2.4.0 + "@docusaurus/utils-validation": 2.4.0 tslib: ^2.4.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 9306ae89cd5fb8ca86fd58809d7e624f988411d8908a151e9b6d9e8d0b84e08f1e3eba46024bc4321bcaeb3e9bc38e919b0bcf561adc9d40fa97c8ffeb232888 + checksum: 2d8c7e5689675ced9acffe1e2187144d6ebeea471a5992139c3eea87094e315e272263da5499591e85bc3501b7583f693d33c660507b36a835fc9eb75584c706 languageName: node linkType: hard -"@docusaurus/plugin-google-gtag@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/plugin-google-gtag@npm:2.3.1" +"@docusaurus/plugin-google-gtag@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/plugin-google-gtag@npm:2.4.0" dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/types": 2.3.1 - "@docusaurus/utils-validation": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/types": 2.4.0 + "@docusaurus/utils-validation": 2.4.0 tslib: ^2.4.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 494f0405d79aa9cb36d1ea4cf739499ad15b59fe876573ab5b304b5e84ab6ef4d428ebdc26647777b0816af452f62959b5ddb25e5bbf73c7fb3d6568258980d0 + checksum: 6aa0bb6ac5e410ea438db2de20c95a4a34d7056855b2e0baa7685e31bd9b3f48ef55f8135ca496688ccbfaba88945219acae146a244141bfb7e2372ba54c0ce2 languageName: node linkType: hard -"@docusaurus/plugin-google-tag-manager@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/plugin-google-tag-manager@npm:2.3.1" +"@docusaurus/plugin-google-tag-manager@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/plugin-google-tag-manager@npm:2.4.0" dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/types": 2.3.1 - "@docusaurus/utils-validation": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/types": 2.4.0 + "@docusaurus/utils-validation": 2.4.0 tslib: ^2.4.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: d0b2ccc212652bb4f1c1bd61420e7f235325d4f2e8de0f5b25282305f54209d05da981c1253325bcae9afbc7575bd5c246d037d2be5fbda06f2842ba8335ab47 + checksum: 2df57cd95808ed7cf58ade342dcc3382e167ecebaedc7184588c214f6b64eab60fa0145ab0ce7e25803acfe3952412c1134d52ad0ea636cef652a73ccd79a5cb languageName: node linkType: hard -"@docusaurus/plugin-sitemap@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/plugin-sitemap@npm:2.3.1" +"@docusaurus/plugin-sitemap@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/plugin-sitemap@npm:2.4.0" dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/logger": 2.3.1 - "@docusaurus/types": 2.3.1 - "@docusaurus/utils": 2.3.1 - "@docusaurus/utils-common": 2.3.1 - "@docusaurus/utils-validation": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/logger": 2.4.0 + "@docusaurus/types": 2.4.0 + "@docusaurus/utils": 2.4.0 + "@docusaurus/utils-common": 2.4.0 + "@docusaurus/utils-validation": 2.4.0 fs-extra: ^10.1.0 sitemap: ^7.1.1 tslib: ^2.4.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 667d2abbf46efffc4d20e38fe435a19392f07726446193a017306652ee9db3d478e971eefb209e1a5c243b6b82af3de72d4b975b8e74aa93bda4711ce8c309bc + checksum: e96fcc84352880da6a3e566cdc249e44ad825b400f2d798746201c3a4a255b196b999f5bf5d0a5b52c752acf9e9eb1169111b463914502a6cae9c114800fa09e languageName: node linkType: hard -"@docusaurus/preset-classic@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/preset-classic@npm:2.3.1" +"@docusaurus/preset-classic@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/preset-classic@npm:2.4.0" dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/plugin-content-blog": 2.3.1 - "@docusaurus/plugin-content-docs": 2.3.1 - "@docusaurus/plugin-content-pages": 2.3.1 - "@docusaurus/plugin-debug": 2.3.1 - "@docusaurus/plugin-google-analytics": 2.3.1 - "@docusaurus/plugin-google-gtag": 2.3.1 - "@docusaurus/plugin-google-tag-manager": 2.3.1 - "@docusaurus/plugin-sitemap": 2.3.1 - "@docusaurus/theme-classic": 2.3.1 - "@docusaurus/theme-common": 2.3.1 - "@docusaurus/theme-search-algolia": 2.3.1 - "@docusaurus/types": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/plugin-content-blog": 2.4.0 + "@docusaurus/plugin-content-docs": 2.4.0 + "@docusaurus/plugin-content-pages": 2.4.0 + "@docusaurus/plugin-debug": 2.4.0 + "@docusaurus/plugin-google-analytics": 2.4.0 + "@docusaurus/plugin-google-gtag": 2.4.0 + "@docusaurus/plugin-google-tag-manager": 2.4.0 + "@docusaurus/plugin-sitemap": 2.4.0 + "@docusaurus/theme-classic": 2.4.0 + "@docusaurus/theme-common": 2.4.0 + "@docusaurus/theme-search-algolia": 2.4.0 + "@docusaurus/types": 2.4.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: e4128a1bcb64d5ced04a281476ec1ae2d5523040d41ed57a8f744fb83659a2a2be902e94989de69ab1e6d693ec26c60d1ef6b2fe3ec96d5af6c9b3ef58f5b0cd + checksum: 33961a1edd445f13971e640db9445a0fae418babf0fe5f4078f21e605f9d945f7a3a4b7ad53ac7b578a7302f093c708429f462a76a3f297b3439d8e23b3990aa languageName: node linkType: hard @@ -2024,26 +2024,26 @@ __metadata: languageName: node linkType: hard -"@docusaurus/theme-classic@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/theme-classic@npm:2.3.1" +"@docusaurus/theme-classic@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/theme-classic@npm:2.4.0" dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/mdx-loader": 2.3.1 - "@docusaurus/module-type-aliases": 2.3.1 - "@docusaurus/plugin-content-blog": 2.3.1 - "@docusaurus/plugin-content-docs": 2.3.1 - "@docusaurus/plugin-content-pages": 2.3.1 - "@docusaurus/theme-common": 2.3.1 - "@docusaurus/theme-translations": 2.3.1 - "@docusaurus/types": 2.3.1 - "@docusaurus/utils": 2.3.1 - "@docusaurus/utils-common": 2.3.1 - "@docusaurus/utils-validation": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/mdx-loader": 2.4.0 + "@docusaurus/module-type-aliases": 2.4.0 + "@docusaurus/plugin-content-blog": 2.4.0 + "@docusaurus/plugin-content-docs": 2.4.0 + "@docusaurus/plugin-content-pages": 2.4.0 + "@docusaurus/theme-common": 2.4.0 + "@docusaurus/theme-translations": 2.4.0 + "@docusaurus/types": 2.4.0 + "@docusaurus/utils": 2.4.0 + "@docusaurus/utils-common": 2.4.0 + "@docusaurus/utils-validation": 2.4.0 "@mdx-js/react": ^1.6.22 clsx: ^1.2.1 copy-text-to-clipboard: ^3.0.1 - infima: 0.2.0-alpha.42 + infima: 0.2.0-alpha.43 lodash: ^4.17.21 nprogress: ^0.2.0 postcss: ^8.4.14 @@ -2056,20 +2056,21 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 273812924fc29b2316aff554ae0302509ebeaca5aa829b58253e74d22a66e69444f1c324a2d5e8e170e6c6f27dd0d6927e6c6a22a7e0c14567ff777d04a5b0c1 + checksum: 7f3161d7be653b6a86ffd58d8a6c6d62f464db919c32b7b9ab2ec9ca1b79136e2278fdc908e90cfa31cf21385d87cd7496d5bf9c80d30c2279ef95e7f7be28aa languageName: node linkType: hard -"@docusaurus/theme-common@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/theme-common@npm:2.3.1" +"@docusaurus/theme-common@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/theme-common@npm:2.4.0" dependencies: - "@docusaurus/mdx-loader": 2.3.1 - "@docusaurus/module-type-aliases": 2.3.1 - "@docusaurus/plugin-content-blog": 2.3.1 - "@docusaurus/plugin-content-docs": 2.3.1 - "@docusaurus/plugin-content-pages": 2.3.1 - "@docusaurus/utils": 2.3.1 + "@docusaurus/mdx-loader": 2.4.0 + "@docusaurus/module-type-aliases": 2.4.0 + "@docusaurus/plugin-content-blog": 2.4.0 + "@docusaurus/plugin-content-docs": 2.4.0 + "@docusaurus/plugin-content-pages": 2.4.0 + "@docusaurus/utils": 2.4.0 + "@docusaurus/utils-common": 2.4.0 "@types/history": ^4.7.11 "@types/react": "*" "@types/react-router-config": "*" @@ -2082,22 +2083,22 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 6b902e9e782721c3c49bcdee5d969ea1c1138ebcb03891e34f827b16f2c06f43a86d95f240a60ed084539e9b16435312a41be7bff4e724f4fb209998dd4d3a59 + checksum: 0790c6e5ad14bc8518173314a058e01837321d5992364d1ae4f9907f1d055f5852f883512d7a64e5add95dcfe362a009b374220de6493b32624a406d8ce74750 languageName: node linkType: hard -"@docusaurus/theme-search-algolia@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/theme-search-algolia@npm:2.3.1" +"@docusaurus/theme-search-algolia@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/theme-search-algolia@npm:2.4.0" dependencies: "@docsearch/react": ^3.1.1 - "@docusaurus/core": 2.3.1 - "@docusaurus/logger": 2.3.1 - "@docusaurus/plugin-content-docs": 2.3.1 - "@docusaurus/theme-common": 2.3.1 - "@docusaurus/theme-translations": 2.3.1 - "@docusaurus/utils": 2.3.1 - "@docusaurus/utils-validation": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/logger": 2.4.0 + "@docusaurus/plugin-content-docs": 2.4.0 + "@docusaurus/theme-common": 2.4.0 + "@docusaurus/theme-translations": 2.4.0 + "@docusaurus/utils": 2.4.0 + "@docusaurus/utils-validation": 2.4.0 algoliasearch: ^4.13.1 algoliasearch-helper: ^3.10.0 clsx: ^1.2.1 @@ -2109,23 +2110,23 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 965303068e43b11f58d20b95bb6dfc01d5e575c2070d2730b94303bd2a1d33794075cae43bfe472f08061bd8770f14c8eb54932274e6b39f954ab34e7cfc5689 + checksum: a74a199faf6bab1d663cd41f9477c65c17f8dd2080664d5c00f998eb7c57345f1c30ff4f2c3bc88863f2e606c6f7475300747480dc145e61dd42798ca4fd435e languageName: node linkType: hard -"@docusaurus/theme-translations@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/theme-translations@npm:2.3.1" +"@docusaurus/theme-translations@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/theme-translations@npm:2.4.0" dependencies: fs-extra: ^10.1.0 tslib: ^2.4.0 - checksum: dd3796be63c4c946af789c3da18ed2704a2fa90d8e752ba2b780a124dc13369ba590218afad0ac4ea2342f7331ccb9eb1be086226c950b8384978d94a15c57ad + checksum: 37f329eb74fcb16c14bd370038d8bd1e18017fb1f78564d960c53fd4e110eb166f6f1c03f323dea28ede95873ebe28a659554d02cc26d1c3e748a772f9d2313a languageName: node linkType: hard -"@docusaurus/types@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/types@npm:2.3.1" +"@docusaurus/types@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/types@npm:2.4.0" dependencies: "@types/history": ^4.7.11 "@types/react": "*" @@ -2138,13 +2139,13 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 91e52f37b97964112aa0d50ee4a6f534d7da941443af5ddc96418817c6ce532a98c73e67045ac703b582c7ed703ebb360205eec30da7f738c0105f2b3ae1a246 + checksum: 54b0cd8992269ab0508d94ce19a7fcc2b3e7c9700eb112c9b859ddac8228dcc64282c414b602ba44894be87be79eeeef730fb8e569be68b6e26453e18addcf21 languageName: node linkType: hard -"@docusaurus/utils-common@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/utils-common@npm:2.3.1" +"@docusaurus/utils-common@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/utils-common@npm:2.4.0" dependencies: tslib: ^2.4.0 peerDependencies: @@ -2152,28 +2153,28 @@ __metadata: peerDependenciesMeta: "@docusaurus/types": optional: true - checksum: 405dc5b8aba9a97b2670ba8ff3911bbdaed274edc15214ab482a7159a07ad1c9b3198835a7bee42de4e0320d42bd402ed89ae6896744a364d64d89d9f78bcfb0 + checksum: 711e61e899b133fc7cd755e6de75fd79a712eeabbd9853b9122e3929c8390e015bb9e4bca2284028e40e7a0fb2b89ef1c184f7e4149097ffd7b64821b38c11da languageName: node linkType: hard -"@docusaurus/utils-validation@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/utils-validation@npm:2.3.1" +"@docusaurus/utils-validation@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/utils-validation@npm:2.4.0" dependencies: - "@docusaurus/logger": 2.3.1 - "@docusaurus/utils": 2.3.1 + "@docusaurus/logger": 2.4.0 + "@docusaurus/utils": 2.4.0 joi: ^17.6.0 js-yaml: ^4.1.0 tslib: ^2.4.0 - checksum: 1e5529d1d0c4fcd9006adf2e5b545458a7dba3877563fb444dcec472f27a3d8492d4c6fb5dd1071bb6e668a13a845d74b8f6c4b6387babfa0e467a9b8b237fda + checksum: 21a229858ed9254830b68dd08de6456dc19b68adead581f86e854ea3e55b64b9616a3bbca521e74f754c9c7bc835ca348dfe9f0949d9a8d189db5b39bcdb9f6b languageName: node linkType: hard -"@docusaurus/utils@npm:2.3.1": - version: 2.3.1 - resolution: "@docusaurus/utils@npm:2.3.1" +"@docusaurus/utils@npm:2.4.0": + version: 2.4.0 + resolution: "@docusaurus/utils@npm:2.4.0" dependencies: - "@docusaurus/logger": 2.3.1 + "@docusaurus/logger": 2.4.0 "@svgr/webpack": ^6.2.1 escape-string-regexp: ^4.0.0 file-loader: ^6.2.0 @@ -2194,7 +2195,7 @@ __metadata: peerDependenciesMeta: "@docusaurus/types": optional: true - checksum: e8bce9bbd98bf63664fcd7c0a5f8dec30dad31ed19e18d724b43189b04ecdc1174537e1d987293575ec18d421236fb92d3d39d28477e921507260a39c3f6d6d0 + checksum: 7ba6634b6ff71bb7cc64b0eb3c6d2892a21873bce8559bcd460693a80ca0229828c04da751277cdb17c6f18e80e061322bbcd84e9b743adc96c594b43e8a2165 languageName: node linkType: hard @@ -2623,90 +2624,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-arm64@npm:1.3.38" +"@swc/core-darwin-arm64@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-darwin-arm64@npm:1.3.42" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-x64@npm:1.3.38" +"@swc/core-darwin-x64@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-darwin-x64@npm:1.3.42" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.38" +"@swc/core-linux-arm-gnueabihf@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.42" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.38" +"@swc/core-linux-arm64-gnu@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.42" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.38" +"@swc/core-linux-arm64-musl@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.42" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.38" +"@swc/core-linux-x64-gnu@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.42" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-musl@npm:1.3.38" +"@swc/core-linux-x64-musl@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-x64-musl@npm:1.3.42" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.38" +"@swc/core-win32-arm64-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.42" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.38" +"@swc/core-win32-ia32-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.42" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.38" +"@swc/core-win32-x64-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.42" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.36": - version: 1.3.38 - resolution: "@swc/core@npm:1.3.38" + version: 1.3.42 + resolution: "@swc/core@npm:1.3.42" dependencies: - "@swc/core-darwin-arm64": 1.3.38 - "@swc/core-darwin-x64": 1.3.38 - "@swc/core-linux-arm-gnueabihf": 1.3.38 - "@swc/core-linux-arm64-gnu": 1.3.38 - "@swc/core-linux-arm64-musl": 1.3.38 - "@swc/core-linux-x64-gnu": 1.3.38 - "@swc/core-linux-x64-musl": 1.3.38 - "@swc/core-win32-arm64-msvc": 1.3.38 - "@swc/core-win32-ia32-msvc": 1.3.38 - "@swc/core-win32-x64-msvc": 1.3.38 + "@swc/core-darwin-arm64": 1.3.42 + "@swc/core-darwin-x64": 1.3.42 + "@swc/core-linux-arm-gnueabihf": 1.3.42 + "@swc/core-linux-arm64-gnu": 1.3.42 + "@swc/core-linux-arm64-musl": 1.3.42 + "@swc/core-linux-x64-gnu": 1.3.42 + "@swc/core-linux-x64-musl": 1.3.42 + "@swc/core-win32-arm64-msvc": 1.3.42 + "@swc/core-win32-ia32-msvc": 1.3.42 + "@swc/core-win32-x64-msvc": 1.3.42 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -2728,7 +2729,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: c55d30e57638bcd21f788add8490c3f3e71bfe027aa5a8b153e1b1b9686ecddd6deeaaa6a6b17717c7eab4c1e2a232b465b6755b6c891506fc0d03139badfbf7 + checksum: 5c28c03ee6a4e1f630c4a519b56d7e23a0102f70fad977a3ab144a3da96231cf4849e473cdc9ee7be6b9266ba0838d0bc0b6b3575a75540f302befe96cc9606e languageName: node linkType: hard @@ -2756,9 +2757,9 @@ __metadata: linkType: hard "@tsconfig/docusaurus@npm:^1.0.6": - version: 1.0.6 - resolution: "@tsconfig/docusaurus@npm:1.0.6" - checksum: fb0d7965c01fe64fc6369a72695b903d654bd5fb145f373d707c2bae3c2d828703517d812cef1c041ae44b108f44e52778b9d9837a54fdf782e68e6619a90a4d + version: 1.0.7 + resolution: "@tsconfig/docusaurus@npm:1.0.7" + checksum: 8f5b14005d90b2008f10daf03a5edec86d2a7603e5641c579ea936a5c2d165a8c3007a72254fc4c2adb0554d73062f52bb97b30ff818f01c9215957822f3c4db languageName: node linkType: hard @@ -3726,10 +3727,10 @@ __metadata: version: 0.0.0-use.local resolution: "backstage-microsite@workspace:." dependencies: - "@docusaurus/core": 2.3.1 - "@docusaurus/module-type-aliases": 2.3.1 + "@docusaurus/core": 2.4.0 + "@docusaurus/module-type-aliases": 2.4.0 "@docusaurus/plugin-client-redirects": ^2.3.1 - "@docusaurus/preset-classic": 2.3.1 + "@docusaurus/preset-classic": 2.4.0 "@spotify/prettier-config": ^14.0.0 "@swc/core": ^1.3.36 "@tsconfig/docusaurus": ^1.0.6 @@ -3738,6 +3739,7 @@ __metadata: docusaurus-plugin-sass: ^0.2.3 js-yaml: ^4.1.0 prettier: ^2.6.2 + prism-react-renderer: ^1.3.5 react: ^17.0.2 react-dom: ^17.0.2 replace: ^1.2.2 @@ -6442,10 +6444,10 @@ __metadata: languageName: node linkType: hard -"infima@npm:0.2.0-alpha.42": - version: 0.2.0-alpha.42 - resolution: "infima@npm:0.2.0-alpha.42" - checksum: 7206f36639c00a08daab811fedc748068951497efb5ec948cba846fb23856443668015f6bd65ddebe857cc2235f6ca98429f7018c73dcac47b0361ef4721bb8f +"infima@npm:0.2.0-alpha.43": + version: 0.2.0-alpha.43 + resolution: "infima@npm:0.2.0-alpha.43" + checksum: fc5f79240e940eddd750439511767092ccb4051e5e91d253ec7630a9e7ce691812da3aa0f05e46b4c0a95dbfadeae5714fd0073f8d2df12e5aaff0697a1d6aa2 languageName: node linkType: hard @@ -8558,11 +8560,11 @@ __metadata: linkType: hard "prettier@npm:^2.6.2": - version: 2.8.4 - resolution: "prettier@npm:2.8.4" + version: 2.8.7 + resolution: "prettier@npm:2.8.7" bin: prettier: bin-prettier.js - checksum: c173064bf3df57b6d93d19aa98753b9b9dd7657212e33b41ada8e2e9f9884066bb9ca0b4005b89b3ab137efffdf8fbe0b462785aba20364798ff4303aadda57e + checksum: fdc8f2616f099f5f0d685907f4449a70595a0fc1d081a88919604375989e0d5e9168d6121d8cc6861f21990b31665828e00472544d785d5940ea08a17660c3a6 languageName: node linkType: hard @@ -9437,15 +9439,15 @@ __metadata: linkType: hard "sass@npm:^1.57.1": - version: 1.58.3 - resolution: "sass@npm:1.58.3" + version: 1.60.0 + resolution: "sass@npm:1.60.0" dependencies: chokidar: ">=3.0.0 <4.0.0" immutable: ^4.0.0 source-map-js: ">=0.6.2 <2.0.0" bin: sass: sass.js - checksum: 35a2b98c037ef80fdc93c9b0be846e6ccc7d75596351a37ee79c397e66666d0a754c52c4696e746c0aff32327471e185343ca349e998a58340411adc9d0489a5 + checksum: 06e163c37af466ec194cf2ed8dab616372afeb19322d356947d48ea664fc38398ae77c4d91bea9cb0ace954ce289d5518d0f8555ecc49f6bf2539a8ef52fc580 languageName: node linkType: hard @@ -10889,8 +10891,8 @@ __metadata: linkType: hard "webpack@npm:^5.73.0": - version: 5.75.0 - resolution: "webpack@npm:5.75.0" + version: 5.76.2 + resolution: "webpack@npm:5.76.2" dependencies: "@types/eslint-scope": ^3.7.3 "@types/estree": ^0.0.51 @@ -10921,7 +10923,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 2bcc5f3c195f375944e8af2f00bf2feea39cb9fda5f763b0d1b00077f1c51783db25c94d3fae96a07dead9fa085e6ae7474417e5ab31719c9776ea5969ceb83a + checksum: 86db98299a175c371031449c26077e87b33acd8f45de7f7945ed4b9b37c8ca11bc5169af9c44743efccd4d55e08042a3aa3a3bc42aff831309a0821ffbcd395e languageName: node linkType: hard diff --git a/package.json b/package.json index 43a146e0a1..8550a72a97 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.12.0-next.2", + "version": "1.13.0-next.0", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3" diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index 0b2b813d14..b2d85cea1a 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/app-defaults +## 1.3.0-next.0 + +### Minor Changes + +- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/theme@0.2.18 + +## 1.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/core-app-api@1.6.0 + - @backstage/theme@0.2.18 + - @backstage/plugin-permission-react@0.4.11 + ## 1.2.1-next.2 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 873a2fa28f..d4540bfd1d 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/app-defaults", "description": "Provides the default wiring of a Backstage App", - "version": "1.2.1-next.2", + "version": "1.3.0-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app-defaults/src/defaults/apis.ts b/packages/app-defaults/src/defaults/apis.ts index d3ebddfb84..3a552c25c7 100644 --- a/packages/app-defaults/src/defaults/apis.ts +++ b/packages/app-defaults/src/defaults/apis.ts @@ -130,6 +130,7 @@ export const apis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => GoogleAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), @@ -144,6 +145,7 @@ export const apis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => MicrosoftAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), @@ -158,6 +160,7 @@ export const apis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => GithubAuth.create({ + configApi, discoveryApi, oauthRequestApi, defaultScopes: ['read:user'], @@ -173,6 +176,7 @@ export const apis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => OktaAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), @@ -187,6 +191,7 @@ export const apis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => GitlabAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), @@ -201,6 +206,7 @@ export const apis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => OneLoginAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), @@ -215,6 +221,7 @@ export const apis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => BitbucketAuth.create({ + configApi, discoveryApi, oauthRequestApi, defaultScopes: ['team'], @@ -226,9 +233,11 @@ export const apis = [ deps: { discoveryApi: discoveryApiRef, oauthRequestApi: oauthRequestApiRef, + configApi: configApiRef, }, - factory: ({ discoveryApi, oauthRequestApi }) => + factory: ({ discoveryApi, oauthRequestApi, configApi }) => BitbucketServerAuth.create({ + configApi, discoveryApi, oauthRequestApi, defaultScopes: ['REPO_READ'], @@ -243,6 +252,7 @@ export const apis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => { return AtlassianAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index ac21cbad07..7c0a558a86 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,143 @@ # example-app +## 0.2.82-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.9.2-next.0 + - @backstage/plugin-scaffolder@1.13.0-next.0 + - @backstage/plugin-scaffolder-react@1.3.0-next.0 + - @backstage/plugin-entity-feedback@0.2.0-next.0 + - @backstage/plugin-tech-insights@0.3.9-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/app-defaults@1.3.0-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-techdocs@1.6.1-next.0 + - @backstage/cli@0.22.6-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.10-next.0 + - @backstage/plugin-apache-airflow@0.2.10-next.0 + - @backstage/plugin-catalog-import@0.9.7-next.0 + - @backstage/plugin-github-actions@0.5.17-next.0 + - @backstage/plugin-catalog-graph@0.2.29-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/plugin-code-coverage@0.2.10-next.0 + - @backstage/plugin-cost-insights@0.12.6-next.0 + - @backstage/plugin-user-settings@0.7.2-next.0 + - @backstage/plugin-azure-devops@0.2.8-next.0 + - @backstage/plugin-gcp-projects@0.3.36-next.0 + - @backstage/plugin-azure-sites@0.1.6-next.0 + - @backstage/plugin-cloudbuild@0.3.17-next.0 + - @backstage/plugin-kubernetes@0.7.10-next.0 + - @backstage/plugin-lighthouse@0.4.2-next.0 + - @backstage/plugin-tech-radar@0.6.3-next.0 + - @backstage/plugin-dynatrace@3.0.1-next.0 + - @backstage/plugin-gcalendar@0.3.13-next.0 + - @backstage/plugin-pagerduty@0.5.10-next.0 + - @backstage/plugin-shortcuts@0.3.9-next.0 + - @backstage/plugin-airbrake@0.3.17-next.0 + - @backstage/plugin-circleci@0.3.17-next.0 + - @backstage/plugin-graphiql@0.2.49-next.0 + - @backstage/plugin-newrelic@0.3.35-next.0 + - @backstage/plugin-explore@0.4.2-next.0 + - @backstage/plugin-jenkins@0.7.16-next.0 + - @backstage/plugin-rollbar@0.4.17-next.0 + - @backstage/plugin-badges@0.2.41-next.0 + - @backstage/plugin-search@1.1.2-next.0 + - @backstage/plugin-sentry@0.5.2-next.0 + - @backstage/plugin-kafka@0.3.17-next.0 + - @backstage/plugin-gocd@0.1.23-next.0 + - @backstage/plugin-home@0.4.33-next.0 + - @backstage/plugin-todo@0.2.19-next.0 + - @backstage/plugin-org@0.6.7-next.0 + - @internal/plugin-catalog-customized@0.0.9-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/plugin-linguist@0.1.2-next.0 + - @backstage/plugin-microsoft-calendar@0.1.2-next.0 + - @backstage/plugin-playlist@0.1.8-next.0 + - @backstage/plugin-stack-overflow@0.1.13-next.0 + - @backstage/plugin-stackstorm@0.1.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-search-common@1.2.2 + +## 0.2.81 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-scaffolder-react@1.2.0 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-tech-insights@0.3.8 + - @backstage/plugin-search-react@1.5.1 + - @backstage/plugin-scaffolder@1.12.0 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/plugin-explore@0.4.1 + - @backstage/plugin-search@1.1.1 + - @backstage/cli@0.22.4 + - @backstage/plugin-kubernetes@0.7.9 + - @backstage/plugin-tech-radar@0.6.2 + - @backstage/plugin-microsoft-calendar@0.1.1 + - @backstage/plugin-newrelic-dashboard@0.2.9 + - @backstage/plugin-code-coverage@0.2.9 + - @backstage/plugin-azure-sites@0.1.5 + - @backstage/plugin-gcalendar@0.3.12 + - @backstage/plugin-shortcuts@0.3.8 + - @backstage/plugin-org@0.6.6 + - @backstage/plugin-api-docs@0.9.1 + - @backstage/plugin-stackstorm@0.1.0 + - @backstage/plugin-circleci@0.3.16 + - @backstage/plugin-playlist@0.1.7 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-cost-insights@0.12.5 + - @backstage/plugin-jenkins@0.7.15 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/plugin-airbrake@0.3.16 + - @backstage/plugin-apache-airflow@0.2.9 + - @backstage/plugin-azure-devops@0.2.7 + - @backstage/plugin-badges@0.2.40 + - @backstage/plugin-catalog-import@0.9.6 + - @backstage/plugin-cloudbuild@0.3.16 + - @backstage/plugin-dynatrace@3.0.0 + - @backstage/plugin-entity-feedback@0.1.1 + - @backstage/plugin-gcp-projects@0.3.35 + - @backstage/plugin-github-actions@0.5.16 + - @backstage/plugin-gocd@0.1.22 + - @backstage/plugin-graphiql@0.2.48 + - @backstage/plugin-home@0.4.32 + - @backstage/plugin-kafka@0.3.16 + - @backstage/plugin-lighthouse@0.4.1 + - @backstage/plugin-linguist@0.1.1 + - @backstage/plugin-newrelic@0.3.34 + - @backstage/plugin-pagerduty@0.5.9 + - @backstage/plugin-rollbar@0.4.16 + - @backstage/plugin-sentry@0.5.1 + - @backstage/plugin-stack-overflow@0.1.12 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.11 + - @backstage/plugin-todo@0.2.18 + - @backstage/plugin-user-settings@0.7.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @internal/plugin-catalog-customized@0.0.8 + - @backstage/plugin-catalog-graph@0.2.28 + - @backstage/app-defaults@1.2.1 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-search-common@1.2.2 + ## 0.2.81-next.2 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index c51f8be911..5902184f89 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.81-next.2", + "version": "0.2.82-next.0", "private": true, "backstage": { "role": "frontend" @@ -72,7 +72,7 @@ "@internal/plugin-catalog-customized": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", "@oriflame/backstage-plugin-score-card": "^0.6.0", "@roadiehq/backstage-plugin-buildkite": "^2.0.8", diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 4dacbbc007..1ee6978a87 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -27,7 +27,7 @@ import { RELATION_PROVIDES_API, } from '@backstage/catalog-model'; import { createApp } from '@backstage/app-defaults'; -import { AppRouter, FlatRoutes } from '@backstage/core-app-api'; +import { AppRouter, FeatureFlagged, FlatRoutes } from '@backstage/core-app-api'; import { AlertDisplay, OAuthRequestDialog, @@ -117,10 +117,13 @@ const app = createApp({ // Custom icon example alert: AlarmIcon, }, - // Example of application level feature flag - // featureFlags: [ - // { name: 'tech-radar', description: 'Enables the tech radar plugin' }, - // ], + featureFlags: [ + { + name: 'scaffolder-next-preview', + description: 'Preview the new Scaffolder Next', + pluginId: '', + }, + ], components: { SignInPage: props => { return ( @@ -208,49 +211,53 @@ const routes = ( - - entity?.metadata?.tags?.includes('recommended') ?? false, - }, - ]} - /> - } - > - - - - - - - - - entity?.metadata?.tags?.includes('recommended') ?? false, - }, - ]} - /> - } - > - - - - - - - + + + entity?.metadata?.tags?.includes('recommended') ?? false, + }, + ]} + /> + } + > + + + + + + + + + + + entity?.metadata?.tags?.includes('recommended') ?? false, + }, + ]} + /> + } + > + + + + + + + + } /> ) => ( - + diff --git a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx index 638fe8bc29..9cf2e8ab35 100644 --- a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx +++ b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx @@ -19,7 +19,7 @@ import { HomePageCompanyLogo, HomePageStarredEntities, TemplateBackstageLogo, - TemplateBackstageLogoIcon + TemplateBackstageLogoIcon, } from '@backstage/plugin-home'; import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { Content, Page, InfoCard } from '@backstage/core-components'; @@ -31,12 +31,12 @@ import { } from '@backstage/plugin-catalog-react'; import { configApiRef } from '@backstage/core-plugin-api'; import { ConfigReader } from '@backstage/config'; +import { HomePageSearchBar, searchPlugin } from '@backstage/plugin-search'; import { - HomePageSearchBar, - searchPlugin, -} from '@backstage/plugin-search'; -import { searchApiRef, SearchContextProvider } from '@backstage/plugin-search-react'; -import { HomePageStackOverflowQuestions } from '@backstage/plugin-stack-overflow'; + searchApiRef, + SearchContextProvider, +} from '@backstage/plugin-search-react'; +import { stackOverflowApiRef, HomePageStackOverflowQuestions } from '@backstage/plugin-stack-overflow'; import { Grid, makeStyles } from '@material-ui/core'; import React, { ComponentType } from 'react'; @@ -79,6 +79,25 @@ const mockCatalogApi = { getEntities: async () => ({ items: entities }), }; +const mockStackOverflowApi = { + listQuestions: async () => [ + { + title: 'Customizing Spotify backstage UI', + link: 'stackoverflow.question/1', + answer_count: 0, + tags: ['backstage'], + owner: { 'some owner': 'name' }, + }, + { + title: 'Customizing Spotify backstage UI', + link: 'stackoverflow.question/1', + answer_count: 0, + tags: ['backstage'], + owner: { 'some owner': 'name' }, + }, + ], +}; + const starredEntitiesApi = new MockStarredEntitiesApi(); starredEntitiesApi.toggleStarred('component:default/example-starred-entity'); starredEntitiesApi.toggleStarred('component:default/example-starred-entity-2'); @@ -93,6 +112,7 @@ export default { <> Promise.resolve({ results: [] }) }], diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 6ea78e983f..ed9deb5037 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/backend-app-api +## 0.4.2-next.0 + +### Patch Changes + +- 8cce2205a39: Register unhandled rejection and uncaught exception handlers to avoid backend crashes. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-node@0.7.7-next.0 + +## 0.4.1 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- 915e46622cf: Add support for `NotImplementedError`, properly returning 501 as status code. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config-loader@1.1.9 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.4.1-next.2 ### Patch Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index f59e39ef09..dda56af96c 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-app-api", "description": "Core API used by Backstage backend apps", - "version": "0.4.1-next.2", + "version": "0.4.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 2a8fa1e720..b2c62c2122 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -165,6 +165,25 @@ export class BackendInitializer { ); await registerInit.init.func(deps); } + + // Once the backend is started, any uncaught errors or unhandled rejections are caught + // and logged, in order to avoid crashing the entire backend on local failures. + if (process.env.NODE_ENV !== 'test') { + const rootLogger = await this.#serviceHolder.get( + coreServices.rootLogger, + 'root', + ); + process.on('unhandledRejection', (reason: Error) => { + rootLogger + ?.child({ type: 'unhandledRejection' }) + ?.error('Unhandled rejection', reason); + }); + process.on('uncaughtException', error => { + rootLogger + ?.child({ type: 'uncaughtException' }) + ?.error('Uncaught exception', error); + }); + } } #resolveInitOrder(registerInits: Array) { diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index 06968a3c8a..3ec4fe5837 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,59 @@ # @backstage/backend-common +## 0.18.4-next.0 + +### Patch Changes + +- 420164593cf: Improve GitlabUrlReader to only load requested sub-path +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/integration-aws-node@0.1.2 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.18.3 + +### Patch Changes + +- f75097868a7: Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres + + The example config below connects to the database as user `v-backstage-123` but sets the ownership of + the create schemas and tables to `backstage` + + ```yaml + backend: + database: + client: pg + pluginDivisionMode: schema + role: backstage + connection: + user: v-backstage-123 + ... + ``` + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 +- c1ee073a82b: Added `lastModifiedAt` field on `UrlReaderService` responses and a `lastModifiedAfter` option to `UrlReaderService.readUrl`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + - @backstage/config-loader@1.1.9 + - @backstage/integration@1.4.3 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/integration-aws-node@0.1.2 + - @backstage/types@1.0.2 + ## 0.18.3-next.2 ### Patch Changes diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index ebdd7315c9..f1d8a74dbe 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -301,6 +301,7 @@ export class FetchUrlReader implements UrlReader { export type FromReadableArrayOptions = Array<{ data: Readable; path: string; + lastModifiedAt?: Date; }>; // @public @@ -635,6 +636,7 @@ export class ReadUrlResponseFactory { // @public export type ReadUrlResponseFactoryFromStreamOptions = { etag?: string; + lastModifiedAt?: Date; }; // @public diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index beee72c860..3f96d5f4ce 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-common", "description": "Common functionality library for Backstage backends", - "version": "0.18.3-next.2", + "version": "0.18.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts index 0bd4d2636f..b37a052c1d 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts @@ -297,23 +297,26 @@ describe('AwsS3UrlReader', () => { ), ), ETag: '123abc', + LastModified: new Date('2020-01-01T00:00:00Z'), }); }); it('returns contents of an object in a bucket via buffer', async () => { - const { buffer, etag } = await reader.readUrl( + const { buffer, etag, lastModifiedAt } = await reader.readUrl( 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml', ); expect(etag).toBe('123abc'); + expect(lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); const response = await buffer(); expect(response.toString().trim()).toBe('site_name: Test'); }); it('returns contents of an object in a bucket via stream', async () => { - const { buffer, etag } = await reader.readUrl( + const { buffer, etag, lastModifiedAt } = await reader.readUrl( 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml', ); expect(etag).toBe('123abc'); + expect(lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); const response = await buffer(); expect(response.toString().trim()).toBe('site_name: Test'); }); @@ -403,6 +406,41 @@ describe('AwsS3UrlReader', () => { }); }); + describe('readUrl with lastModifiedAfter', () => { + const [{ reader }] = createReader({ + integrations: { + awsS3: [ + { + host: 'amazonaws.com', + accessKeyId: 'fake-access-key', + secretAccessKey: 'fake-secret-key', + }, + ], + }, + }); + + beforeEach(() => { + s3Client.reset(); + const t = new S3ServiceException({ + name: '304', + $fault: 'client', + $metadata: { httpStatusCode: 304 }, + }); + s3Client.on(GetObjectCommand).rejects(t); + }); + + it('returns contents of an object in a bucket', async () => { + await expect( + reader.readUrl!( + 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml', + { + lastModifiedAfter: new Date('2020-01-01T00:00:00Z'), + }, + ), + ).rejects.toThrow(NotModifiedError); + }); + }); + describe('readTree', () => { let awsS3UrlReader: AwsS3UrlReader; diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.ts b/packages/backend-common/src/reading/AwsS3UrlReader.ts index d06e2d0ad6..4d4c28071f 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.ts @@ -41,6 +41,7 @@ import { ListObjectsV2Command, ListObjectsV2CommandOutput, GetObjectCommand, + GetObjectCommandInput, } from '@aws-sdk/client-s3'; import { AbortController } from '@aws-sdk/abort-controller'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; @@ -253,6 +254,8 @@ export class AwsS3UrlReader implements UrlReader { url: string, options?: ReadUrlOptions, ): Promise { + const { etag, lastModifiedAfter } = options ?? {}; + try { const { path, bucket, region } = parseUrl(url, this.integration.config); const s3Client = await this.buildS3Client( @@ -262,19 +265,15 @@ export class AwsS3UrlReader implements UrlReader { ); const abortController = new AbortController(); - let params; - if (options?.etag) { - params = { - Bucket: bucket, - Key: path, - IfNoneMatch: options.etag, - }; - } else { - params = { - Bucket: bucket, - Key: path, - }; - } + const params: GetObjectCommandInput = { + Bucket: bucket, + Key: path, + ...(etag && { IfNoneMatch: etag }), + ...(lastModifiedAfter && { + IfModifiedSince: lastModifiedAfter, + }), + }; + options?.signal?.addEventListener('abort', () => abortController.abort()); const getObjectCommand = new GetObjectCommand(params); const response = await s3Client.send(getObjectCommand, { @@ -284,10 +283,10 @@ export class AwsS3UrlReader implements UrlReader { const s3ObjectData = await this.retrieveS3ObjectData( response.Body as Readable, ); - const etag = response.ETag; return ReadUrlResponseFactory.fromReadable(s3ObjectData, { - etag: etag, + etag: response.ETag, + lastModifiedAt: response.LastModified, }); } catch (e) { if (e.$metadata && e.$metadata.httpStatusCode === 304) { @@ -347,6 +346,7 @@ export class AwsS3UrlReader implements UrlReader { responses.push({ data: s3ObjectData, path: String(allObjects[i]), + lastModifiedAt: response?.LastModified ?? undefined, }); } diff --git a/packages/backend-common/src/reading/AzureUrlReader.ts b/packages/backend-common/src/reading/AzureUrlReader.ts index 08e3917b38..90cf8f29bd 100644 --- a/packages/backend-common/src/reading/AzureUrlReader.ts +++ b/packages/backend-common/src/reading/AzureUrlReader.ts @@ -192,6 +192,7 @@ export class AzureUrlReader implements UrlReader { base: url, }), content: file.content, + lastModifiedAt: file.lastModifiedAt, })), }; } diff --git a/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts b/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts index ca6e15a005..c00aeba124 100644 --- a/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts +++ b/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts @@ -156,6 +156,83 @@ describe('BitbucketCloudUrlReader', () => { expect(buffer.toString()).toBe('foo'); expect(result.etag).toBe('new-etag-value'); }); + + it('should be able to readUrl via buffer without If-Modified-Since', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-None-Match')).toBeNull(); + return res( + ctx.status(200), + ctx.body('foo'), + ctx.set('ETag', 'etag-value'), + ctx.set( + 'Last-Modified', + new Date('2020-01-01T00:00:00Z').toUTCString(), + ), + ); + }, + ), + ); + + const result = await reader.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + ); + const buffer = await result.buffer(); + expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); + expect(buffer.toString()).toBe('foo'); + }); + + it('should be throw not modified when If-Modified-Since returns a 304', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-Modified-Since')).toBe( + new Date('1999 12 31 23:59:59 GMT').toUTCString(), + ); + return res(ctx.status(304)); + }, + ), + ); + + await expect( + reader.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') }, + ), + ).rejects.toThrow(NotModifiedError); + }); + + it('should be able to readUrl when If-Modified-Since is before Last-Modified', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-Modified-Since')).toBe( + new Date('1999 12 31 23:59:59 GMT').toUTCString(), + ); + return res( + ctx.status(200), + ctx.set( + 'Last-Modified', + new Date('2020-01-01T00:00:00Z').toUTCString(), + ), + ctx.body('foo'), + ); + }, + ), + ); + + const result = await reader.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') }, + ); + const buffer = await result.buffer(); + expect(buffer.toString()).toBe('foo'); + expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); + }); }); describe('read', () => { diff --git a/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts b/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts index b83e012423..1522b7678d 100644 --- a/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts +++ b/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts @@ -40,6 +40,7 @@ import { UrlReader, } from './types'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket Cloud. @@ -80,7 +81,7 @@ export class BitbucketCloudUrlReader implements UrlReader { url: string, options?: ReadUrlOptions, ): Promise { - const { etag, signal } = options ?? {}; + const { etag, lastModifiedAfter, signal } = options ?? {}; const bitbucketUrl = getBitbucketCloudFileFetchUrl( url, this.integration.config, @@ -95,6 +96,9 @@ export class BitbucketCloudUrlReader implements UrlReader { headers: { ...requestOptions.headers, ...(etag && { 'If-None-Match': etag }), + ...(lastModifiedAfter && { + 'If-Modified-Since': lastModifiedAfter.toUTCString(), + }), }, // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. @@ -115,6 +119,9 @@ export class BitbucketCloudUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } @@ -184,6 +191,7 @@ export class BitbucketCloudUrlReader implements UrlReader { base: url, }), content: file.content, + lastModifiedAt: file.lastModifiedAt, })), }; } diff --git a/packages/backend-common/src/reading/BitbucketServerUrlReader.ts b/packages/backend-common/src/reading/BitbucketServerUrlReader.ts index a97c3b39bb..2b6b5a1f8f 100644 --- a/packages/backend-common/src/reading/BitbucketServerUrlReader.ts +++ b/packages/backend-common/src/reading/BitbucketServerUrlReader.ts @@ -39,6 +39,7 @@ import { UrlReader, } from './types'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket Server APIs. @@ -71,7 +72,7 @@ export class BitbucketServerUrlReader implements UrlReader { url: string, options?: ReadUrlOptions, ): Promise { - const { etag, signal } = options ?? {}; + const { etag, lastModifiedAfter, signal } = options ?? {}; const bitbucketUrl = getBitbucketServerFileFetchUrl( url, this.integration.config, @@ -86,6 +87,9 @@ export class BitbucketServerUrlReader implements UrlReader { headers: { ...requestOptions.headers, ...(etag && { 'If-None-Match': etag }), + ...(lastModifiedAfter && { + 'If-Modified-Since': lastModifiedAfter.toUTCString(), + }), }, // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. @@ -106,6 +110,9 @@ export class BitbucketServerUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } @@ -175,6 +182,7 @@ export class BitbucketServerUrlReader implements UrlReader { base: url, }), content: file.content, + lastModifiedAt: file.lastModifiedAt, })), }; } diff --git a/packages/backend-common/src/reading/BitbucketUrlReader.test.ts b/packages/backend-common/src/reading/BitbucketUrlReader.test.ts index 922480f8e7..15e007d516 100644 --- a/packages/backend-common/src/reading/BitbucketUrlReader.test.ts +++ b/packages/backend-common/src/reading/BitbucketUrlReader.test.ts @@ -204,6 +204,83 @@ describe('BitbucketUrlReader', () => { expect(buffer.toString()).toBe('foo'); expect(result.etag).toBe('new-etag-value'); }); + + it('should be able to readUrl via buffer without If-Modified-Since', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-None-Match')).toBeNull(); + return res( + ctx.status(200), + ctx.body('foo'), + ctx.set('ETag', 'etag-value'), + ctx.set( + 'Last-Modified', + new Date('2020-01-01T00:00:00Z').toUTCString(), + ), + ); + }, + ), + ); + + const result = await bitbucketProcessor.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + ); + const buffer = await result.buffer(); + expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); + expect(buffer.toString()).toBe('foo'); + }); + + it('should be throw not modified when If-Modified-Since returns a 304', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-Modified-Since')).toBe( + new Date('1999 12 31 23:59:59 GMT').toUTCString(), + ); + return res(ctx.status(304)); + }, + ), + ); + + await expect( + bitbucketProcessor.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') }, + ), + ).rejects.toThrow(NotModifiedError); + }); + + it('should be able to readUrl when If-Modified-Since is before Last-Modified', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-Modified-Since')).toBe( + new Date('1999 12 31 23:59:59 GMT').toUTCString(), + ); + return res( + ctx.status(200), + ctx.set( + 'Last-Modified', + new Date('2020-01-01T00:00:00Z').toUTCString(), + ), + ctx.body('foo'), + ); + }, + ), + ); + + const result = await bitbucketProcessor.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') }, + ); + const buffer = await result.buffer(); + expect(buffer.toString()).toBe('foo'); + expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); + }); }); describe('read', () => { diff --git a/packages/backend-common/src/reading/BitbucketUrlReader.ts b/packages/backend-common/src/reading/BitbucketUrlReader.ts index 01539594dd..3a34c725c6 100644 --- a/packages/backend-common/src/reading/BitbucketUrlReader.ts +++ b/packages/backend-common/src/reading/BitbucketUrlReader.ts @@ -41,6 +41,7 @@ import { UrlReader, } from './types'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket v1 and v2 APIs, such @@ -96,7 +97,7 @@ export class BitbucketUrlReader implements UrlReader { url: string, options?: ReadUrlOptions, ): Promise { - const { etag, signal } = options ?? {}; + const { etag, lastModifiedAfter, signal } = options ?? {}; const bitbucketUrl = getBitbucketFileFetchUrl(url, this.integration.config); const requestOptions = getBitbucketRequestOptions(this.integration.config); @@ -106,6 +107,9 @@ export class BitbucketUrlReader implements UrlReader { headers: { ...requestOptions.headers, ...(etag && { 'If-None-Match': etag }), + ...(lastModifiedAfter && { + 'If-Modified-Since': lastModifiedAfter.toUTCString(), + }), }, // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. @@ -126,6 +130,9 @@ export class BitbucketUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } @@ -195,6 +202,7 @@ export class BitbucketUrlReader implements UrlReader { base: url, }), content: file.content, + lastModifiedAt: file.lastModifiedAt, })), }; } diff --git a/packages/backend-common/src/reading/FetchUrlReader.test.ts b/packages/backend-common/src/reading/FetchUrlReader.test.ts index e45117a106..ad834c64ef 100644 --- a/packages/backend-common/src/reading/FetchUrlReader.test.ts +++ b/packages/backend-common/src/reading/FetchUrlReader.test.ts @@ -45,6 +45,21 @@ describe('FetchUrlReader', () => { ); } + if ( + req.headers.get('if-modified-since') && + new Date(req.headers.get('if-modified-since') ?? '') < + new Date('2021-01-01T00:00:00Z') + ) { + return res( + ctx.status(304), + ctx.set('Content-Type', 'text/plain'), + ctx.set( + 'last-modified', + new Date('2021-01-01T00:00:00Z').toUTCString(), + ), + ); + } + return res( ctx.status(200), ctx.set('Content-Type', 'text/plain'), @@ -192,7 +207,7 @@ describe('FetchUrlReader', () => { }); describe('readUrl', () => { - it('should throw NotModified if server responds with 304', async () => { + it('should throw NotModified if server responds with 304 from etag', async () => { await expect( fetchUrlReader.readUrl('https://backstage.io/some-resource', { etag: 'foo', @@ -200,6 +215,14 @@ describe('FetchUrlReader', () => { ).rejects.toThrow(NotModifiedError); }); + it('should throw NotModified if server responds with 304 from lastModifiedAfter', async () => { + await expect( + fetchUrlReader.readUrl('https://backstage.io/some-resource', { + lastModifiedAfter: new Date('2020-01-01T00:00:00Z'), + }), + ).rejects.toThrow(NotModifiedError); + }); + it('should return etag from the response', async () => { const response = await fetchUrlReader.readUrl( 'https://backstage.io/some-resource', diff --git a/packages/backend-common/src/reading/FetchUrlReader.ts b/packages/backend-common/src/reading/FetchUrlReader.ts index 20b78d63c3..90c1cf6c26 100644 --- a/packages/backend-common/src/reading/FetchUrlReader.ts +++ b/packages/backend-common/src/reading/FetchUrlReader.ts @@ -26,6 +26,7 @@ import { } from './types'; import path from 'path'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; const isInRange = (num: number, [start, end]: [number, number]) => { return num >= start && num <= end; @@ -127,6 +128,9 @@ export class FetchUrlReader implements UrlReader { response = await fetch(url, { headers: { ...(options?.etag && { 'If-None-Match': options.etag }), + ...(options?.lastModifiedAfter && { + 'If-Modified-Since': options.lastModifiedAfter.toUTCString(), + }), }, // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. @@ -147,6 +151,9 @@ export class FetchUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } diff --git a/packages/backend-common/src/reading/GiteaUrlReader.test.ts b/packages/backend-common/src/reading/GiteaUrlReader.test.ts index 6c8722d2e5..1860d9f461 100644 --- a/packages/backend-common/src/reading/GiteaUrlReader.test.ts +++ b/packages/backend-common/src/reading/GiteaUrlReader.test.ts @@ -25,7 +25,7 @@ import { UrlReaderPredicateTuple } from './types'; import { DefaultReadTreeResponseFactory } from './tree'; import getRawBody from 'raw-body'; import { GiteaUrlReader } from './GiteaUrlReader'; -import { NotFoundError } from '@backstage/errors'; +import { NotFoundError, NotModifiedError } from '@backstage/errors'; const treeResponseFactory = DefaultReadTreeResponseFactory.create({ config: new ConfigReader({}), @@ -200,5 +200,51 @@ describe('GiteaUrlReader', () => { 'https://gitea.com/owner/project/src/branch/branch2/LICENSE could not be read as https://gitea.com/api/v1/repos/owner/project/contents/LICENSE?ref=branch2, 500 Error!!!', ); }); + + it('should throw NotModified if server responds with 304 from etag', async () => { + worker.use( + rest.get( + 'https://gitea.com/api/v1/repos/owner/project/contents/LICENSE', + (_, res, ctx) => { + return res(ctx.set('ETag', 'foo'), ctx.status(304, 'Error!!!')); + }, + ), + ); + + await expect( + giteaProcessor.readUrl( + 'https://gitea.com/owner/project/src/branch/branch2/LICENSE', + { + etag: 'foo', + }, + ), + ).rejects.toThrow(NotModifiedError); + }); + + it('should throw NotModified if server responds with 304 from lastModifiedAfter', async () => { + worker.use( + rest.get( + 'https://gitea.com/api/v1/repos/owner/project/contents/LICENSE', + (_, res, ctx) => { + return res( + ctx.set( + 'Last-Modified', + new Date('2020-01-01T00:00:00Z').toUTCString(), + ), + ctx.status(304, 'Error!!!'), + ); + }, + ), + ); + + await expect( + giteaProcessor.readUrl( + 'https://gitea.com/owner/project/src/branch/branch2/LICENSE', + { + lastModifiedAfter: new Date('2020-01-01T00:00:00Z'), + }, + ), + ).rejects.toThrow(NotModifiedError); + }); }); }); diff --git a/packages/backend-common/src/reading/GiteaUrlReader.ts b/packages/backend-common/src/reading/GiteaUrlReader.ts index 1471bab608..34542e878e 100644 --- a/packages/backend-common/src/reading/GiteaUrlReader.ts +++ b/packages/backend-common/src/reading/GiteaUrlReader.ts @@ -34,6 +34,7 @@ import { NotModifiedError, } from '@backstage/errors'; import { Readable } from 'stream'; +import { parseLastModified } from './util'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for the Gitea v1 api. @@ -86,6 +87,9 @@ export class GiteaUrlReader implements UrlReader { Readable.from(Buffer.from(content, 'base64')), { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }, ); } diff --git a/packages/backend-common/src/reading/GithubUrlReader.test.ts b/packages/backend-common/src/reading/GithubUrlReader.test.ts index 2315d1f9e8..1ee25920f2 100644 --- a/packages/backend-common/src/reading/GithubUrlReader.test.ts +++ b/packages/backend-common/src/reading/GithubUrlReader.test.ts @@ -247,7 +247,7 @@ describe('GithubUrlReader', () => { ).rejects.toThrow(/rate limit exceeded/); }); - it('should return etag from the response', async () => { + it('should return etag and last-modified from the response', async () => { (mockCredentialsProvider.getCredentials as jest.Mock).mockResolvedValue({ headers: { Authorization: 'bearer blah', @@ -261,6 +261,11 @@ describe('GithubUrlReader', () => { return res( ctx.status(200), ctx.set('Etag', 'foo'), + ctx.set( + 'Last-Modified', + new Date('2021-01-01T00:00:00Z').toUTCString(), + ), + ctx.body('bar'), ); }, @@ -271,6 +276,7 @@ describe('GithubUrlReader', () => { 'https://github.com/backstage/mock/tree/blob/main', ); expect(response.etag).toBe('foo'); + expect(response.lastModifiedAt).toEqual(new Date('2021-01-01T00:00:00Z')); }); }); diff --git a/packages/backend-common/src/reading/GithubUrlReader.ts b/packages/backend-common/src/reading/GithubUrlReader.ts index d91c35621d..ee781daf0b 100644 --- a/packages/backend-common/src/reading/GithubUrlReader.ts +++ b/packages/backend-common/src/reading/GithubUrlReader.ts @@ -40,6 +40,7 @@ import { ReadUrlResponse, } from './types'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; export type GhRepoResponse = RestEndpointMethodTypes['repos']['get']['response']['data']; @@ -109,6 +110,9 @@ export class GithubUrlReader implements UrlReader { headers: { ...credentials?.headers, ...(options?.etag && { 'If-None-Match': options.etag }), + ...(options?.lastModifiedAfter && { + 'If-Modified-Since': options.lastModifiedAfter.toUTCString(), + }), Accept: 'application/vnd.github.v3.raw', }, // TODO(freben): The signal cast is there because pre-3.x versions of @@ -130,6 +134,9 @@ export class GithubUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } @@ -290,6 +297,7 @@ export class GithubUrlReader implements UrlReader { return files.map(file => ({ url: pathToUrl(file.path), content: file.content, + lastModifiedAt: file.lastModifiedAt, })); } diff --git a/packages/backend-common/src/reading/GitlabUrlReader.test.ts b/packages/backend-common/src/reading/GitlabUrlReader.test.ts index 3751ee868e..5af4faf7e5 100644 --- a/packages/backend-common/src/reading/GitlabUrlReader.test.ts +++ b/packages/backend-common/src/reading/GitlabUrlReader.test.ts @@ -184,7 +184,7 @@ describe('GitlabUrlReader', () => { treeResponseFactory, }); - it('should throw NotModified on HTTP 304', async () => { + it('should throw NotModified on HTTP 304 from etag', async () => { worker.use( rest.get('*/api/v4/projects/:name', (_, res, ctx) => res(ctx.status(200), ctx.json({ id: 12345 })), @@ -205,13 +205,44 @@ describe('GitlabUrlReader', () => { ).rejects.toThrow(NotModifiedError); }); - it('should return etag in response', async () => { + it('should throw NotModified on HTTP 304 from lastModifiedAt', async () => { + worker.use( + rest.get('*/api/v4/projects/:name', (_, res, ctx) => + res(ctx.status(200), ctx.json({ id: 12345 })), + ), + rest.get('*', (req, res, ctx) => { + expect(req.headers.get('If-Modified-Since')).toBe( + new Date('2019 12 31 23:59:59 GMT').toUTCString(), + ); + return res(ctx.status(304)); + }), + ); + + await expect( + reader.readUrl!( + 'https://gitlab.com/groupA/teams/teamA/subgroupA/repoA/-/blob/branch/my/path/to/file.yaml', + { + lastModifiedAfter: new Date('2019 12 31 23:59:59 GMT'), + }, + ), + ).rejects.toThrow(NotModifiedError); + }); + + it('should return etag and last-modified in response', async () => { worker.use( rest.get('*/api/v4/projects/:name', (_, res, ctx) => res(ctx.status(200), ctx.json({ id: 12345 })), ), rest.get('*', (_req, res, ctx) => { - return res(ctx.status(200), ctx.set('ETag', '999'), ctx.body('foo')); + return res( + ctx.status(200), + ctx.set('ETag', '999'), + ctx.set( + 'Last-Modified', + new Date('2020 01 01 00:0:00 GMT').toUTCString(), + ), + ctx.body('foo'), + ); }), ); @@ -219,6 +250,7 @@ describe('GitlabUrlReader', () => { 'https://gitlab.com/groupA/teams/teamA/subgroupA/repoA/-/blob/branch/my/path/to/file.yaml', ); expect(result.etag).toBe('999'); + expect(result.lastModifiedAt).toEqual(new Date('2020 01 01 00:0:00 GMT')); const content = await result.buffer(); expect(content.toString()).toBe('foo'); }); @@ -524,6 +556,10 @@ describe('GitlabUrlReader', () => { path.resolve(__dirname, '__fixtures__/gitlab-archive.tar.gz'), ); + const archiveSubPathBuffer = fs.readFileSync( + path.resolve(__dirname, '__fixtures__/gitlab-subpath-archive.tar.gz'), + ); + const projectGitlabApiResponse = { id: 11111111, default_branch: 'main', @@ -534,21 +570,34 @@ describe('GitlabUrlReader', () => { id: 'sha123abc', }, ]; + const commitsOfSubPathGitlabApiResponse = [ + { + id: 'sha456abc', + }, + ]; beforeEach(() => { worker.use( rest.get( 'https://gitlab.com/api/v4/projects/backstage%2Fmock/repository/archive', - (_, res, ctx) => - res( + (req, res, ctx) => { + const filepath = req.url.searchParams.get('path'); + let filename = 'mock-main-sha123abc.zip'; + let body = archiveBuffer; + if (filepath === 'docs') { + filename = 'gitlab-subpath-archive.tar.gz'; + body = archiveSubPathBuffer; + } + return res( ctx.status(200), ctx.set('Content-Type', 'application/zip'), ctx.set( 'content-disposition', - 'attachment; filename="mock-main-sha123abc.zip"', + `attachment; filename="${filename}"`, ), - ctx.body(archiveBuffer), - ), + ctx.body(body), + ); + }, ), rest.get( 'https://gitlab.com/api/v4/projects/backstage%2Fmock', @@ -564,6 +613,14 @@ describe('GitlabUrlReader', () => { (req, res, ctx) => { const refName = req.url.searchParams.get('ref_name'); if (refName === 'main') { + const filepath = req.url.searchParams.get('path'); + if (filepath === 'docs') { + return res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json(commitsOfSubPathGitlabApiResponse), + ); + } return res( ctx.status(200), ctx.set('Content-Type', 'application/json'), @@ -590,6 +647,21 @@ describe('GitlabUrlReader', () => { ); }); + it('load only relevant path', async () => { + const result = await gitlabProcessor.search( + 'https://gitlab.com/backstage/mock/tree/main/docs/**/index.*', + ); + + expect(result.etag).toBe('sha456abc'); + expect(result.files.length).toBe(1); + expect(result.files[0].url).toBe( + 'https://gitlab.com/backstage/mock/tree/main/docs/index.md', + ); + await expect(result.files[0].content()).resolves.toEqual( + Buffer.from('# Test Subpath\n'), + ); + }); + it('throws NotModifiedError when same etag', async () => { await expect( gitlabProcessor.search( diff --git a/packages/backend-common/src/reading/GitlabUrlReader.ts b/packages/backend-common/src/reading/GitlabUrlReader.ts index bebc7453d0..ab59c19b16 100644 --- a/packages/backend-common/src/reading/GitlabUrlReader.ts +++ b/packages/backend-common/src/reading/GitlabUrlReader.ts @@ -26,7 +26,6 @@ import parseGitUrl from 'git-url-parse'; import { Minimatch } from 'minimatch'; import { Readable } from 'stream'; import { NotFoundError, NotModifiedError } from '@backstage/errors'; -import { stripFirstDirectoryFromPath } from './tree/util'; import { ReadTreeResponseFactory, ReaderFactory, @@ -40,6 +39,7 @@ import { } from './types'; import { trimEnd, trimStart } from 'lodash'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files on GitLab. @@ -72,7 +72,7 @@ export class GitlabUrlReader implements UrlReader { url: string, options?: ReadUrlOptions, ): Promise { - const { etag, signal } = options ?? {}; + const { etag, lastModifiedAfter, signal } = options ?? {}; const builtUrl = await this.getGitlabFetchUrl(url); let response: Response; @@ -81,6 +81,9 @@ export class GitlabUrlReader implements UrlReader { headers: { ...getGitLabRequestOptions(this.integration.config).headers, ...(etag && { 'If-None-Match': etag }), + ...(lastModifiedAfter && { + 'If-Modified-Since': lastModifiedAfter.toUTCString(), + }), }, // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. @@ -101,6 +104,9 @@ export class GitlabUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } @@ -156,7 +162,7 @@ export class GitlabUrlReader implements UrlReader { // ref is an empty string if no branch is set in provided url to readTree. const branch = ref || projectGitlabResponseJson.default_branch; - // Fetch the latest commit that modifies the the filepath in the provided or default branch + // Fetch the latest commit that modifies the filepath in the provided or default branch // to compare against the provided sha. const commitsReqParams = new URLSearchParams(); commitsReqParams.set('ref_name', branch); @@ -193,11 +199,16 @@ export class GitlabUrlReader implements UrlReader { throw new NotModifiedError(); } + const archiveReqParams = new URLSearchParams(); + archiveReqParams.set('sha', branch); + if (!!filepath) { + archiveReqParams.set('path', filepath); + } // https://docs.gitlab.com/ee/api/repositories.html#get-file-archive const archiveGitLabResponse = await fetch( `${this.integration.config.apiBaseUrl}/projects/${encodeURIComponent( repoFullName, - )}/repository/archive?sha=${branch}`, + )}/repository/archive?${archiveReqParams.toString()}`, { ...getGitLabRequestOptions(this.integration.config), // TODO(freben): The signal cast is there because pre-3.x versions of @@ -227,30 +238,54 @@ export class GitlabUrlReader implements UrlReader { async search(url: string, options?: SearchOptions): Promise { const { filepath } = parseGitUrl(url); + const staticPart = this.getStaticPart(filepath); const matcher = new Minimatch(filepath); - - // TODO(freben): For now, read the entire repo and filter through that. In - // a future improvement, we could be smart and try to deduce that non-glob - // prefixes (like for filepaths such as some-prefix/**/a.yaml) can be used - // to get just that part of the repo. - const treeUrl = trimEnd(url.replace(filepath, ''), '/'); - + const treeUrl = trimEnd(url.replace(filepath, staticPart), `/`); + const pathPrefix = staticPart ? `${staticPart}/` : ''; const tree = await this.readTree(treeUrl, { etag: options?.etag, signal: options?.signal, - filter: path => matcher.match(stripFirstDirectoryFromPath(path)), + filter: path => matcher.match(`${pathPrefix}${path}`), }); - const files = await tree.files(); + const files = await tree.files(); return { etag: tree.etag, files: files.map(file => ({ - url: this.integration.resolveUrl({ url: `/${file.path}`, base: url }), + url: this.integration.resolveUrl({ + url: `/${pathPrefix}${file.path}`, + base: url, + }), content: file.content, + lastModifiedAt: file.lastModifiedAt, })), }; } + /** + * This function splits the input globPattern string into segments using the path separator /. It then iterates over + * the segments from the end of the array towards the beginning, checking if the concatenated string up to that + * segment matches the original globPattern using the minimatch function. If a match is found, it continues iterating. + * If no match is found, it returns the concatenated string up to the current segment, which is the static part of the + * glob pattern. + * + * E.g. `catalog/foo/*.yaml` will return `catalog/foo`. + * + * @param globPattern the glob pattern + * @private + */ + private getStaticPart(globPattern: string) { + const segments = globPattern.split('/'); + let i = segments.length; + while ( + i > 0 && + new Minimatch(segments.slice(0, i).join('/')).match(globPattern) + ) { + i--; + } + return segments.slice(0, i).join('/'); + } + toString() { const { host, token } = this.integration.config; return `gitlab{host=${host},authed=${Boolean(token)}}`; diff --git a/packages/backend-common/src/reading/ReadUrlResponseFactory.ts b/packages/backend-common/src/reading/ReadUrlResponseFactory.ts index 91d1939c24..69b9c6c16a 100644 --- a/packages/backend-common/src/reading/ReadUrlResponseFactory.ts +++ b/packages/backend-common/src/reading/ReadUrlResponseFactory.ts @@ -61,6 +61,7 @@ export class ReadUrlResponseFactory { return stream; }, etag: options?.etag, + lastModifiedAt: options?.lastModifiedAt, }; } diff --git a/packages/backend-common/src/reading/__fixtures__/gitlab-subpath-archive.tar.gz b/packages/backend-common/src/reading/__fixtures__/gitlab-subpath-archive.tar.gz new file mode 100644 index 0000000000..c41714b452 Binary files /dev/null and b/packages/backend-common/src/reading/__fixtures__/gitlab-subpath-archive.tar.gz differ diff --git a/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts b/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts index eabaa3bc56..1429931142 100644 --- a/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts +++ b/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts @@ -63,6 +63,7 @@ export class ReadableArrayResponse implements ReadTreeResponse { files.push({ path: this.stream[i].path, content: () => getRawBody(this.stream[i].data), + lastModifiedAt: this.stream[i]?.lastModifiedAt, }); } } diff --git a/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts b/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts index f0cbc6a612..1765a41156 100644 --- a/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts +++ b/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts @@ -45,10 +45,12 @@ describe('TarArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: undefined, }, { path: 'docs/index.md', content: expect.any(Function), + lastModifiedAt: undefined, }, ]); const contents = await Promise.all(files.map(f => f.content())); @@ -70,6 +72,7 @@ describe('TarArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: undefined, }, ]); const content = await files[0].content(); @@ -93,10 +96,12 @@ describe('TarArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: undefined, }, { path: 'docs/index.md', content: expect.any(Function), + lastModifiedAt: undefined, }, ]); const contents = await Promise.all(files.map(f => f.content())); diff --git a/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts b/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts index e45a25db66..0b010565dd 100644 --- a/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts +++ b/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts @@ -59,10 +59,12 @@ describe('ZipArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: expect.any(Date), }, { path: 'docs/index.md', content: expect.any(Function), + lastModifiedAt: expect.any(Date), }, ]); @@ -85,6 +87,7 @@ describe('ZipArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: expect.any(Date), }, ]); const content = await files[0].content(); @@ -108,10 +111,12 @@ describe('ZipArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: expect.any(Date), }, { path: 'docs/index.md', content: expect.any(Function), + lastModifiedAt: expect.any(Date), }, ]); const contents = await Promise.all(files.map(f => f.content())); diff --git a/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts b/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts index 5a1c5f9688..1e55150310 100644 --- a/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts +++ b/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts @@ -146,6 +146,9 @@ export class ZipArchiveResponse implements ReadTreeResponse { files.push({ path: this.getInnerPath(entry.fileName), content: async () => await streamToBuffer(content), + lastModifiedAt: entry.lastModFileTime + ? new Date(entry.lastModFileTime) + : undefined, }); }); diff --git a/packages/backend-common/src/reading/types.ts b/packages/backend-common/src/reading/types.ts index 35380029e2..7f4d407fd0 100644 --- a/packages/backend-common/src/reading/types.ts +++ b/packages/backend-common/src/reading/types.ts @@ -65,6 +65,7 @@ export type ReaderFactory = (options: { */ export type ReadUrlResponseFactoryFromStreamOptions = { etag?: string; + lastModifiedAt?: Date; }; /** @@ -95,10 +96,16 @@ export type FromReadableArrayOptions = Array<{ * The raw data itself. */ data: Readable; + /** * The filepath of the data. */ path: string; + + /** + * Last modified date of the file contents. + */ + lastModifiedAt?: Date; }>; /** diff --git a/packages/backend-common/src/reading/util.ts b/packages/backend-common/src/reading/util.ts new file mode 100644 index 0000000000..3d65c2c527 --- /dev/null +++ b/packages/backend-common/src/reading/util.ts @@ -0,0 +1,23 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function parseLastModified(value: string | null | undefined) { + if (!value) { + return undefined; + } + + return new Date(value); +} diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 7283ae89e2..01afac257b 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/backend-defaults +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/backend-plugin-api@0.5.1-next.0 + +## 0.1.8 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- 5d0693edc09: Added a workaround for the cyclic dependency bug across `@backstage/backend-common` and `@backstage/backend-app-api`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + ## 0.1.8-next.2 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 2ae0074849..2f9655384e 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-defaults", "description": "Backend defaults used by Backstage backend apps", - "version": "0.1.8-next.2", + "version": "0.1.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-dev-utils/CHANGELOG.md b/packages/backend-dev-utils/CHANGELOG.md index 84a1cbc3f1..6b505e917e 100644 --- a/packages/backend-dev-utils/CHANGELOG.md +++ b/packages/backend-dev-utils/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/backend-dev-utils +## 0.1.1 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + ## 0.1.1-next.0 ### Patch Changes diff --git a/packages/backend-dev-utils/package.json b/packages/backend-dev-utils/package.json index 9fea6a34cf..0928032977 100644 --- a/packages/backend-dev-utils/package.json +++ b/packages/backend-dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-dev-utils", - "version": "0.1.1-next.0", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index 91ded2391f..39af1fa1c3 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,29 @@ # example-backend-next +## 0.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.1-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @backstage/backend-defaults@0.1.9-next.0 + - @backstage/plugin-app-backend@0.3.44-next.0 + - @backstage/plugin-techdocs-backend@1.6.1-next.0 + - @backstage/plugin-todo-backend@0.1.41-next.0 + +## 0.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/plugin-todo-backend@0.1.40 + - @backstage/plugin-techdocs-backend@1.6.0 + - @backstage/backend-defaults@0.1.8 + - @backstage/plugin-app-backend@0.3.43 + ## 0.0.9-next.2 ### Patch Changes diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index 9f7ec8306a..bed4f10975 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.9-next.2", + "version": "0.0.10-next.0", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,6 +29,12 @@ "@backstage/plugin-app-backend": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-scaffolder-backend": "workspace:^", + "@backstage/plugin-search-backend": "workspace:^", + "@backstage/plugin-search-backend-module-catalog": "workspace:^", + "@backstage/plugin-search-backend-module-explore": "workspace:^", + "@backstage/plugin-search-backend-module-techdocs": "workspace:^", + "@backstage/plugin-search-backend-node": "workspace:^", + "@backstage/plugin-techdocs-backend": "workspace:^", "@backstage/plugin-todo-backend": "workspace:^" }, "devDependencies": { diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts index 8e29244ebf..e3cbbd53b8 100644 --- a/packages/backend-next/src/index.ts +++ b/packages/backend-next/src/index.ts @@ -14,16 +14,35 @@ * limitations under the License. */ -import { catalogPlugin } from '@backstage/plugin-catalog-backend/alpha'; -import { catalogModuleTemplateKind } from '@backstage/plugin-scaffolder-backend/alpha'; import { createBackend } from '@backstage/backend-defaults'; import { appPlugin } from '@backstage/plugin-app-backend/alpha'; import { todoPlugin } from '@backstage/plugin-todo-backend'; +import { techdocsPlugin } from '@backstage/plugin-techdocs-backend/alpha'; +import { catalogPlugin } from '@backstage/plugin-catalog-backend/alpha'; +import { catalogModuleTemplateKind } from '@backstage/plugin-scaffolder-backend/alpha'; +import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; +import { searchModuleCatalogCollator } from '@backstage/plugin-search-backend-module-catalog/alpha'; +import { searchModuleTechDocsCollator } from '@backstage/plugin-search-backend-module-techdocs/alpha'; +import { searchModuleExploreCollator } from '@backstage/plugin-search-backend-module-explore/alpha'; const backend = createBackend(); +backend.add(appPlugin({ appPackageName: 'example-app' })); + +// Todo +backend.add(todoPlugin()); + +// Techdocs +backend.add(techdocsPlugin()); + +// Catalog backend.add(catalogPlugin()); backend.add(catalogModuleTemplateKind()); -backend.add(appPlugin({ appPackageName: 'example-app' })); -backend.add(todoPlugin()); + +// Search +backend.add(searchPlugin()); +backend.add(searchModuleCatalogCollator()); +backend.add(searchModuleTechDocsCollator()); +backend.add(searchModuleExploreCollator()); + backend.start(); diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 5125411eb6..f3cb679fce 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/backend-plugin-api +## 0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + +## 0.5.0 + +### Minor Changes + +- c1ee073a82b: Added `lastModifiedAt` field on `UrlReaderService` responses and a `lastModifiedAfter` option to `UrlReaderService.readUrl`. + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.4.1-next.2 ### Patch Changes diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index 5e64502b78..7dc6ae97b3 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -359,11 +359,13 @@ export type ReadTreeResponseDirOptions = { export type ReadTreeResponseFile = { path: string; content(): Promise; + lastModifiedAt?: Date; }; // @public export type ReadUrlOptions = { etag?: string; + lastModifiedAfter?: Date; signal?: AbortSignal; }; @@ -372,6 +374,7 @@ export type ReadUrlResponse = { buffer(): Promise; stream?(): Readable; etag?: string; + lastModifiedAt?: Date; }; // @public (undocumented) @@ -420,6 +423,7 @@ export type SearchResponse = { export type SearchResponseFile = { url: string; content(): Promise; + lastModifiedAt?: Date; }; // @public (undocumented) diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 4d97fdcd74..6566772f2f 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-plugin-api", "description": "Core API used by Backstage backend plugins", - "version": "0.4.1-next.2", + "version": "0.5.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts b/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts index ef825a7fcd..c189b4a339 100644 --- a/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts +++ b/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts @@ -64,6 +64,26 @@ export type ReadUrlOptions = { */ etag?: string; + /** + * A date which can be provided to check whether a + * {@link UrlReaderService.readUrl} response has changed since the lastModifiedAt. + * + * @remarks + * + * In the {@link UrlReaderService.readUrl} response, an lastModifiedAt is returned + * along with data. The lastModifiedAt date represents the last time the data + * was modified. + * + * When an lastModifiedAfter is given in ReadUrlOptions, {@link UrlReaderService.readUrl} + * will compare the lastModifiedAfter against the lastModifiedAt of the target. If + * the data has not been modified since this date, the {@link UrlReaderService.readUrl} + * will throw a {@link @backstage/errors#NotModifiedError} indicating that the + * response does not contain any new data. If they do not match, + * {@link UrlReaderService.readUrl} will return the rest of the response along with new + * lastModifiedAt date. + */ + lastModifiedAfter?: Date; + /** * An abort signal to pass down to the underlying request. * @@ -102,6 +122,11 @@ export type ReadUrlResponse = { * Can be used to compare and cache responses when doing subsequent calls. */ etag?: string; + + /** + * Last modified date of the file contents. + */ + lastModifiedAt?: Date; }; /** @@ -213,8 +238,20 @@ export type ReadTreeResponse = { * @public */ export type ReadTreeResponseFile = { + /** + * The filepath of the data. + */ path: string; + + /** + * The binary contents of the file. + */ content(): Promise; + + /** + * The last modified timestamp of the data. + */ + lastModifiedAt?: Date; }; /** @@ -278,4 +315,9 @@ export type SearchResponseFile = { * The binary contents of the file. */ content(): Promise; + + /** + * The last modified timestamp of the data. + */ + lastModifiedAt?: Date; }; diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index 7eb43c4677..7d2540d83a 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/backend-tasks +## 0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.5.0 + +### Minor Changes + +- 1578276708a: add functionality to get descriptions from the scheduler for triggering + +### Patch Changes + +- f0685193efa: Added the adapted query to mysql and sqlite3 databases to not returning warning on logs +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.5.0-next.2 ### Minor Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index fa826067c8..4b78b5f5c4 100644 --- a/packages/backend-tasks/package.json +++ b/packages/backend-tasks/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-tasks", "description": "Common distributed task management library for Backstage backends", - "version": "0.5.0-next.2", + "version": "0.5.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { @@ -43,7 +43,7 @@ "luxon": "^3.0.0", "uuid": "^8.0.0", "winston": "^3.2.1", - "zod": "~3.18.0" + "zod": "^3.21.4" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 3b20fe92d5..a1f4e76ea2 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/backend-test-utils +## 0.1.36-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + +## 0.1.35 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.35-next.2 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index e797e346ff..05195f98aa 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-test-utils", "description": "Test helpers library for Backstage backends", - "version": "0.1.35-next.2", + "version": "0.1.36-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 933d9688b9..fd9247bb44 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,107 @@ # example-backend +## 0.2.82-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.1-next.0 + - @backstage/plugin-kubernetes-backend@0.10.0-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.2-next.0 + - @backstage/plugin-auth-backend@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @backstage/plugin-graphql-backend@0.1.34-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.0 + - example-app@0.2.82-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-adr-backend@0.3.2-next.0 + - @backstage/plugin-app-backend@0.3.44-next.0 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-azure-devops-backend@0.3.23-next.0 + - @backstage/plugin-azure-sites-backend@0.1.6-next.0 + - @backstage/plugin-badges-backend@0.1.38-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.0 + - @backstage/plugin-code-coverage-backend@0.2.10-next.0 + - @backstage/plugin-events-backend@0.2.5-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + - @backstage/plugin-explore-backend@0.0.6-next.0 + - @backstage/plugin-jenkins-backend@0.1.34-next.0 + - @backstage/plugin-kafka-backend@0.2.37-next.0 + - @backstage/plugin-lighthouse-backend@0.1.2-next.0 + - @backstage/plugin-linguist-backend@0.2.1-next.0 + - @backstage/plugin-permission-backend@0.5.19-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + - @backstage/plugin-playlist-backend@0.2.7-next.0 + - @backstage/plugin-proxy-backend@0.2.38-next.0 + - @backstage/plugin-rollbar-backend@0.1.41-next.0 + - @backstage/plugin-search-backend@1.2.5-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.5-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.5-next.0 + - @backstage/plugin-search-backend-node@1.1.5-next.0 + - @backstage/plugin-search-common@1.2.2 + - @backstage/plugin-tech-insights-backend@0.5.10-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.0 + - @backstage/plugin-tech-insights-node@0.4.2-next.0 + - @backstage/plugin-techdocs-backend@1.6.1-next.0 + - @backstage/plugin-todo-backend@0.1.41-next.0 + +## 0.2.81 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-todo-backend@0.1.40 + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.4 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/plugin-techdocs-backend@1.6.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/plugin-tech-insights-backend@0.5.9 + - @backstage/plugin-adr-backend@0.3.1 + - @backstage/plugin-auth-backend@0.18.1 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-linguist-backend@0.2.0 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-events-backend@0.2.4 + - @backstage/plugin-app-backend@0.3.43 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/plugin-azure-devops-backend@0.3.22 + - @backstage/plugin-azure-sites-backend@0.1.5 + - @backstage/plugin-code-coverage-backend@0.2.9 + - @backstage/plugin-entity-feedback-backend@0.1.1 + - @backstage/plugin-explore-backend@0.0.5 + - @backstage/plugin-graphql-backend@0.1.33 + - @backstage/plugin-jenkins-backend@0.1.33 + - @backstage/plugin-kubernetes-backend@0.9.4 + - @backstage/plugin-permission-backend@0.5.18 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-playlist-backend@0.2.6 + - @backstage/plugin-proxy-backend@0.2.37 + - @backstage/plugin-rollbar-backend@0.1.40 + - @backstage/plugin-lighthouse-backend@0.1.1 + - @backstage/config@1.0.7 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.11 + - @backstage/plugin-badges-backend@0.1.37 + - example-app@0.2.81 + - @backstage/plugin-search-backend@1.2.4 + - @backstage/plugin-kafka-backend@0.2.36 + - @backstage/plugin-search-backend-module-pg@0.5.4 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + - @backstage/plugin-tech-insights-node@0.4.1 + ## 0.2.81-next.2 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 107a1147f1..22da65099f 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.81-next.2", + "version": "0.2.82-next.0", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend/src/plugins/kubernetes.ts b/packages/backend/src/plugins/kubernetes.ts index 3bc7a5dcbe..3bc6648862 100644 --- a/packages/backend/src/plugins/kubernetes.ts +++ b/packages/backend/src/plugins/kubernetes.ts @@ -27,6 +27,7 @@ export default async function createPlugin( logger: env.logger, config: env.config, catalogApi, + permissions: env.permissions, }).build(); return router; } diff --git a/packages/backend/src/plugins/scaffolder.ts b/packages/backend/src/plugins/scaffolder.ts index d079b64c28..813092c9b9 100644 --- a/packages/backend/src/plugins/scaffolder.ts +++ b/packages/backend/src/plugins/scaffolder.ts @@ -34,5 +34,6 @@ export default async function createPlugin( reader: env.reader, identity: env.identity, scheduler: env.scheduler, + permissionApi: env.permissions, }); } diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index 52eef0291e..edd3811ef8 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/catalog-client +## 1.4.0 + +### Minor Changes + +- 8c030b1826c: Add `queryEntities` method to `CatalogApi`. + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- c630360631f: Ensure that `getEntitiesByRefs` returns `undefined` instead of `null` for missing items +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + ## 1.4.0-next.1 ### Patch Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index f72ce4464a..07709d8c65 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-client", "description": "An isomorphic client for the catalog backend", - "version": "1.4.0-next.1", + "version": "1.4.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-client/src/CatalogClient.test.ts b/packages/catalog-client/src/CatalogClient.test.ts index c235ff1592..53bb55b95f 100644 --- a/packages/catalog-client/src/CatalogClient.test.ts +++ b/packages/catalog-client/src/CatalogClient.test.ts @@ -249,7 +249,7 @@ describe('CatalogClient', () => { { token }, ); - expect(response).toEqual({ items: [entity, null] }); + expect(response).toEqual({ items: [entity, undefined] }); }); }); diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index 4984d394d4..be4ae6289d 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -199,9 +199,11 @@ export class CatalogClient implements CatalogApi { throw await ResponseError.fromResponse(response); } - const { items } = await response.json(); + const { items } = (await response.json()) as { + items: Array; + }; - return { items }; + return { items: items.map(i => i ?? undefined) }; } /** diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md index 08560cbec7..fa20368b86 100644 --- a/packages/catalog-model/CHANGELOG.md +++ b/packages/catalog-model/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/catalog-model +## 1.2.1 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 1.2.1-next.1 ### Patch Changes diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index f6355bd74b..e23d399a37 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-model", "description": "Types and validators that help describe the model of a Backstage Catalog", - "version": "1.2.1-next.1", + "version": "1.2.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/cli-common/CHANGELOG.md b/packages/cli-common/CHANGELOG.md index 030b743fca..bb6e2756a0 100644 --- a/packages/cli-common/CHANGELOG.md +++ b/packages/cli-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/cli-common +## 0.1.12 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + ## 0.1.12-next.0 ### Patch Changes diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index ad7ed92e98..38779eba07 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli-common", "description": "Common functionality used by cli, backend, and create-app", - "version": "0.1.12-next.0", + "version": "0.1.12", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 4db4e1afa1..e88e554b70 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/cli +## 0.22.6-next.0 + +### Patch Changes + +- b9839d7135c: Fixed backend start command on Windows by removing the use of platform dependent path joins. +- c07c3b7364b: Add `onboard` command. While still in development, this command aims to guide users in setting up their Backstage App. +- Updated dependencies + - @backstage/eslint-plugin@0.1.3-next.0 + - @backstage/config@1.0.7 + - @backstage/release-manifests@0.0.9 + - @backstage/cli-common@0.1.12 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.22.4 + +### Patch Changes + +- 1ad8d885d30: Fixed a bug where additional backend package entry points where not properly marked as internal during local development. +- 2011b86052c: Added templates for new plugin Web and Node.js libraries. +- 867f4752ca1: Updated the ESLint plugin configuration that is enabled through `yarn start --check` to only pick up valid source files. +- b4cd145b574: Added a new `migrate package-exports` command that synchronizes package exports fields in all `package.json`s. +- 9bf50a36674: Bumped the `msw` version in templates to 1.0.0 +- 8bf24946c66: Adjust express dependencies to be the same as the rest of the project +- 17271841de8: Updated frontend plugin template to use some more recent features +- 4b4998466b4: Updated dependency `del` to `^7.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- a11b9a23f5a: Keep custom exports entry points in package.json +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/eslint-plugin@0.1.2 + - @backstage/errors@1.1.5 + - @backstage/config-loader@1.1.9 + - @backstage/release-manifests@0.0.9 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.22.4-next.1 ### Patch Changes diff --git a/packages/cli/asset-types/asset-types.d.ts b/packages/cli/asset-types/asset-types.d.ts index 9bd158bb8e..a1c053dc54 100644 --- a/packages/cli/asset-types/asset-types.d.ts +++ b/packages/cli/asset-types/asset-types.d.ts @@ -40,6 +40,11 @@ declare module '*.jpeg' { export default src; } +declare module '*.md' { + const src: string; + export default src; +} + declare module '*.png' { const src: string; export default src; diff --git a/packages/cli/package.json b/packages/cli/package.json index 8c76c7888b..d4b4547225 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli", "description": "CLI for developing Backstage plugins and apps", - "version": "0.22.4-next.1", + "version": "0.22.6-next.0", "publishConfig": { "access": "public" }, @@ -39,6 +39,7 @@ "@backstage/types": "workspace:^", "@esbuild-kit/cjs-loader": "^2.4.1", "@manypkg/get-packages": "^1.1.3", + "@octokit/oauth-app": "^4.2.0", "@octokit/request": "^6.0.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", "@rollup/plugin-commonjs": "^23.0.0", @@ -127,7 +128,7 @@ "yaml": "^2.0.0", "yml-loader": "^2.1.0", "yn": "^4.0.0", - "zod": "~3.18.0" + "zod": "^3.21.4" }, "devDependencies": { "@backstage/backend-common": "workspace:^", diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index ddec5c6a4a..ba11a53cfd 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -25,6 +25,13 @@ const configOption = [ Array(), ] as const; +export function registerOnboardCommand(program: Command) { + program + .command('onboard', { hidden: true }) + .description('Get help setting up your Backstage App.') + .action(lazy(() => import('./onboard').then(m => m.command))); +} + export function registerRepoCommand(program: Command) { const command = program .command('repo [command]') @@ -360,6 +367,7 @@ export function registerCommands(program: Command) { registerRepoCommand(program); registerScriptCommand(program); registerMigrateCommand(program); + registerOnboardCommand(program); program .command('versions:bump') diff --git a/packages/cli/src/commands/onboard/README.md b/packages/cli/src/commands/onboard/README.md new file mode 100644 index 0000000000..0fb4d22666 --- /dev/null +++ b/packages/cli/src/commands/onboard/README.md @@ -0,0 +1,22 @@ +# onboard + +## Local dev + +# Create a new app + +```bash +cd .. +npx @backstage/create-app +cd new-backstage-app + +# Run the modded cli in the new app + +../RELATIVE_PATH_TO_PROJECT/backstage/packages/cli/bin/backstage-cli onboard +? Do you want to set up Authentication for this project? (Y/n) +... + +# Try the app with the new changes + +yarn dev + +``` diff --git a/packages/cli/src/commands/onboard/auth/index.ts b/packages/cli/src/commands/onboard/auth/index.ts new file mode 100644 index 0000000000..0f4537b110 --- /dev/null +++ b/packages/cli/src/commands/onboard/auth/index.ts @@ -0,0 +1,63 @@ +/* + * 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 inquirer from 'inquirer'; +import { Task } from '../../../lib/tasks'; +import { github, Answers as GitHubAnswers } from './providers/github'; +import { gitlab, Answers as GitLabAnswers } from './providers/gitlab'; + +export { type GitHubAnswers, type GitLabAnswers }; + +export async function auth(): Promise<{ + provider: string; + answers: GitHubAnswers | GitLabAnswers; +}> { + const answers = await inquirer.prompt<{ + provider: string; + }>([ + { + type: 'list', + name: 'provider', + message: 'Please select an authentication provider:', + choices: ['GitHub', 'GitLab'], + }, + ]); + + const { provider } = answers; + + let providerAnswers; + switch (provider) { + case 'GitHub': { + providerAnswers = await github(); + break; + } + case 'GitLab': { + providerAnswers = await gitlab(); + break; + } + default: + throw new Error(`Provider ${provider} not implemented yet.`); + } + + Task.log(); + Task.log(`Done setting up ${provider} Authentication!`); + Task.log(); + + return { + provider, + answers: providerAnswers, + }; +} diff --git a/packages/cli/src/commands/onboard/auth/patch.ts b/packages/cli/src/commands/onboard/auth/patch.ts new file mode 100644 index 0000000000..d004eeb157 --- /dev/null +++ b/packages/cli/src/commands/onboard/auth/patch.ts @@ -0,0 +1,43 @@ +/* + * 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 * as fs from 'fs-extra'; +import * as path from 'path'; +import * as differ from 'diff'; +import { PATCH_FOLDER } from '../files'; +import { findPaths } from '@backstage/cli-common'; + +/* eslint-disable-next-line no-restricted-syntax */ +const { targetRoot } = findPaths(__dirname); + +export const patch = async (patchFile: string) => { + const patchContent = await fs.readFile( + path.join(PATCH_FOLDER, patchFile), + 'utf8', + ); + const targetName = patchContent.split('\n')[0].replace('--- a', ''); + const targetFile = path.join(targetRoot, targetName); + const oldContent = await fs.readFile(targetFile, 'utf8'); + const newContent = differ.applyPatch(oldContent, patchContent); + if (!newContent) { + throw new Error( + `Patch ${patchFile} was not applied correctly. + Did you change ${targetName} manually before running this command?`, + ); + } + + return await fs.writeFile(targetFile, newContent, 'utf8'); +}; diff --git a/packages/cli/src/commands/onboard/auth/patches/01-github.Add-SignInPage.patch b/packages/cli/src/commands/onboard/auth/patches/01-github.Add-SignInPage.patch new file mode 100644 index 0000000000..db9f5228e8 --- /dev/null +++ b/packages/cli/src/commands/onboard/auth/patches/01-github.Add-SignInPage.patch @@ -0,0 +1,25 @@ +--- a/packages/app/src/App.tsx ++++ b/packages/app/src/App.tsx +@@ -30 +30,5 @@ import { Root } from './components/Root'; +-import { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components'; ++import { ++ AlertDisplay, ++ OAuthRequestDialog, ++ SignInPage, ++} from '@backstage/core-components'; +@@ -35,0 +40 @@ import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/ ++import { githubAuthApiRef } from '@backstage/core-plugin-api'; +@@ -38,0 +44,14 @@ const app = createApp({ ++ components: { ++ SignInPage: props => ( ++ ++ ), ++ }, \ No newline at end of file diff --git a/packages/cli/src/commands/onboard/auth/patches/02-gitlab.Add-SignInPage.patch b/packages/cli/src/commands/onboard/auth/patches/02-gitlab.Add-SignInPage.patch new file mode 100644 index 0000000000..da849220b8 --- /dev/null +++ b/packages/cli/src/commands/onboard/auth/patches/02-gitlab.Add-SignInPage.patch @@ -0,0 +1,25 @@ +--- a/packages/app/src/App.tsx ++++ b/packages/app/src/App.tsx +@@ -30 +30,5 @@ import { Root } from './components/Root'; +-import { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components'; ++import { ++ AlertDisplay, ++ OAuthRequestDialog, ++ SignInPage, ++} from '@backstage/core-components'; +@@ -35,0 +40 @@ import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/ ++import { gitlabAuthApiRef } from '@backstage/core-plugin-api'; +@@ -38,0 +44,14 @@ const app = createApp({ ++ components: { ++ SignInPage: props => ( ++ ++ ), ++ }, \ No newline at end of file diff --git a/packages/cli/src/commands/onboard/auth/patches/03-gitlab.Change-signIn-resolver.patch b/packages/cli/src/commands/onboard/auth/patches/03-gitlab.Change-signIn-resolver.patch new file mode 100644 index 0000000000..7a69669674 --- /dev/null +++ b/packages/cli/src/commands/onboard/auth/patches/03-gitlab.Change-signIn-resolver.patch @@ -0,0 +1,5 @@ +--- a/packages/backend/src/plugins/auth.ts ++++ b/packages/backend/src/plugins/auth.ts +@@ -38 +38 @@ export default async function createPlugin( +- github: providers.github.create({ ++ gitlab: providers.gitlab.create({ \ No newline at end of file diff --git a/packages/cli/src/commands/onboard/auth/providers/github.ts b/packages/cli/src/commands/onboard/auth/providers/github.ts new file mode 100644 index 0000000000..36c6b02038 --- /dev/null +++ b/packages/cli/src/commands/onboard/auth/providers/github.ts @@ -0,0 +1,147 @@ +/* + * 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 { OAuthApp } from '@octokit/oauth-app'; +import chalk from 'chalk'; +import * as fs from 'fs-extra'; +import inquirer from 'inquirer'; +import { Task } from '../../../../lib/tasks'; +import { updateConfigFile } from '../../config'; +import { APP_CONFIG_FILE, PATCH_FOLDER } from '../../files'; +import { patch } from '../patch'; + +export type Answers = { + clientSecret: string; + clientId: string; + hasEnterprise: boolean; + enterpriseInstanceUrl?: string; +}; + +const validateCredentials = async (clientId: string, clientSecret: string) => { + try { + const app = new OAuthApp({ + clientId, + clientSecret, + }); + await app.createToken({ + code: '%NOT-VALID-CODE%', + }); + } catch (error) { + // @octokit/request returns a error.response object when a request is rejected. + // We can check it to see what kind of error we received. + + // If error.response is successful we can double-check that the error itself was due to the bad code. + // If that's the case then we can assume that the client id and secret exists as we otherwise would + // have gotten a 400/404. + if ( + error.response.status !== 200 && + error.response.data.error !== 'bad_verification_code' + ) { + throw new Error(`Validating GitHub Credentials failed.`); + } + } +}; + +const getConfig = (answers: Answers) => { + const { clientId, clientSecret, hasEnterprise, enterpriseInstanceUrl } = + answers; + + return { + auth: { + providers: { + github: { + development: { + clientId, + clientSecret, + ...(hasEnterprise && { + enterpriseInstanceUrl, + }), + }, + }, + }, + }, + }; +}; + +export const github = async (): Promise => { + Task.log(` + To add GitHub authentication, you must create an OAuth App from the GitHub developer settings: ${chalk.blue( + 'https://github.com/settings/developers', + )} + The Homepage URL should point to Backstage's frontend, while the Authorization callback URL will point to the auth backend. + + Settings for local development: + ${chalk.cyan(` + Homepage URL: http://localhost:3000 + Authorization callback URL: http://localhost:7007/api/auth/github/handler/frame`)} + + You can find the full documentation page here: ${chalk.blue( + 'https://backstage.io/docs/auth/github/provider', + )} + `); + + const answers = await inquirer.prompt([ + { + type: 'input', + name: 'clientId', + message: 'What is your Client Id?', + validate: (input: string) => (input.length ? true : false), + }, + { + type: 'input', + name: 'clientSecret', + message: 'What is your Client Secret?', + validate: (input: string) => (input.length ? true : false), + }, + { + type: 'confirm', + name: 'hasEnterprise', + message: 'Are you using GitHub Enterprise?', + }, + { + type: 'input', + name: 'enterpriseInstanceUrl', + message: 'What is your URL for GitHub Enterprise?', + when: ({ hasEnterprise }) => hasEnterprise, + validate: (input: string) => Boolean(new URL(input)), + }, + ]); + + const { clientId, clientSecret } = answers; + const config = getConfig(answers); + + Task.log('Setting up GitHub Authentication for you...'); + + await Task.forItem( + 'Validating', + 'credentials', + async () => await validateCredentials(clientId, clientSecret), + ); + await Task.forItem( + 'Updating', + APP_CONFIG_FILE, + async () => await updateConfigFile(APP_CONFIG_FILE, config), + ); + + const patches = await fs.readdir(PATCH_FOLDER); + for (const patchFile of patches.filter(p => p.includes('github'))) { + await Task.forItem('Patching', patchFile, async () => { + await patch(patchFile); + }); + } + + return answers; +}; diff --git a/packages/cli/src/commands/onboard/auth/providers/gitlab.ts b/packages/cli/src/commands/onboard/auth/providers/gitlab.ts new file mode 100644 index 0000000000..bc5491111c --- /dev/null +++ b/packages/cli/src/commands/onboard/auth/providers/gitlab.ts @@ -0,0 +1,115 @@ +/* + * 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 chalk from 'chalk'; +import * as fs from 'fs-extra'; +import inquirer from 'inquirer'; +import { Task } from '../../../../lib/tasks'; +import { updateConfigFile } from '../../config'; +import { APP_CONFIG_FILE, PATCH_FOLDER } from '../../files'; +import { patch } from '../patch'; + +const getConfig = (answers: Answers) => { + const { clientId, clientSecret, hasAudience, audience } = answers; + + return { + auth: { + providers: { + gitlab: { + development: { + clientId, + clientSecret, + ...(hasAudience && { + audience, + }), + }, + }, + }, + }, + }; +}; + +export type Answers = { + clientSecret: string; + clientId: string; + hasAudience: boolean; + audience?: string; +}; + +export const gitlab = async (): Promise => { + Task.log(` + To add GitLab authentication, you must create an Application from the GitLab Settings: ${chalk.blue( + 'https://gitlab.com/-/profile/applications', + )} + The Redirect URI should point to your Backstage backend auth handler. + + Settings for local development: + ${chalk.cyan(` + Name: Backstage (or your custom app name) + Redirect URI: http://localhost:7007/api/auth/gitlab/handler/frame + Scopes: read_api and read_user`)} + + You can find the full documentation page here: ${chalk.blue( + 'https://backstage.io/docs/auth/gitlab/provider', + )} + `); + + const answers = await inquirer.prompt([ + { + type: 'input', + name: 'clientId', + message: 'What is your Application Id?', + validate: (input: string) => (input.length ? true : false), + }, + { + type: 'input', + name: 'clientSecret', + message: 'What is your Application Secret?', + validate: (input: string) => (input.length ? true : false), + }, + { + type: 'confirm', + name: 'hasAudience', + message: 'Do you have a self-hosted instance of GitLab?', + }, + { + type: 'input', + name: 'audience', + message: 'What is the URL for your GitLab instance?', + when: ({ hasAudience }) => hasAudience, + validate: (input: string) => Boolean(new URL(input)), + }, + ]); + + const config = getConfig(answers); + + Task.log('Setting up GitLab Authentication for you...'); + + await Task.forItem( + 'Updating', + APP_CONFIG_FILE, + async () => await updateConfigFile(APP_CONFIG_FILE, config), + ); + + const patches = await fs.readdir(PATCH_FOLDER); + for (const patchFile of patches.filter(p => p.includes('gitlab'))) { + await Task.forItem('Patching', patchFile, async () => { + await patch(patchFile); + }); + } + + return answers; +}; diff --git a/packages/cli/src/commands/onboard/command.ts b/packages/cli/src/commands/onboard/command.ts new file mode 100644 index 0000000000..5cf25953ab --- /dev/null +++ b/packages/cli/src/commands/onboard/command.ts @@ -0,0 +1,69 @@ +/* + * 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 chalk from 'chalk'; +import inquirer from 'inquirer'; +import { Task } from '../../lib/tasks'; +import { auth } from './auth'; +import { integrations } from './integrations'; + +export async function command(): Promise { + const answers = await inquirer.prompt<{ + shouldSetupAuth: boolean; + shouldSetupScaffolder: boolean; + }>([ + { + type: 'confirm', + name: 'shouldSetupAuth', + message: 'Do you want to set up Authentication for this project?', + default: true, + }, + { + type: 'confirm', + name: 'shouldSetupScaffolder', + message: 'Do you want to use Software Templates in this project?', + default: true, + }, + ]); + + const { shouldSetupAuth, shouldSetupScaffolder } = answers; + + let providerInfo; + if (shouldSetupAuth) { + providerInfo = await auth(); + } + + if (shouldSetupScaffolder) { + await integrations(providerInfo); + } + + if (!shouldSetupAuth && !shouldSetupScaffolder) { + Task.log( + chalk.yellow( + 'If you change your mind, feel free to re-run this command.', + ), + ); + return; + } + + Task.log(); + Task.log( + `You can now start your app with ${chalk.inverse( + chalk.italic('yarn dev'), + )}`, + ); + Task.log(); +} diff --git a/packages/cli/src/commands/onboard/config.ts b/packages/cli/src/commands/onboard/config.ts new file mode 100644 index 0000000000..cce3119fcc --- /dev/null +++ b/packages/cli/src/commands/onboard/config.ts @@ -0,0 +1,45 @@ +/* + * 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 * as fs from 'fs-extra'; +import yaml from 'yaml'; + +const readYaml = async (file: string) => { + return yaml.parse(await fs.readFile(file, 'utf8')); +}; + +export const updateConfigFile = async (file: string, config: T) => { + const staticContent = + '# Backstage override configuration for your local development environment \n'; + + const content = fs.existsSync(file) + ? yaml.stringify( + { ...(await readYaml(file)), ...config }, + { + indent: 2, + }, + ) + : staticContent.concat( + yaml.stringify( + { ...config }, + { + indent: 2, + }, + ), + ); + + return await fs.writeFile(file, content, 'utf8'); +}; diff --git a/packages/cli/src/commands/onboard/files.ts b/packages/cli/src/commands/onboard/files.ts new file mode 100644 index 0000000000..17f8a0f85e --- /dev/null +++ b/packages/cli/src/commands/onboard/files.ts @@ -0,0 +1,30 @@ +/* + * 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 { findPaths } from '@backstage/cli-common'; +import * as path from 'path'; + +/* eslint-disable-next-line no-restricted-syntax */ +const { targetRoot, ownDir } = findPaths(__dirname); +export const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.local.yaml'); +export const PATCH_FOLDER = path.join( + ownDir, + 'src', + 'commands', + 'onboard', + 'auth', + 'patches', +); diff --git a/packages/cli/src/commands/onboard/index.ts b/packages/cli/src/commands/onboard/index.ts new file mode 100644 index 0000000000..4c23ea6e48 --- /dev/null +++ b/packages/cli/src/commands/onboard/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { command } from './command'; diff --git a/packages/cli/src/commands/onboard/integrations/github.ts b/packages/cli/src/commands/onboard/integrations/github.ts new file mode 100644 index 0000000000..a0538c7ace --- /dev/null +++ b/packages/cli/src/commands/onboard/integrations/github.ts @@ -0,0 +1,136 @@ +/* + * 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 chalk from 'chalk'; +import inquirer from 'inquirer'; +import { Task } from '../../../lib/tasks'; +import { updateConfigFile } from '../config'; +import { APP_CONFIG_FILE } from '../files'; +import { GitHubAnswers } from '../auth'; + +type Answers = { + hasEnterprise: boolean; + enterpriseInstanceUrl: string; + apiBaseUrl: string; +}; + +const getConfig = ({ + hasEnterprise, + apiBaseUrl, + host, + token, +}: { + hasEnterprise: boolean; + apiBaseUrl: string; + host: string; + token: string; +}) => ({ + integrations: { + github: [ + { + host, + token, + ...(hasEnterprise && { + apiBaseUrl, + }), + }, + ], + }, +}); + +export const github = async (providerAnswers?: GitHubAnswers) => { + // TODO(tudi2d): Is GitHub Enterprise a valid setup if there is no Authentication? + const answers = await inquirer.prompt([ + { + type: 'confirm', + name: 'hasEnterprise', + message: 'Are you using GitHub Enterprise?', + when: () => typeof providerAnswers === 'undefined', + }, + { + type: 'input', + name: 'enterpriseInstanceUrl', + message: 'What is your URL for GitHub Enterprise?', + when: ({ hasEnterprise }) => hasEnterprise, + validate: (input: string) => Boolean(new URL(input)), + }, + { + type: 'input', + name: 'apiBaseUrl', + message: 'What is your GitHub Enterprise API path?', + default: '/api/v3', + when: ({ hasEnterprise }) => + hasEnterprise || providerAnswers?.hasEnterprise, + // TODO(tudi2d): Fetch API using OAuth Token if Auth was set up + }, + ]); + + const host = new URL( + providerAnswers?.enterpriseInstanceUrl ?? + answers?.enterpriseInstanceUrl ?? + 'http://github.com', + ); + + Task.log(` + To create new repositories in GitHub using Software Templates you first need to create a personal access token: ${chalk.blue( + `${host.origin}/settings/tokens/new`, + )} + + Select the following scopes: + + Reading software components:${chalk.cyan(` + - "repo"`)} + + Reading organization data:${chalk.cyan(` + - "read:org" + - "read:user" + - "user:email"`)} + + Publishing software templates:${chalk.cyan(` + - "repo" + - "workflow" (if templates include GitHub workflows) + `)} + + You can find the full documentation page here: ${chalk.blue( + 'https://backstage.io/docs/integrations/github/locations', + )} + `); + + const { token } = await inquirer.prompt<{ token: string }>([ + { + type: 'input', + name: 'token', + message: + 'Please insert your personal access token to setup the GitHub Integration', + // TODO(tudi2d): validate + }, + ]); + + const config = getConfig({ + hasEnterprise: providerAnswers?.hasEnterprise ?? answers.hasEnterprise, + apiBaseUrl: host.origin + answers.apiBaseUrl, + host: host.hostname, + token, + }); + + Task.log('Setting up Software Templates using GitHub integration for you...'); + + await Task.forItem( + 'Updating', + APP_CONFIG_FILE, + async () => await updateConfigFile(APP_CONFIG_FILE, config), + ); +}; diff --git a/packages/cli/src/commands/onboard/integrations/index.ts b/packages/cli/src/commands/onboard/integrations/index.ts new file mode 100644 index 0000000000..5cb2f95b38 --- /dev/null +++ b/packages/cli/src/commands/onboard/integrations/index.ts @@ -0,0 +1,75 @@ +/* + * 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 inquirer from 'inquirer'; +import { Task } from '../../../lib/tasks'; +import { GitHubAnswers, GitLabAnswers } from '../auth'; +import { github } from './github'; + +enum Integration { + GITHUB = 'GitHub', +} + +const Integrations: Integration[] = [Integration.GITHUB]; + +export async function integrations(providerInfo?: { + provider: string; + answers: GitHubAnswers | GitLabAnswers; +}): Promise { + const answers = await inquirer.prompt<{ + integration?: Integration; + shouldUsePreviousProvider: boolean; + }>([ + { + type: 'confirm', + name: 'shouldUsePreviousProvider', + message: `Do you want to keep using ${providerInfo?.provider} as your provider when setting up Software Templates?`, + when: () => + providerInfo?.provider && + Object.values(Integrations).includes( + providerInfo!.provider as Integration, + ), + }, + { + // TODO(tudi2d): Let's start with one, but it should be multiple choice in the future + type: 'list', + name: 'integration', + message: 'Please select an integration provider:', + choices: Integrations, + when: ({ shouldUsePreviousProvider }) => !shouldUsePreviousProvider, + }, + ]); + + if (answers.shouldUsePreviousProvider) { + answers.integration = providerInfo!.provider as Integration; + } + + switch (answers.integration) { + case Integration.GITHUB: { + const providerAnswers = + providerInfo?.provider === 'GitHub' + ? (providerInfo!.answers as GitHubAnswers) + : undefined; + await github(providerAnswers); + break; + } + default: + } + + Task.log(); + Task.log(`Done setting up ${answers.integration} Integration!`); + Task.log(); +} diff --git a/packages/cli/src/lib/builder/config.ts b/packages/cli/src/lib/builder/config.ts index ecd755d05b..7bd10cfcc3 100644 --- a/packages/cli/src/lib/builder/config.ts +++ b/packages/cli/src/lib/builder/config.ts @@ -75,116 +75,126 @@ export async function makeRollupConfigs( const distDir = resolvePath(targetDir, 'dist'); const entryPoints = readEntryPoints(targetPkg); - for (const { path, name, ext } of entryPoints) { - if (!SCRIPT_EXTS.includes(ext)) { - continue; - } + const scriptEntryPoints = entryPoints.filter(e => + SCRIPT_EXTS.includes(e.ext), + ); - if (options.outputs.has(Output.cjs) || options.outputs.has(Output.esm)) { - const output = new Array(); - const mainFields = ['module', 'main']; + if (options.outputs.has(Output.cjs) || options.outputs.has(Output.esm)) { + const output = new Array(); + const mainFields = ['module', 'main']; - if (options.outputs.has(Output.cjs)) { - output.push({ - dir: distDir, - entryFileNames: `${name}.cjs.js`, - chunkFileNames: `cjs/${name}/[name]-[hash].cjs.js`, - format: 'commonjs', - sourcemap: true, - }); - } - if (options.outputs.has(Output.esm)) { - output.push({ - dir: distDir, - entryFileNames: `${name}.esm.js`, - chunkFileNames: `esm/${name}/[name]-[hash].esm.js`, - format: 'module', - sourcemap: true, - }); - // Assume we're building for the browser if ESM output is included - mainFields.unshift('browser'); - } - - configs.push({ - input: resolvePath(targetDir, path), - output, - onwarn, - preserveEntrySignatures: 'strict', - // All module imports are always marked as external - external: (source, importer, isResolved) => - Boolean(importer && !isResolved && !isFileImport(source)), - plugins: [ - resolve({ mainFields }), - commonjs({ - include: /node_modules/, - exclude: [/\/[^/]+\.(?:stories|test)\.[^/]+$/], - }), - postcss(), - forwardFileImports({ - exclude: /\.icon\.svg$/, - include: [ - /\.svg$/, - /\.png$/, - /\.gif$/, - /\.jpg$/, - /\.jpeg$/, - /\.eot$/, - /\.woff$/, - /\.woff2$/, - /\.ttf$/, - ], - }), - json(), - yaml(), - svgr({ - include: /\.icon\.svg$/, - template: svgrTemplate, - }), - esbuild({ - target: 'es2019', - minify: options.minify, - }), - ], + if (options.outputs.has(Output.cjs)) { + output.push({ + dir: distDir, + entryFileNames: `[name].cjs.js`, + chunkFileNames: `cjs/[name]-[hash].cjs.js`, + format: 'commonjs', + sourcemap: true, }); } + if (options.outputs.has(Output.esm)) { + output.push({ + dir: distDir, + entryFileNames: `[name].esm.js`, + chunkFileNames: `esm/[name]-[hash].esm.js`, + format: 'module', + sourcemap: true, + }); + // Assume we're building for the browser if ESM output is included + mainFields.unshift('browser'); + } - if (options.outputs.has(Output.types) && !options.useApiExtractor) { - const typesInput = paths.resolveTargetRoot( - 'dist-types', - relativePath(paths.targetRoot, targetDir), - path.replace(/\.ts$/, '.d.ts'), - ); + configs.push({ + input: Object.fromEntries( + scriptEntryPoints.map(e => [e.name, resolvePath(targetDir, e.path)]), + ), + output, + onwarn, + preserveEntrySignatures: 'strict', + // All module imports are always marked as external + external: (source, importer, isResolved) => + Boolean(importer && !isResolved && !isFileImport(source)), + plugins: [ + resolve({ mainFields }), + commonjs({ + include: /node_modules/, + exclude: [/\/[^/]+\.(?:stories|test)\.[^/]+$/], + }), + postcss(), + forwardFileImports({ + exclude: /\.icon\.svg$/, + include: [ + /\.svg$/, + /\.png$/, + /\.gif$/, + /\.jpg$/, + /\.jpeg$/, + /\.eot$/, + /\.woff$/, + /\.woff2$/, + /\.ttf$/, + /\.md$/, + ], + }), + json(), + yaml(), + svgr({ + include: /\.icon\.svg$/, + template: svgrTemplate, + }), + esbuild({ + target: 'es2019', + minify: options.minify, + }), + ], + }); + } - const declarationsExist = await fs.pathExists(typesInput); + if (options.outputs.has(Output.types) && !options.useApiExtractor) { + const input = Object.fromEntries( + scriptEntryPoints.map(e => [ + e.name, + paths.resolveTargetRoot( + 'dist-types', + relativePath(paths.targetRoot, targetDir), + e.path.replace(/\.ts$/, '.d.ts'), + ), + ]), + ); + + for (const path of Object.values(input)) { + const declarationsExist = await fs.pathExists(path); if (!declarationsExist) { - const declarationPath = relativePath(targetDir, typesInput); + const declarationPath = relativePath(targetDir, path); throw new Error( `No declaration files found at ${declarationPath}, be sure to run ${chalk.bgRed.white( 'yarn tsc', )} to generate .d.ts files before packaging`, ); } - - configs.push({ - input: typesInput, - output: { - file: resolvePath(distDir, `${name}.d.ts`), - format: 'es', - }, - external: [ - /\.css$/, - /\.scss$/, - /\.sass$/, - /\.svg$/, - /\.eot$/, - /\.woff$/, - /\.woff2$/, - /\.ttf$/, - ], - onwarn, - plugins: [dts()], - }); } + + configs.push({ + input, + output: { + dir: distDir, + entryFileNames: `[name].d.ts`, + chunkFileNames: `types/[name]-[hash].d.ts`, + format: 'es', + }, + external: [ + /\.css$/, + /\.scss$/, + /\.sass$/, + /\.svg$/, + /\.eot$/, + /\.woff$/, + /\.woff2$/, + /\.ttf$/, + ], + onwarn, + plugins: [dts()], + }); } return configs; diff --git a/packages/cli/src/lib/bundler/config.ts b/packages/cli/src/lib/bundler/config.ts index 01f323a082..6fc7482dce 100644 --- a/packages/cli/src/lib/bundler/config.ts +++ b/packages/cli/src/lib/bundler/config.ts @@ -15,7 +15,7 @@ */ import fs from 'fs-extra'; -import { resolve as resolvePath, join as joinPath } from 'path'; +import { resolve as resolvePath, posix as posixPath } from 'path'; import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'; import HtmlWebpackPlugin from 'html-webpack-plugin'; import ModuleScopePlugin from 'react-dev-utils/ModuleScopePlugin'; @@ -236,7 +236,7 @@ export async function createBackendConfig( const { packages } = await getPackages(cliPaths.targetDir); const localPackageEntryPoints = packages.flatMap(p => { const entryPoints = readEntryPoints((p as ExtendedPackage).packageJson); - return entryPoints.map(e => joinPath(p.packageJson.name, e.mount)); + return entryPoints.map(e => posixPath.join(p.packageJson.name, e.mount)); }); const moduleDirs = packages.map(p => resolvePath(p.dir, 'node_modules')); // See frontend config diff --git a/packages/cli/src/lib/new/factories/index.ts b/packages/cli/src/lib/new/factories/index.ts index 80a24702e0..232e762b91 100644 --- a/packages/cli/src/lib/new/factories/index.ts +++ b/packages/cli/src/lib/new/factories/index.ts @@ -18,4 +18,6 @@ export { frontendPlugin } from './frontendPlugin'; export { backendPlugin } from './backendPlugin'; export { webLibraryPackage } from './webLibraryPackage'; export { pluginCommon } from './pluginCommon'; +export { pluginNode } from './pluginNode'; +export { pluginWeb } from './pluginWeb'; export { scaffolderModule } from './scaffolderModule'; diff --git a/packages/cli/src/lib/new/factories/pluginNode.test.ts b/packages/cli/src/lib/new/factories/pluginNode.test.ts new file mode 100644 index 0000000000..50971ff191 --- /dev/null +++ b/packages/cli/src/lib/new/factories/pluginNode.test.ts @@ -0,0 +1,107 @@ +/* + * 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 fs from 'fs-extra'; +import mockFs from 'mock-fs'; +import { sep, resolve as resolvePath } from 'path'; +import { paths } from '../../paths'; +import { Task } from '../../tasks'; +import { FactoryRegistry } from '../FactoryRegistry'; +import { createMockOutputStream, mockPaths } from './common/testUtils'; +import { pluginNode } from './pluginNode'; + +describe('pluginNode factory', () => { + beforeEach(() => { + mockPaths({ + targetRoot: '/root', + }); + }); + + afterEach(() => { + mockFs.restore(); + jest.resetAllMocks(); + }); + + it('should create a node plugin package', async () => { + mockFs({ + '/root': { + plugins: mockFs.directory(), + }, + [paths.resolveOwn('templates')]: mockFs.load( + paths.resolveOwn('templates'), + ), + }); + + const options = await FactoryRegistry.populateOptions(pluginNode, { + id: 'test', + }); + + let modified = false; + + const [output, mockStream] = createMockOutputStream(); + jest.spyOn(process, 'stderr', 'get').mockReturnValue(mockStream); + jest.spyOn(Task, 'forCommand').mockResolvedValue(); + + await pluginNode.create(options, { + private: true, + isMonoRepo: true, + defaultVersion: '1.0.0', + markAsModified: () => { + modified = true; + }, + createTemporaryDirectory: () => fs.mkdtemp('test'), + }); + + expect(modified).toBe(true); + + expect(output).toEqual([ + '', + 'Creating Node.js plugin library backstage-plugin-test-node', + 'Checking Prerequisites:', + `availability plugins${sep}test-node`, + 'creating temp dir', + 'Executing Template:', + 'copying .eslintrc.js', + 'templating README.md.hbs', + 'templating package.json.hbs', + 'templating index.ts.hbs', + 'copying setupTests.ts', + 'Installing:', + `moving plugins${sep}test-node`, + ]); + + await expect( + fs.readJson('/root/plugins/test-node/package.json'), + ).resolves.toEqual( + expect.objectContaining({ + name: 'backstage-plugin-test-node', + description: 'Node.js library for the test plugin', + private: true, + version: '1.0.0', + }), + ); + + expect(Task.forCommand).toHaveBeenCalledTimes(2); + expect(Task.forCommand).toHaveBeenCalledWith('yarn install', { + cwd: resolvePath('/root/plugins/test-node'), + optional: true, + }); + expect(Task.forCommand).toHaveBeenCalledWith('yarn lint --fix', { + cwd: resolvePath('/root/plugins/test-node'), + optional: true, + }); + }); +}); diff --git a/packages/cli/src/lib/new/factories/pluginNode.ts b/packages/cli/src/lib/new/factories/pluginNode.ts new file mode 100644 index 0000000000..44dbea9fce --- /dev/null +++ b/packages/cli/src/lib/new/factories/pluginNode.ts @@ -0,0 +1,74 @@ +/* + * 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 chalk from 'chalk'; +import { paths } from '../../paths'; +import { addCodeownersEntry, getCodeownersFilePath } from '../../codeowners'; +import { createFactory, CreateContext } from '../types'; +import { Task } from '../../tasks'; +import { ownerPrompt, pluginIdPrompt } from './common/prompts'; +import { executePluginPackageTemplate } from './common/tasks'; + +type Options = { + id: string; + owner?: string; + codeOwnersPath?: string; +}; + +export const pluginNode = createFactory({ + name: 'plugin-node', + description: 'A new Node.js library plugin package', + optionsDiscovery: async () => ({ + codeOwnersPath: await getCodeownersFilePath(paths.targetRoot), + }), + optionsPrompts: [pluginIdPrompt(), ownerPrompt()], + async create(options: Options, ctx: CreateContext) { + const { id } = options; + const suffix = `${id}-node`; + const name = ctx.scope + ? `@${ctx.scope}/plugin-${suffix}` + : `backstage-plugin-${suffix}`; + + Task.log(); + Task.log(`Creating Node.js plugin library ${chalk.cyan(name)}`); + + const targetDir = ctx.isMonoRepo + ? paths.resolveTargetRoot('plugins', suffix) + : paths.resolveTargetRoot(`backstage-plugin-${suffix}`); + + await executePluginPackageTemplate(ctx, { + targetDir, + templateName: 'default-node-plugin-package', + values: { + id, + name, + privatePackage: ctx.private, + npmRegistry: ctx.npmRegistry, + pluginVersion: ctx.defaultVersion, + }, + }); + + if (options.owner) { + await addCodeownersEntry(`/plugins/${suffix}`, options.owner); + } + + await Task.forCommand('yarn install', { cwd: targetDir, optional: true }); + await Task.forCommand('yarn lint --fix', { + cwd: targetDir, + optional: true, + }); + }, +}); diff --git a/packages/cli/src/lib/new/factories/pluginWeb.test.ts b/packages/cli/src/lib/new/factories/pluginWeb.test.ts new file mode 100644 index 0000000000..bcd62f3bcd --- /dev/null +++ b/packages/cli/src/lib/new/factories/pluginWeb.test.ts @@ -0,0 +1,114 @@ +/* + * 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 fs from 'fs-extra'; +import mockFs from 'mock-fs'; +import { sep, resolve as resolvePath } from 'path'; +import { paths } from '../../paths'; +import { Task } from '../../tasks'; +import { FactoryRegistry } from '../FactoryRegistry'; +import { createMockOutputStream, mockPaths } from './common/testUtils'; +import { pluginWeb } from './pluginWeb'; + +describe('pluginWeb factory', () => { + beforeEach(() => { + mockPaths({ + targetRoot: '/root', + }); + }); + + afterEach(() => { + mockFs.restore(); + jest.resetAllMocks(); + }); + + it('should create a react plugin package', async () => { + mockFs({ + '/root': { + plugins: mockFs.directory(), + }, + [paths.resolveOwn('templates')]: mockFs.load( + paths.resolveOwn('templates'), + ), + }); + + const options = await FactoryRegistry.populateOptions(pluginWeb, { + id: 'test', + }); + + let modified = false; + + const [output, mockStream] = createMockOutputStream(); + jest.spyOn(process, 'stderr', 'get').mockReturnValue(mockStream); + jest.spyOn(Task, 'forCommand').mockResolvedValue(); + + await pluginWeb.create(options, { + private: true, + isMonoRepo: true, + defaultVersion: '1.0.0', + markAsModified: () => { + modified = true; + }, + createTemporaryDirectory: () => fs.mkdtemp('test'), + }); + + expect(modified).toBe(true); + + expect(output).toEqual([ + '', + 'Creating web plugin library backstage-plugin-test-react', + 'Checking Prerequisites:', + `availability plugins${sep}test-react`, + 'creating temp dir', + 'Executing Template:', + 'copying .eslintrc.js', + 'templating README.md.hbs', + 'templating package.json.hbs', + 'templating index.ts.hbs', + 'copying setupTests.ts', + 'copying index.ts', + 'copying ExampleComponent.test.tsx', + 'copying ExampleComponent.tsx', + 'copying index.ts', + 'copying index.ts', + 'copying index.ts', + 'copying useExample.ts', + 'Installing:', + `moving plugins${sep}test-react`, + ]); + + await expect( + fs.readJson('/root/plugins/test-react/package.json'), + ).resolves.toEqual( + expect.objectContaining({ + name: 'backstage-plugin-test-react', + description: 'Web library for the test plugin', + private: true, + version: '1.0.0', + }), + ); + + expect(Task.forCommand).toHaveBeenCalledTimes(2); + expect(Task.forCommand).toHaveBeenCalledWith('yarn install', { + cwd: resolvePath('/root/plugins/test-react'), + optional: true, + }); + expect(Task.forCommand).toHaveBeenCalledWith('yarn lint --fix', { + cwd: resolvePath('/root/plugins/test-react'), + optional: true, + }); + }); +}); diff --git a/packages/cli/src/lib/new/factories/pluginWeb.ts b/packages/cli/src/lib/new/factories/pluginWeb.ts new file mode 100644 index 0000000000..8189654eb2 --- /dev/null +++ b/packages/cli/src/lib/new/factories/pluginWeb.ts @@ -0,0 +1,74 @@ +/* + * 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 chalk from 'chalk'; +import { paths } from '../../paths'; +import { addCodeownersEntry, getCodeownersFilePath } from '../../codeowners'; +import { createFactory, CreateContext } from '../types'; +import { Task } from '../../tasks'; +import { ownerPrompt, pluginIdPrompt } from './common/prompts'; +import { executePluginPackageTemplate } from './common/tasks'; + +type Options = { + id: string; + owner?: string; + codeOwnersPath?: string; +}; + +export const pluginWeb = createFactory({ + name: 'plugin-react', + description: 'A new web library plugin package', + optionsDiscovery: async () => ({ + codeOwnersPath: await getCodeownersFilePath(paths.targetRoot), + }), + optionsPrompts: [pluginIdPrompt(), ownerPrompt()], + async create(options: Options, ctx: CreateContext) { + const { id } = options; + const suffix = `${id}-react`; + const name = ctx.scope + ? `@${ctx.scope}/plugin-${suffix}` + : `backstage-plugin-${suffix}`; + + Task.log(); + Task.log(`Creating web plugin library ${chalk.cyan(name)}`); + + const targetDir = ctx.isMonoRepo + ? paths.resolveTargetRoot('plugins', suffix) + : paths.resolveTargetRoot(`backstage-plugin-${suffix}`); + + await executePluginPackageTemplate(ctx, { + targetDir, + templateName: 'default-react-plugin-package', + values: { + id, + name, + privatePackage: ctx.private, + npmRegistry: ctx.npmRegistry, + pluginVersion: ctx.defaultVersion, + }, + }); + + if (options.owner) { + await addCodeownersEntry(`/plugins/${suffix}`, options.owner); + } + + await Task.forCommand('yarn install', { cwd: targetDir, optional: true }); + await Task.forCommand('yarn lint --fix', { + cwd: targetDir, + optional: true, + }); + }, +}); diff --git a/packages/cli/templates/default-node-plugin-package/.eslintrc.js b/packages/cli/templates/default-node-plugin-package/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/packages/cli/templates/default-node-plugin-package/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/cli/templates/default-node-plugin-package/README.md.hbs b/packages/cli/templates/default-node-plugin-package/README.md.hbs new file mode 100644 index 0000000000..a9fc97935e --- /dev/null +++ b/packages/cli/templates/default-node-plugin-package/README.md.hbs @@ -0,0 +1,5 @@ +# {{name}} + +Welcome to the Node.js library package for the {{id}} plugin! + +_This plugin was created through the Backstage CLI_ diff --git a/packages/cli/templates/default-node-plugin-package/package.json.hbs b/packages/cli/templates/default-node-plugin-package/package.json.hbs new file mode 100644 index 0000000000..45becd1bea --- /dev/null +++ b/packages/cli/templates/default-node-plugin-package/package.json.hbs @@ -0,0 +1,36 @@ +{ + "name": "{{name}}", + "description": "Node.js library for the {{id}} plugin", + "version": "{{pluginVersion}}", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", +{{#if privatePackage}} + "private": {{privatePackage}}, +{{/if}} + "publishConfig": { +{{#if npmRegistry}} + "registry": "{{npmRegistry}}", +{{/if}} + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "node-library" + }, + "scripts": { + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "devDependencies": { + "@backstage/cli": "{{versionQuery '@backstage/cli'}}" + }, + "files": [ + "dist" + ] +} diff --git a/packages/cli/templates/default-node-plugin-package/src/index.ts.hbs b/packages/cli/templates/default-node-plugin-package/src/index.ts.hbs new file mode 100644 index 0000000000..355b35c373 --- /dev/null +++ b/packages/cli/templates/default-node-plugin-package/src/index.ts.hbs @@ -0,0 +1,18 @@ +/***/ +/** + * Node.js library for the {{id}} plugin. + * + * @packageDocumentation + */ + +// In this package you might for example export functions that +// help other plugins or modules interact with your plugin. + +/** + * Does something useful. + * + * @public + */ +export function someFunction() { + // ... +} diff --git a/packages/cli/templates/default-node-plugin-package/src/setupTests.ts b/packages/cli/templates/default-node-plugin-package/src/setupTests.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/packages/cli/templates/default-node-plugin-package/src/setupTests.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/cli/templates/default-node-plugin-package/tsconfig.json b/packages/cli/templates/default-node-plugin-package/tsconfig.json new file mode 100644 index 0000000000..5ae9aeb62d --- /dev/null +++ b/packages/cli/templates/default-node-plugin-package/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@backstage/cli/config/tsconfig.json", + "include": ["src"], + "exclude": ["node_modules"], + "compilerOptions": { + "outDir": "dist-types", + "rootDir": "." + } +} diff --git a/packages/cli/templates/default-plugin/package.json.hbs b/packages/cli/templates/default-plugin/package.json.hbs index de42f3cdef..10f893d7dc 100644 --- a/packages/cli/templates/default-plugin/package.json.hbs +++ b/packages/cli/templates/default-plugin/package.json.hbs @@ -33,7 +33,7 @@ "@backstage/theme": "{{versionQuery '@backstage/theme'}}", "@material-ui/core": "{{versionQuery '@material-ui/core' '4.12.2'}}", "@material-ui/icons": "{{versionQuery '@material-ui/icons' '4.9.1'}}", - "@material-ui/lab": "{{versionQuery '@material-ui/lab' '4.0.0-alpha.57'}}", + "@material-ui/lab": "{{versionQuery '@material-ui/lab' '4.0.0-alpha.61'}}", "react-use": "{{versionQuery 'react-use' '17.2.4'}}" }, "peerDependencies": { diff --git a/packages/cli/templates/default-react-plugin-package/.eslintrc.js b/packages/cli/templates/default-react-plugin-package/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/cli/templates/default-react-plugin-package/README.md.hbs b/packages/cli/templates/default-react-plugin-package/README.md.hbs new file mode 100644 index 0000000000..ab1c36da6b --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/README.md.hbs @@ -0,0 +1,5 @@ +# {{name}} + +Welcome to the web library package for the {{id}} plugin! + +_This plugin was created through the Backstage CLI_ diff --git a/packages/cli/templates/default-react-plugin-package/package.json.hbs b/packages/cli/templates/default-react-plugin-package/package.json.hbs new file mode 100644 index 0000000000..e0ee408eda --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/package.json.hbs @@ -0,0 +1,47 @@ +{ + "name": "{{name}}", + "description": "Web library for the {{id}} plugin", + "version": "{{pluginVersion}}", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", +{{#if privatePackage}} + "private": {{privatePackage}}, +{{/if}} + "publishConfig": { +{{#if npmRegistry}} + "registry": "{{npmRegistry}}", +{{/if}} + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "web-library" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/core-plugin-api": "{{versionQuery '@backstage/core-plugin-api'}}", + "@material-ui/core": "{{versionQuery '@material-ui/core' '4.12.2'}}" + }, + "peerDependencies": { + "react": "{{versionQuery 'react' '^16.13.1 || ^17.0.0'}}" + }, + "devDependencies": { + "@backstage/cli": "{{versionQuery '@backstage/cli'}}", + "@backstage/test-utils": "{{versionQuery '@backstage/test-utils'}}", + "@testing-library/jest-dom": "{{versionQuery '@testing-library/jest-dom' '5.10.1'}}", + "@testing-library/react": "{{versionQuery '@testing-library/react' '12.1.3'}}" + }, + "files": [ + "dist" + ] +} diff --git a/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.test.tsx b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.test.tsx new file mode 100644 index 0000000000..c770cca8cb --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.test.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { screen } from '@testing-library/react'; +import { renderInTestApp } from '@backstage/test-utils'; +import { ExampleComponent } from './ExampleComponent'; + +describe('ExampleComponent', () => { + it('should render', async () => { + await renderInTestApp() + + expect(screen.getByText('Hello World')).toBeInTheDocument(); + }); + + it('should display a custom message', async () => { + await renderInTestApp() + + expect(screen.getByText('Hello Example')).toBeInTheDocument(); + }) +}) diff --git a/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.tsx b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.tsx new file mode 100644 index 0000000000..a1ab0937db --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { Typography } from '@material-ui/core'; + +/** + * Props for {@link ExampleComponent}. + * + * @public + */ +export interface ExampleComponentProps { + message?: string; +} + +/** + * Displays an example. + * + * @remarks + * + * Longer descriptions should be put after the `@remarks` tag. That way the initial summary + * will show up in the API docs overview section, while the longer description will only be + * displayed on the page for the specific API. + * + * @public + */ +export function ExampleComponent(props: ExampleComponentProps) { + // By destructuring props here rather than in the signature the API docs will look nicer + const { message = 'Hello World' } = props; + + return {message}; +} diff --git a/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/index.ts b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/index.ts new file mode 100644 index 0000000000..9bb2f2c378 --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/index.ts @@ -0,0 +1,2 @@ +export { ExampleComponent } from './ExampleComponent'; +export type { ExampleComponentProps } from './ExampleComponent'; diff --git a/packages/cli/templates/default-react-plugin-package/src/components/index.ts b/packages/cli/templates/default-react-plugin-package/src/components/index.ts new file mode 100644 index 0000000000..0380b8ce5f --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/src/components/index.ts @@ -0,0 +1,5 @@ +/***/ +// The index file in ./components/ is typically responsible for selecting +// which components are public API and should be exported from the package. + +export * from './ExampleComponent'; diff --git a/packages/cli/templates/default-react-plugin-package/src/hooks/index.ts b/packages/cli/templates/default-react-plugin-package/src/hooks/index.ts new file mode 100644 index 0000000000..cec94f4b04 --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/src/hooks/index.ts @@ -0,0 +1,5 @@ +/***/ +// The index file in ./hooks/ is typically responsible for selecting +// which hooks are public API and should be exported from the package. + +export * from './useExample'; diff --git a/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/index.ts b/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/index.ts new file mode 100644 index 0000000000..f1fd276930 --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/index.ts @@ -0,0 +1 @@ +export { useExample } from './useExample'; diff --git a/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/useExample.ts b/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/useExample.ts new file mode 100644 index 0000000000..911d255238 --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/useExample.ts @@ -0,0 +1,15 @@ +import { useEffect } from 'react'; +import { useApi, alertApiRef } from '@backstage/core-plugin-api'; + +/** + * Shows an example alert. + * + * @public + */ +export function useExample() { + const alertApi = useApi(alertApiRef); + + useEffect(() => { + alertApi.post({ message: 'Hello World!' }); + }, [alertApi]) +} diff --git a/packages/cli/templates/default-react-plugin-package/src/index.ts.hbs b/packages/cli/templates/default-react-plugin-package/src/index.ts.hbs new file mode 100644 index 0000000000..a7ebb26f00 --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/src/index.ts.hbs @@ -0,0 +1,12 @@ +/***/ +/** + * Web library for the {{id}} plugin. + * + * @packageDocumentation + */ + +// In this package you might for example export components or hooks +// that are useful to other plugins or modules. + +export * from './components' +export * from './hooks' diff --git a/packages/cli/templates/default-react-plugin-package/src/setupTests.ts b/packages/cli/templates/default-react-plugin-package/src/setupTests.ts new file mode 100644 index 0000000000..7b0828bfa8 --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/src/setupTests.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom'; diff --git a/packages/cli/templates/default-react-plugin-package/tsconfig.json b/packages/cli/templates/default-react-plugin-package/tsconfig.json new file mode 100644 index 0000000000..ce3409d31f --- /dev/null +++ b/packages/cli/templates/default-react-plugin-package/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@backstage/cli/config/tsconfig.json", + "include": [ + "src", + ], + "exclude": ["node_modules"], + "compilerOptions": { + "outDir": "dist-types", + "rootDir": "." + } +} diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md index 7104ce9cf4..d19c01a7d5 100644 --- a/packages/codemods/CHANGELOG.md +++ b/packages/codemods/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/codemods +## 0.1.44 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/cli-common@0.1.12 + ## 0.1.44-next.0 ### Patch Changes diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 8f4ab51a98..acb0f10dd1 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/codemods", "description": "A collection of codemods for Backstage projects", - "version": "0.1.44-next.0", + "version": "0.1.44", "publishConfig": { "access": "public", "main": "dist/index.cjs.js" diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index 5dbed6c46d..d1eb56d9af 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/config-loader +## 1.1.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 1.1.9-next.0 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index f842f77809..1ef8d41955 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config-loader", "description": "Config loading functionality used by Backstage backend, and CLI", - "version": "1.1.9-next.0", + "version": "1.1.9", "publishConfig": { "access": "public", "main": "dist/index.cjs.js", diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md index c809e158b7..8b20f72905 100644 --- a/packages/config/CHANGELOG.md +++ b/packages/config/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/config +## 1.0.7 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/types@1.0.2 + ## 1.0.7-next.0 ### Patch Changes diff --git a/packages/config/package.json b/packages/config/package.json index 5b8ac4279b..c90b7d4c5f 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config", "description": "Config API used by Backstage core, backend, and CLI", - "version": "1.0.7-next.0", + "version": "1.0.7", "publishConfig": { "access": "public", "main": "dist/index.cjs.js", diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index d91fa44f05..af0ca61ef0 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/core-app-api +## 1.7.0-next.0 + +### Minor Changes + +- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.6.0 + +### Minor Changes + +- 456eaa8cf83: `OAuth2` now gets ID tokens from a session with the `openid` scope explicitly + requested. + + This should not be considered a breaking change, because spec-compliant OIDC + providers will already be returning ID tokens if and only if the `openid` scope + is granted. + + This change makes the dependence explicit, and removes the burden on + OAuth2-based providers which require an ID token (e.g. this is done by various + default [auth + handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add + `openid` to their default scopes. _That_ could carry another indirect benefit: + by removing `openid` from the default scopes for a provider, grants for + resource-specific access tokens can avoid requesting excess ID token-related + scopes. + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + ## 1.6.0-next.2 ### Minor Changes diff --git a/packages/core-app-api/api-report.md b/packages/core-app-api/api-report.md index 37f7a98de0..d7e4a22873 100644 --- a/packages/core-app-api/api-report.md +++ b/packages/core-app-api/api-report.md @@ -25,6 +25,7 @@ import { bitbucketAuthApiRef } from '@backstage/core-plugin-api'; import { bitbucketServerAuthApiRef } from '@backstage/core-plugin-api'; import { ComponentType } from 'react'; import { Config } from '@backstage/config'; +import { ConfigApi } from '@backstage/core-plugin-api'; import { ConfigReader } from '@backstage/config'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { ErrorApi } from '@backstage/core-plugin-api'; @@ -264,6 +265,7 @@ export type AuthApiCreateOptions = { discoveryApi: DiscoveryApi; environment?: string; provider?: AuthProviderInfo; + configApi?: ConfigApi; }; // @public @@ -533,6 +535,7 @@ export class OneLoginAuth { // @public export type OneLoginAuthCreateOptions = { + configApi?: ConfigApi; discoveryApi: DiscoveryApi; oauthRequestApi: OAuthRequestApi; environment?: string; diff --git a/packages/core-app-api/config.d.ts b/packages/core-app-api/config.d.ts index ae876f7fe0..2de1d96114 100644 --- a/packages/core-app-api/config.d.ts +++ b/packages/core-app-api/config.d.ts @@ -115,4 +115,11 @@ export interface Config { */ environment?: string; }; + + /** + $ Enable redirect authentication flow type, instead of a popup for authentication + * default value: 'false' + * @visibility frontend + */ + enableExperimentalRedirectFlow?: boolean; } diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 073a5a22b2..1dda0c58f8 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-app-api", "description": "Core app API used by Backstage apps", - "version": "1.6.0-next.2", + "version": "1.7.0-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -40,7 +40,7 @@ "prop-types": "^15.7.2", "react-use": "^17.2.4", "zen-observable": "^0.10.0", - "zod": "~3.18.0" + "zod": "^3.21.4" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0", diff --git a/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts b/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts index 07ebefca28..3477eec361 100644 --- a/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts +++ b/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts @@ -32,6 +32,7 @@ const DEFAULT_PROVIDER = { export default class AtlassianAuth { static create(options: OAuthApiCreateOptions): typeof atlassianAuthApiRef.T { const { + configApi, discoveryApi, environment = 'development', provider = DEFAULT_PROVIDER, @@ -39,6 +40,7 @@ export default class AtlassianAuth { } = options; return OAuth2.create({ + configApi, discoveryApi, oauthRequestApi, provider, diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts index f4bd7cbe85..1335808280 100644 --- a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts +++ b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts @@ -17,6 +17,7 @@ import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi'; import { UrlPatternDiscovery } from '../../DiscoveryApi'; import BitbucketAuth from './BitbucketAuth'; +import { MockConfigApi } from '@backstage/test-utils'; const getSession = jest.fn(); @@ -32,6 +33,8 @@ describe('BitbucketAuth', () => { jest.resetAllMocks(); }); + const configApi = new MockConfigApi({}); + it.each([ ['team api write_repository', ['team', 'api', 'write_repository']], ['read_repository sudo', ['read_repository', 'sudo']], @@ -39,6 +42,7 @@ describe('BitbucketAuth', () => { const gitlabAuth = BitbucketAuth.create({ oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), + configApi: configApi, }); gitlabAuth.getAccessToken(scope); diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts index 7c5d4f3fc0..7a9f1bc094 100644 --- a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts +++ b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts @@ -47,6 +47,7 @@ const DEFAULT_PROVIDER = { export default class BitbucketAuth { static create(options: OAuthApiCreateOptions): typeof bitbucketAuthApiRef.T { const { + configApi, discoveryApi, environment = 'development', provider = DEFAULT_PROVIDER, @@ -55,6 +56,7 @@ export default class BitbucketAuth { } = options; return OAuth2.create({ + configApi, discoveryApi, oauthRequestApi, provider, diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts index 32e7755a00..5631a9a886 100644 --- a/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts +++ b/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts @@ -17,6 +17,7 @@ import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi'; import { UrlPatternDiscovery } from '../../DiscoveryApi'; import BitbucketServerAuth from './BitbucketServerAuth'; +import { MockConfigApi } from '@backstage/test-utils'; const getSession = jest.fn(); @@ -40,7 +41,10 @@ describe('BitbucketServerAuth', () => { ['PROJECT_ADMIN', 'REPO_READ', 'ACCOUNT_WRITE'], ], ])(`should normalize scopes correctly - %p`, (scope, scopes) => { + const configApi = new MockConfigApi({}); + const bitbucketServerAuth = BitbucketServerAuth.create({ + configApi: configApi, oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), }); diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.ts index dc50eff6ab..b25deffb93 100644 --- a/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.ts +++ b/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.ts @@ -48,6 +48,7 @@ export default class BitbucketServerAuth { options: OAuthApiCreateOptions, ): typeof bitbucketServerAuthApiRef.T { const { + configApi, discoveryApi, environment = 'development', provider = DEFAULT_PROVIDER, @@ -56,6 +57,7 @@ export default class BitbucketServerAuth { } = options; return OAuth2.create({ + configApi, discoveryApi, oauthRequestApi, provider, diff --git a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts index ea7b4ac688..fc77754f6f 100644 --- a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts +++ b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts @@ -17,6 +17,7 @@ import { UrlPatternDiscovery } from '../../DiscoveryApi'; import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi'; import GithubAuth from './GithubAuth'; +import { MockConfigApi } from '@backstage/test-utils'; const getSession = jest.fn(); @@ -32,8 +33,11 @@ describe('GithubAuth', () => { jest.resetAllMocks(); }); + const configApi = new MockConfigApi({}); + it('should forward access token request to session manager', async () => { const githubAuth = GithubAuth.create({ + configApi: configApi, oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), }); diff --git a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts index 7efe4e95c6..943dfa7da4 100644 --- a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts +++ b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts @@ -32,6 +32,7 @@ const DEFAULT_PROVIDER = { export default class GithubAuth { static create(options: OAuthApiCreateOptions): typeof githubAuthApiRef.T { const { + configApi, discoveryApi, environment = 'development', provider = DEFAULT_PROVIDER, @@ -40,6 +41,7 @@ export default class GithubAuth { } = options; return OAuth2.create({ + configApi, discoveryApi, oauthRequestApi, provider, diff --git a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts index 3346af9b7c..6dde0c0334 100644 --- a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts +++ b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts @@ -17,6 +17,7 @@ import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi'; import { UrlPatternDiscovery } from '../../DiscoveryApi'; import GitlabAuth from './GitlabAuth'; +import { MockConfigApi } from '@backstage/test-utils'; const getSession = jest.fn(); @@ -39,7 +40,10 @@ describe('GitlabAuth', () => { ], ['read_repository sudo', ['read_repository', 'sudo']], ])(`should normalize scopes correctly - %p`, (scope, scopes) => { + const configApi = new MockConfigApi({}); + const gitlabAuth = GitlabAuth.create({ + configApi: configApi, oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), }); diff --git a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts index 00085de8ac..c39f5a6e23 100644 --- a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts +++ b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts @@ -32,6 +32,7 @@ const DEFAULT_PROVIDER = { export default class GitlabAuth { static create(options: OAuthApiCreateOptions): typeof gitlabAuthApiRef.T { const { + configApi, discoveryApi, environment = 'development', provider = DEFAULT_PROVIDER, @@ -40,6 +41,7 @@ export default class GitlabAuth { } = options; return OAuth2.create({ + configApi, discoveryApi, oauthRequestApi, provider, diff --git a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts index f8a1c3a1f5..7897eef42e 100644 --- a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts +++ b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts @@ -17,6 +17,7 @@ import GoogleAuth from './GoogleAuth'; import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi'; import { UrlPatternDiscovery } from '../../DiscoveryApi'; +import { MockConfigApi } from '@backstage/test-utils'; const PREFIX = 'https://www.googleapis.com/auth/'; @@ -58,7 +59,10 @@ describe('GoogleAuth', () => { [`${PREFIX}profile`, [`${PREFIX}profile`]], [`${PREFIX}openid`, [`${PREFIX}openid`]], ])(`should normalize scopes correctly - %p`, (scope, scopes) => { + const configApi = new MockConfigApi({}); + const googleAuth = GoogleAuth.create({ + configApi: configApi, oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), }); diff --git a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts index 8a528f4511..f4674ab64f 100644 --- a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts +++ b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts @@ -34,6 +34,7 @@ const SCOPE_PREFIX = 'https://www.googleapis.com/auth/'; export default class GoogleAuth { static create(options: OAuthApiCreateOptions): typeof googleAuthApiRef.T { const { + configApi, discoveryApi, oauthRequestApi, environment = 'development', @@ -46,6 +47,7 @@ export default class GoogleAuth { } = options; return OAuth2.create({ + configApi, discoveryApi, oauthRequestApi, provider, diff --git a/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts index be5776609d..30cfde7c6e 100644 --- a/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts +++ b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts @@ -32,6 +32,7 @@ const DEFAULT_PROVIDER = { export default class MicrosoftAuth { static create(options: OAuthApiCreateOptions): typeof microsoftAuthApiRef.T { const { + configApi, environment = 'development', provider = DEFAULT_PROVIDER, oauthRequestApi, @@ -46,6 +47,7 @@ export default class MicrosoftAuth { } = options; return OAuth2.create({ + configApi, discoveryApi, oauthRequestApi, provider, diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts index 63070120ef..6f941379a7 100644 --- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts +++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts @@ -17,6 +17,7 @@ import OAuth2 from './OAuth2'; import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi'; import { UrlPatternDiscovery } from '../../DiscoveryApi'; +import { MockConfigApi } from '@backstage/test-utils'; const theFuture = new Date(Date.now() + 3600000); const thePast = new Date(Date.now() - 10); @@ -34,12 +35,15 @@ jest.mock('../../../../lib/AuthSessionManager', () => ({ }, })); +const configApi = new MockConfigApi({}); + describe('OAuth2', () => { it('should get refreshed access token', async () => { getSession = jest.fn().mockResolvedValue({ providerInfo: { accessToken: 'access-token', expiresAt: theFuture }, }); const oauth2 = OAuth2.create({ + configApi: configApi, scopeTransform: scopeTransform, oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), @@ -58,6 +62,7 @@ describe('OAuth2', () => { providerInfo: { accessToken: 'access-token', expiresAt: theFuture }, }); const oauth2 = OAuth2.create({ + configApi: configApi, scopeTransform: scopes => scopes.map(scope => `my-prefix/${scope}`), oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), @@ -75,7 +80,9 @@ describe('OAuth2', () => { getSession = jest.fn().mockResolvedValue({ providerInfo: { idToken: 'id-token', expiresAt: theFuture }, }); + const oauth2 = OAuth2.create({ + configApi: configApi, scopeTransform: scopeTransform, oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), @@ -94,6 +101,7 @@ describe('OAuth2', () => { providerInfo: { idToken: 'id-token', expiresAt: theFuture }, }); const oauth2 = OAuth2.create({ + configApi: configApi, scopeTransform: scopes => scopes.map(scope => `my-prefix/${scope}`), oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), @@ -121,6 +129,7 @@ describe('OAuth2', () => { }) .mockRejectedValue(error); const oauth2 = OAuth2.create({ + configApi: configApi, scopeTransform: scopes => scopes.map(scope => `my-prefix/${scope}`), oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), @@ -155,6 +164,7 @@ describe('OAuth2', () => { }, }); const oauth2 = OAuth2.create({ + configApi: configApi, scopeTransform: scopes => scopes.map(scope => `my-prefix/${scope}`), oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts index 6f88178415..44bd5269ea 100644 --- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts +++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts @@ -72,6 +72,7 @@ export default class OAuth2 { static create(options: OAuth2CreateOptions) { const { + configApi, discoveryApi, environment = 'development', provider = DEFAULT_PROVIDER, @@ -81,6 +82,7 @@ export default class OAuth2 } = options; const connector = new DefaultAuthConnector({ + configApi, discoveryApi, environment, provider, diff --git a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts index 6489b326ff..5e7370a947 100644 --- a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts +++ b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts @@ -17,6 +17,7 @@ import OktaAuth from './OktaAuth'; import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi'; import { UrlPatternDiscovery } from '../../DiscoveryApi'; +import { MockConfigApi } from '@backstage/test-utils'; const PREFIX = 'okta.'; @@ -50,7 +51,9 @@ describe('OktaAuth', () => { [`${PREFIX}profile`, [`${PREFIX}profile`]], [`${PREFIX}openid`, [`${PREFIX}openid`]], ])(`should normalize scopes correctly - %p`, (scope, scopes) => { + const configApi = new MockConfigApi({}); const auth = OktaAuth.create({ + configApi: configApi, oauthRequestApi: new MockOAuthApi(), discoveryApi: UrlPatternDiscovery.compile('http://example.com'), }); diff --git a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts index 42c0ddd0ed..c1921a8f93 100644 --- a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts +++ b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts @@ -44,6 +44,7 @@ const OKTA_SCOPE_PREFIX: string = 'okta.'; export default class OktaAuth { static create(options: OAuthApiCreateOptions): typeof oktaAuthApiRef.T { const { + configApi, discoveryApi, environment = 'development', provider = DEFAULT_PROVIDER, @@ -52,6 +53,7 @@ export default class OktaAuth { } = options; return OAuth2.create({ + configApi, discoveryApi, oauthRequestApi, provider, diff --git a/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts b/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts index ea9e2cad28..d8f54e7e50 100644 --- a/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts +++ b/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts @@ -18,6 +18,7 @@ import { oneloginAuthApiRef, OAuthRequestApi, AuthProviderInfo, + ConfigApi, DiscoveryApi, } from '@backstage/core-plugin-api'; import { OAuth2 } from '../oauth2'; @@ -27,6 +28,7 @@ import { OAuth2 } from '../oauth2'; * @public */ export type OneLoginAuthCreateOptions = { + configApi?: ConfigApi; discoveryApi: DiscoveryApi; oauthRequestApi: OAuthRequestApi; environment?: string; @@ -61,6 +63,7 @@ export default class OneLoginAuth { options: OneLoginAuthCreateOptions, ): typeof oneloginAuthApiRef.T { const { + configApi, discoveryApi, environment = 'development', provider = DEFAULT_PROVIDER, @@ -68,6 +71,7 @@ export default class OneLoginAuth { } = options; return OAuth2.create({ + configApi, discoveryApi, oauthRequestApi, provider, diff --git a/packages/core-app-api/src/apis/implementations/auth/types.ts b/packages/core-app-api/src/apis/implementations/auth/types.ts index 55d6c19098..7a74fd3a3b 100644 --- a/packages/core-app-api/src/apis/implementations/auth/types.ts +++ b/packages/core-app-api/src/apis/implementations/auth/types.ts @@ -16,6 +16,7 @@ import { AuthProviderInfo, + ConfigApi, DiscoveryApi, OAuthRequestApi, } from '@backstage/core-plugin-api'; @@ -37,4 +38,5 @@ export type AuthApiCreateOptions = { discoveryApi: DiscoveryApi; environment?: string; provider?: AuthProviderInfo; + configApi?: ConfigApi; }; diff --git a/packages/core-app-api/src/app/types.ts b/packages/core-app-api/src/app/types.ts index 75b8fb2a34..3d9005b0c0 100644 --- a/packages/core-app-api/src/app/types.ts +++ b/packages/core-app-api/src/app/types.ts @@ -45,7 +45,7 @@ export type BootErrorPageProps = { */ export type SignInPageProps = { /** - * Set the IdentityApi on successful sign in. This should only be called once. + * Set the IdentityApi on successful sign-in. This should only be called once. */ onSignInSuccess(identityApi: IdentityApi): void; }; diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts index 2b132e09cd..51da9cbfb5 100644 --- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts +++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts @@ -21,6 +21,8 @@ import { UrlPatternDiscovery } from '../../apis'; import { setupRequestMockHandlers } from '@backstage/test-utils'; import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { ConfigReader } from '@backstage/config'; +import { ConfigApi } from '@backstage/core-plugin-api'; jest.mock('../loginPopup', () => { return { @@ -28,6 +30,10 @@ jest.mock('../loginPopup', () => { }; }); +const configApi: ConfigApi = new ConfigReader({ + enableExperimentalRedirectFlow: false, +}); + const defaultOptions = { discoveryApi: UrlPatternDiscovery.compile('http://my-host/api/{{pluginId}}'), environment: 'production', @@ -42,6 +48,7 @@ const defaultOptions = { scopes: new Set(res.scopes.split(' ')), expiresAt: new Date(Date.now() + expiresInSeconds * 1000), }), + configApi: configApi, }; describe('DefaultAuthConnector', () => { @@ -131,7 +138,7 @@ describe('DefaultAuthConnector', () => { expect(popupSpy).toHaveBeenCalledTimes(1); expect(popupSpy.mock.calls[0][0]).toMatchObject({ - url: 'http://my-host/api/auth/my-provider/start?scope=a%20b&origin=http%3A%2F%2Flocalhost&env=production', + url: 'http://my-host/api/auth/my-provider/start?scope=a%20b&origin=http%3A%2F%2Flocalhost&flow=popup&env=production', }); await expect(sessionPromise).resolves.toEqual({ @@ -179,7 +186,7 @@ describe('DefaultAuthConnector', () => { expect(popupSpy).toHaveBeenCalledTimes(1); expect(popupSpy.mock.calls[0][0]).toMatchObject({ - url: 'http://my-host/api/auth/my-provider/start?scope=-ab-&origin=http%3A%2F%2Flocalhost&env=production', + url: 'http://my-host/api/auth/my-provider/start?scope=-ab-&origin=http%3A%2F%2Flocalhost&flow=popup&env=production', }); }); }); diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts index 988c9f17b1..f2c35b0ba3 100644 --- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts +++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts @@ -13,16 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { - OAuthRequester, - OAuthRequestApi, AuthProviderInfo, + ConfigApi, DiscoveryApi, + OAuthRequestApi, + OAuthRequester, } from '@backstage/core-plugin-api'; import { showLoginPopup } from '../loginPopup'; import { AuthConnector, CreateSessionOptions } from './types'; +let warned = false; + type Options = { /** * DiscoveryApi instance used to locate the auth backend endpoint. @@ -49,6 +51,10 @@ type Options = { * Function used to transform an auth response into the session type. */ sessionTransform?(response: any): AuthSession | Promise; + /** + * ConfigApi instance used to configure authentication flow of pop-up or redirect. + */ + configApi?: ConfigApi; }; function defaultJoinScopes(scopes: Set) { @@ -69,9 +75,10 @@ export class DefaultAuthConnector private readonly joinScopesFunc: (scopes: Set) => string; private readonly authRequester: OAuthRequester; private readonly sessionTransform: (response: any) => Promise; - + private readonly enableExperimentalRedirectFlow: boolean; constructor(options: Options) { const { + configApi, discoveryApi, environment, provider, @@ -80,9 +87,26 @@ export class DefaultAuthConnector sessionTransform = id => id, } = options; + if (!warned && !configApi) { + // eslint-disable-next-line no-console + console.warn( + 'DEPRECATION WARNING: Authentication providers require a configApi instance to configure the authentication flow. Please provide one to the authentication provider constructor.', + ); + warned = true; + } + + this.enableExperimentalRedirectFlow = configApi + ? configApi.getOptionalBoolean('enableExperimentalRedirectFlow') ?? false + : false; + this.authRequester = oauthRequestApi.createAuthRequester({ provider, - onAuthRequest: scopes => this.showPopup(scopes), + onAuthRequest: async scopes => { + if (!this.enableExperimentalRedirectFlow) { + return this.showPopup(scopes); + } + return this.executeRedirect(scopes); + }, }); this.discoveryApi = discoveryApi; @@ -94,6 +118,9 @@ export class DefaultAuthConnector async createSession(options: CreateSessionOptions): Promise { if (options.instantPopup) { + if (this.enableExperimentalRedirectFlow) { + return this.executeRedirect(options.scopes); + } return this.showPopup(options.scopes); } return this.authRequester(options.scopes); @@ -155,6 +182,7 @@ export class DefaultAuthConnector const popupUrl = await this.buildUrl('/start', { scope, origin: window.location.origin, + flow: 'popup', }); const payload = await showLoginPopup({ @@ -168,6 +196,19 @@ export class DefaultAuthConnector return await this.sessionTransform(payload); } + private async executeRedirect(scopes: Set): Promise { + const scope = this.joinScopesFunc(scopes); + // redirect to auth api + window.location.href = await this.buildUrl('/start', { + scope, + origin: window.location.origin, + redirectUrl: window.location.href, + flow: 'redirect', + }); + // return a promise that never resolves + return new Promise(() => {}); + } + private async buildUrl( path: string, query?: { [key: string]: string | boolean | undefined }, diff --git a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts index d31f5e29bf..67d83bb36a 100644 --- a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts +++ b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts @@ -93,7 +93,7 @@ export class RefreshingAuthSessionManager implements SessionManager { // // We skip this check if an instant login popup is requested, as we need to // stay in a synchronous call stack from the user interaction. The downside - // is that that the user will sometimes be requested to log in even if they + // is that the user will sometimes be requested to log in even if they // already had an existing session. if (!this.currentSession && !options.instantPopup) { try { diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 0eac19716d..b8e29342dc 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/core-components +## 0.12.6-next.0 + +### Patch Changes + +- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- 7245e744ab1: Fixed the font color on `BackstageHeaderLabel` to respect the active page theme. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/version-bridge@1.0.3 + +## 0.12.5 + +### Patch Changes + +- 8bbf95b5507: Button labels in the sidebar (previously displayed in uppercase) will be displayed in the case that is provided without any transformations. + For example, a sidebar button with the label "Search" will appear as Search, "search" will appear as search, "SEARCH" will appear as SEARCH etc. + This can potentially affect any overriding styles previously applied to change the appearance of Button labels in the Sidebar. +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- e1aae2f5a0c: Updated the `aria-label` of the `HeaderTabs` component. +- 6a51a49a810: Fix bug where `
` component would not take into account header styles defined in `columns[*].headerStyle`. +- fa004f66871: Use media queries to change layout instead of `isMobile` prop in `BackstagePage` component +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/version-bridge@1.0.3 + ## 0.12.5-next.2 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 9630d7d706..2d83426a09 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-components", "description": "Core components used by Backstage plugins and apps", - "version": "0.12.5-next.2", + "version": "0.12.6-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -40,7 +40,7 @@ "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^20.0.0", "@types/react-sparklines": "^1.7.0", "@types/react-text-truncate": "^0.14.0", @@ -68,7 +68,7 @@ "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", - "zod": "~3.18.0" + "zod": "^3.21.4" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0", diff --git a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx index 02b1afe4a1..0159d8f503 100644 --- a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx +++ b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx @@ -24,7 +24,11 @@ import Button from '@material-ui/core/Button'; import React, { useMemo, useState } from 'react'; import useObservable from 'react-use/lib/useObservable'; import LoginRequestListItem from './LoginRequestListItem'; -import { useApi, oauthRequestApiRef } from '@backstage/core-plugin-api'; +import { + useApi, + configApiRef, + oauthRequestApiRef, +} from '@backstage/core-plugin-api'; import Typography from '@material-ui/core/Typography'; export type OAuthRequestDialogClassKey = @@ -58,6 +62,11 @@ export function OAuthRequestDialog(_props: {}) { const classes = useStyles(); const [busy, setBusy] = useState(false); const oauthRequestApi = useApi(oauthRequestApiRef); + const configApi = useApi(configApiRef); + + const authRedirect = + configApi.getOptionalBoolean('enableExperimentalRedirectFlow') ?? false; + const requests = useObservable( useMemo(() => oauthRequestApi.authRequest$(), [oauthRequestApi]), [], @@ -83,6 +92,11 @@ export function OAuthRequestDialog(_props: {}) { Login Required + {authRedirect ? ( + + This will trigger a http redirect to OAuth Login. + + ) : null} diff --git a/packages/core-components/src/components/Table/Table.test.tsx b/packages/core-components/src/components/Table/Table.test.tsx index ff17409502..ffdca26d98 100644 --- a/packages/core-components/src/components/Table/Table.test.tsx +++ b/packages/core-components/src/components/Table/Table.test.tsx @@ -142,6 +142,62 @@ describe('
', () => { }); }); + describe('with style headers', () => { + describe('with CSS properties object', () => { + it('renders styled headers', async () => { + const columns = [ + column1, + { + ...column2, + headerStyle: { + backgroundColor: 'pink', + }, + }, + ]; + + const rendered = await renderInTestApp( +
, + ); + + expect(rendered.getByText(column1.title).closest('th')).not.toHaveStyle( + { + backgroundColor: 'pink', + }, + ); + expect(rendered.getByText(column2.title).closest('th')).toHaveStyle({ + backgroundColor: 'pink', + }); + }); + + it('renders styled headers with highlight', async () => { + const columns = [ + { + ...column1, + highlight: true, + }, + { + ...column2, + highlight: true, + headerStyle: { + backgroundColor: 'pink', + }, + }, + ]; + + const rendered = await renderInTestApp( +
, + ); + + const column1Header = rendered.getByText(column1.title).closest('th'); + expect(column1Header?.style.backgroundColor).toBe(''); + expect(column1Header?.style.color).toBe('rgb(0, 0, 0)'); + const column2Header = rendered.getByText(column2.title).closest('th'); + expect(column2Header?.style.backgroundColor).toBe('pink'); + expect(column2Header?.style.color).toBe('rgb(0, 0, 0)'); + }); + }); + }); + it('renders with subtitle', async () => { const rendered = await renderInTestApp(
, diff --git a/packages/core-components/src/components/Table/Table.tsx b/packages/core-components/src/components/Table/Table.tsx index 89a1d69b96..c43345c9d2 100644 --- a/packages/core-components/src/components/Table/Table.tsx +++ b/packages/core-components/src/components/Table/Table.tsx @@ -169,7 +169,7 @@ function convertColumns( theme: BackstageTheme, ): TableColumn[] { return columns.map(column => { - const headerStyle: React.CSSProperties = {}; + const headerStyle: React.CSSProperties = column.headerStyle ?? {}; let cellStyle = column.cellStyle || {}; diff --git a/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx index e3b6299f85..0ea2e163a7 100644 --- a/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx +++ b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx @@ -14,8 +14,9 @@ * limitations under the License. */ +import { BackstageTheme } from '@backstage/theme'; import Grid from '@material-ui/core/Grid'; -import { makeStyles } from '@material-ui/core/styles'; +import { alpha, makeStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; import React from 'react'; import { Link } from '../../components/Link'; @@ -23,13 +24,13 @@ import { Link } from '../../components/Link'; /** @public */ export type HeaderLabelClassKey = 'root' | 'label' | 'value'; -const useStyles = makeStyles( +const useStyles = makeStyles( theme => ({ root: { textAlign: 'left', }, label: { - color: theme.palette.common.white, + color: theme.page.fontColor, fontWeight: theme.typography.fontWeightBold, letterSpacing: 0, fontSize: theme.typography.fontSize, @@ -37,7 +38,7 @@ const useStyles = makeStyles( lineHeight: 1, }, value: { - color: 'rgba(255, 255, 255, 0.8)', + color: alpha(theme.page.fontColor, 0.8), fontSize: theme.typography.fontSize, lineHeight: 1, }, @@ -50,9 +51,16 @@ type HeaderLabelContentProps = { className: string; }; -const HeaderLabelContent = ({ value, className }: HeaderLabelContentProps) => ( - {value} -); +const HeaderLabelContent = ({ value, className }: HeaderLabelContentProps) => { + return ( + + {value} + + ); +}; type HeaderLabelProps = { label: string; diff --git a/packages/core-components/src/layout/SignInPage/commonProvider.tsx b/packages/core-components/src/layout/SignInPage/commonProvider.tsx index 8f426a3907..1827981e6f 100644 --- a/packages/core-components/src/layout/SignInPage/commonProvider.tsx +++ b/packages/core-components/src/layout/SignInPage/commonProvider.tsx @@ -29,17 +29,24 @@ import { GridItem } from './styles'; import { ForwardedError } from '@backstage/errors'; import { UserIdentity } from './UserIdentity'; -const Component: ProviderComponent = ({ config, onSignInSuccess }) => { +const Component: ProviderComponent = ({ + config, + onSignInStarted, + onSignInSuccess, + onSignInFailure, +}) => { const { apiRef, title, message } = config as SignInProviderConfig; const authApi = useApi(apiRef); const errorApi = useApi(errorApiRef); const handleLogin = async () => { try { + onSignInStarted(); const identityResponse = await authApi.getBackstageIdentity({ instantPopup: true, }); if (!identityResponse) { + onSignInFailure(); throw new Error( `The ${title} provider is not configured to support sign-in`, ); @@ -55,6 +62,7 @@ const Component: ProviderComponent = ({ config, onSignInSuccess }) => { }), ); } catch (error) { + onSignInFailure(); errorApi.post(new ForwardedError('Login failed', error)); } }; diff --git a/packages/core-components/src/layout/SignInPage/customProvider.tsx b/packages/core-components/src/layout/SignInPage/customProvider.tsx index 101c74d3cd..ad02715447 100644 --- a/packages/core-components/src/layout/SignInPage/customProvider.tsx +++ b/packages/core-components/src/layout/SignInPage/customProvider.tsx @@ -61,7 +61,7 @@ const asInputRef = (renderResult: UseFormRegisterReturn) => { }; }; -const Component: ProviderComponent = ({ onSignInSuccess }) => { +const Component: ProviderComponent = ({ onSignInStarted, onSignInSuccess }) => { const classes = useFormStyles(); const { register, handleSubmit, formState } = useForm({ mode: 'onChange', @@ -70,6 +70,7 @@ const Component: ProviderComponent = ({ onSignInSuccess }) => { const { errors } = formState; const handleResult = ({ userId, idToken }: Data) => { + onSignInStarted(); onSignInSuccess( UserIdentity.fromLegacy({ userId, diff --git a/packages/core-components/src/layout/SignInPage/guestProvider.tsx b/packages/core-components/src/layout/SignInPage/guestProvider.tsx index b2370a98d5..5393c1ea89 100644 --- a/packages/core-components/src/layout/SignInPage/guestProvider.tsx +++ b/packages/core-components/src/layout/SignInPage/guestProvider.tsx @@ -22,7 +22,7 @@ import { GridItem } from './styles'; import { ProviderComponent, ProviderLoader, SignInProvider } from './types'; import { GuestUserIdentity } from './GuestUserIdentity'; -const Component: ProviderComponent = ({ onSignInSuccess }) => ( +const Component: ProviderComponent = ({ onSignInStarted, onSignInSuccess }) => ( ( diff --git a/packages/core-components/src/layout/SignInPage/providers.tsx b/packages/core-components/src/layout/SignInPage/providers.tsx index 23d6c95b3c..e456a6948b 100644 --- a/packages/core-components/src/layout/SignInPage/providers.tsx +++ b/packages/core-components/src/layout/SignInPage/providers.tsx @@ -134,6 +134,7 @@ export const useSignInProviders = ( .loader(apiHolder, provider.config?.apiRef!) .then(result => { if (didCancel) { + localStorage.removeItem(PROVIDER_STORAGE_KEY); return; } if (result) { @@ -143,10 +144,10 @@ export const useSignInProviders = ( } }) .catch(error => { + localStorage.removeItem(PROVIDER_STORAGE_KEY); if (didCancel) { return; } - localStorage.removeItem(PROVIDER_STORAGE_KEY); errorApi.post(error); setLoading(false); }); @@ -172,16 +173,27 @@ export const useSignInProviders = ( const { Component } = provider.components; const handleSignInSuccess = (result: IdentityApi) => { - localStorage.setItem(PROVIDER_STORAGE_KEY, provider.id); - handleWrappedResult(result); }; + const handleSignInStarted = () => { + localStorage.setItem( + PROVIDER_STORAGE_KEY, + provider?.config?.id || provider.id, + ); + }; + + const handleSignInFailure = () => { + localStorage.removeItem(PROVIDER_STORAGE_KEY); + }; + return ( ); }), diff --git a/packages/core-components/src/layout/SignInPage/types.ts b/packages/core-components/src/layout/SignInPage/types.ts index 8a0430a27d..a7e1ca62c2 100644 --- a/packages/core-components/src/layout/SignInPage/types.ts +++ b/packages/core-components/src/layout/SignInPage/types.ts @@ -35,8 +35,21 @@ export type SignInProviderConfig = { /** @public */ export type IdentityProviders = ('guest' | 'custom' | SignInProviderConfig)[]; +/** + * Invoked when the sign-in process has failed. + */ +export type onSignInFailure = () => void; +/** + * Invoked when the sign-in process has started. + */ +export type onSignInStarted = () => void; + export type ProviderComponent = ComponentType< - SignInPageProps & { config: SignInProviderConfig } + SignInPageProps & { + config: SignInProviderConfig; + onSignInStarted(): void; + onSignInFailure(): void; + } >; export type ProviderLoader = ( diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index 1001c01e52..9292367463 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/core-plugin-api +## 1.5.0 + +### Minor Changes + +- ab750ddc4f2: The GitLab auth provider can now be used to get OpenID tokens. + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + ## 1.5.0-next.2 ### Minor Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 335f0f0efd..283e2b7e34 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-plugin-api", "description": "Core API used by Backstage plugins", - "version": "1.5.0-next.2", + "version": "1.5.0", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index b17da7ba7b..3ce499d386 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/create-app +## 0.4.39-next.0 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## 0.4.38 + +### Patch Changes + +- b4627f23b28: Bumped create-app version. +- 0eceadb9502: Bumped create-app version. +- 482dae5de1c: Updated link to docs. +- 6ace2dd2c58: Added to the template `packages/app/.eslintignore` file to packages to ignore the contents of `packages/app/public`. +- Updated dependencies + - @backstage/cli-common@0.1.12 + ## 0.4.38-next.2 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 4097e3bd57..264ca6e017 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/create-app", "description": "A CLI that helps you create your own Backstage app", - "version": "0.4.38-next.2", + "version": "0.4.39-next.0", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts index ef46f07870..fd424a3257 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts @@ -17,5 +17,6 @@ export default async function createPlugin( reader: env.reader, catalogClient, identity: env.identity, + permissionApi: env.permissions, }); } diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 85a0c81ee7..e151728a1b 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/dev-utils +## 1.0.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/app-defaults@1.3.0-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/test-utils@1.3.0-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 1.0.13 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/app-defaults@1.2.1 + ## 1.0.13-next.2 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index d4f120b359..0568a44472 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/dev-utils", "description": "Utilities for developing Backstage plugins.", - "version": "1.0.13-next.2", + "version": "1.0.14-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index 7c3dcdbc36..a3c5ffa88e 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,23 @@ # e2e-test +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.39-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.1.5 + +## 0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.38 + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + ## 0.2.1-next.2 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index f8c6f815e8..833c5a1eca 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,7 +1,7 @@ { "name": "e2e-test", "description": "E2E test for verifying Backstage packages", - "version": "0.2.1-next.2", + "version": "0.2.2-next.0", "private": true, "backstage": { "role": "cli" diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index 88b0c4b8d1..398b058bbb 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/errors +## 1.1.5 + +### Patch Changes + +- 3bf83a2aabf: Added `NotImplementedError`, which can be used when the server does not recognize the request method and is incapable of supporting it for any resource. +- Updated dependencies + - @backstage/types@1.0.2 + ## 1.1.5-next.0 ### Patch Changes diff --git a/packages/errors/package.json b/packages/errors/package.json index 7eeacb0e81..1f4da3b2b2 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/errors", "description": "Common utilities for error handling within Backstage", - "version": "1.1.5-next.0", + "version": "1.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md index 7e5a3efbae..5a3b5dc5c4 100644 --- a/packages/eslint-plugin/CHANGELOG.md +++ b/packages/eslint-plugin/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/eslint-plugin +## 0.1.3-next.0 + +### Patch Changes + +- 911c25de59c: Add support for auto-fixing missing imports detected by the `no-undeclared-imports` rule. + +## 0.1.2 + +### Patch Changes + +- a061c466d66: Fixing a bug that we should check internal dependencies too + ## 0.1.2-next.0 ### Patch Changes diff --git a/packages/eslint-plugin/lib/getPackages.js b/packages/eslint-plugin/lib/getPackages.js index f5f2c63cc1..8f4ccfacf3 100644 --- a/packages/eslint-plugin/lib/getPackages.js +++ b/packages/eslint-plugin/lib/getPackages.js @@ -31,6 +31,7 @@ const manypkg = require('@manypkg/get-packages'); * @property {ExtendedPackage} root * @property {ExtendedPackage[]} list * @property {Map} map + * @property {() => void} clearCache * @property {(path: string) => ExtendedPackage | undefined} byPath */ @@ -64,6 +65,9 @@ module.exports = (function () { pkg => !path.relative(pkg.dir, filePath).startsWith('..'), ); }, + clearCache() { + result = undefined; + }, }; lastLoadAt = Date.now(); return result; diff --git a/packages/eslint-plugin/lib/visitImports.js b/packages/eslint-plugin/lib/visitImports.js index 1a344c1101..376c37575f 100644 --- a/packages/eslint-plugin/lib/visitImports.js +++ b/packages/eslint-plugin/lib/visitImports.js @@ -24,6 +24,16 @@ const getPackages = require('./getPackages'); * @type {object} * @property {'local'} type * @property {'value' | 'type'} kind + * @property {import('estree').Node} node + * @property {string} path + */ + +/** + * @typedef ImportDirective + * @type {object} + * @property {'directive'} type + * @property {'value' | 'type'} kind + * @property {import('estree').Node} node * @property {string} path */ @@ -32,6 +42,7 @@ const getPackages = require('./getPackages'); * @type {object} * @property {'internal'} type * @property {'value' | 'type'} kind + * @property {import('estree').Node} node * @property {string} path * @property {import('./getPackages').ExtendedPackage} package * @property {string} packageName @@ -42,6 +53,7 @@ const getPackages = require('./getPackages'); * @type {object} * @property {'external'} type * @property {'value' | 'type'} kind + * @property {import('estree').Node} node * @property {string} path * @property {string} packageName */ @@ -51,6 +63,7 @@ const getPackages = require('./getPackages'); * @type {object} * @property {'builtin'} type * @property {'value' | 'type'} kind + * @property {import('estree').Literal} node * @property {string} path * @property {string} packageName */ @@ -58,7 +71,7 @@ const getPackages = require('./getPackages'); /** * @callback ImportVisitor * @param {ConsideredNode} node - * @param {LocalImport | InternalImport | ExternalImport | BuiltinImport} import + * @param {ImportDirective | LocalImport | InternalImport | ExternalImport | BuiltinImport} import */ /** @@ -68,7 +81,7 @@ const getPackages = require('./getPackages'); /** * @param {ConsideredNode} node - * @returns {undefined | {path: string, kind: 'type' | 'value'}} + * @returns {undefined | {path: string, node: import('estree').Literal, kind: 'type' | 'value'}} */ function getImportInfo(node) { /** @type {import('estree').Expression | import('estree').SpreadElement | undefined | null} */ @@ -95,7 +108,11 @@ function getImportInfo(node) { /** @type {any} */ const anyNode = node; - return { path: pathNode.value, kind: anyNode.importKind ?? 'value' }; + return { + path: pathNode.value, + node: pathNode, + kind: anyNode.importKind ?? 'value', + }; } /** @@ -122,6 +139,10 @@ module.exports = function visitImports(context, visitor) { return visitor(node, { type: 'local', ...info }); } + if (info.path.startsWith('directive:')) { + return visitor(node, { type: 'directive', ...info }); + } + const pathParts = info.path.split('/'); // Check for match with plain name, then namespaced name @@ -143,6 +164,7 @@ module.exports = function visitImports(context, visitor) { return visitor(node, { type: 'builtin', kind: info.kind, + node: info.node, path: subPath, packageName, }); @@ -151,6 +173,7 @@ module.exports = function visitImports(context, visitor) { return visitor(node, { type: 'external', kind: info.kind, + node: info.node, path: subPath, packageName, }); @@ -159,6 +182,7 @@ module.exports = function visitImports(context, visitor) { return visitor(node, { type: 'internal', kind: info.kind, + node: info.node, path: subPath, package: pkg, packageName, diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index fcc038cdbf..5a37dcc871 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/eslint-plugin", "description": "Backstage ESLint plugin", - "version": "0.1.2-next.0", + "version": "0.1.3-next.0", "publishConfig": { "access": "public" }, diff --git a/packages/eslint-plugin/rules/no-undeclared-imports.js b/packages/eslint-plugin/rules/no-undeclared-imports.js index b1e11d1b97..06f0afed46 100644 --- a/packages/eslint-plugin/rules/no-undeclared-imports.js +++ b/packages/eslint-plugin/rules/no-undeclared-imports.js @@ -20,6 +20,7 @@ const path = require('path'); const getPackageMap = require('../lib/getPackages'); const visitImports = require('../lib/visitImports'); const minimatch = require('minimatch'); +const { execFileSync } = require('child_process'); const depFields = { dep: 'dependencies', @@ -124,11 +125,13 @@ function getAddFlagForDepsField(depsField) { module.exports = { meta: { type: 'problem', + fixable: 'code', messages: { undeclared: "{{ packageName }} must be declared in {{ depsField }} of {{ packageJsonPath }}, run 'yarn --cwd {{ packagePath }} add{{ addFlag }} {{ packageName }}' from the project root.", switch: '{{ packageName }} is declared in {{ oldDepsField }}, but should be moved to {{ depsField }} in {{ packageJsonPath }}.', + switchBack: 'Switch back to import declaration', }, docs: { description: @@ -150,63 +153,150 @@ module.exports = { return {}; } - return visitImports(context, (node, imp) => { - // We leave checking of type imports to the repo-tools check, - // and we skip builtins and local imports - if ( - imp.kind === 'type' || - imp.type === 'builtin' || - imp.type === 'local' - ) { - return; - } + /** @type Array<{name: string, flag: string, node: import('estree').Node}> */ + const importsToAdd = []; - // We skip imports for the package itself - if (imp.packageName === localPkg.packageJson.name) { - return; - } + return { + // All missing imports that we detect are collected as we traverse, and then we use + // the program exit to execute all install directives that have been found. + ['Program:exit']() { + /** @type Record> */ + const byFlag = {}; - const modulePath = path.relative(localPkg.dir, filePath); - const expectedType = getExpectedDepType( - localPkg.packageJson, - imp.packageName, - modulePath, - ); + for (const { name, flag } of importsToAdd) { + byFlag[flag] = byFlag[flag] ?? new Set(); + byFlag[flag].add(name); + } - const conflict = findConflict( - localPkg.packageJson, - imp.packageName, - expectedType, - ); + for (const name of byFlag[''] ?? []) { + byFlag['--dev']?.delete(name); + } + for (const name of byFlag['--peer'] ?? []) { + byFlag['']?.delete(name); + byFlag['--dev']?.delete(name); + } - if (conflict) { - try { - const fullImport = imp.path - ? `${imp.packageName}/${imp.path}` - : imp.packageName; - require.resolve(fullImport, { - paths: [localPkg.dir], + for (const [flag, names] of Object.entries(byFlag)) { + // The security implication of this is a bit interesting, as crafted add-import + // directives could be used to install malicious packages. However, the same is true + // for adding malicious packages to package.json, so there's significant difference. + execFileSync('yarn', ['add', ...(flag || []), ...names], { + cwd: localPkg.dir, + stdio: 'inherit', }); - } catch { - // If the dependency doesn't resolve then it's likely a type import, ignore + } + + // This switches all import directives back to the original import. + for (const added of importsToAdd) { + context.report({ + node: added.node, + messageId: 'switchBack', + fix(fixer) { + return fixer.replaceText(added.node, `'${added.name}'`); + }, + }); + } + + importsToAdd.length = 0; + packages.clearCache(); + }, + ...visitImports(context, (node, imp) => { + // We leave checking of type imports to the repo-tools check, + // and we skip builtins and local imports + if ( + imp.kind === 'type' || + imp.type === 'builtin' || + imp.type === 'local' + ) { return; } - const packagePath = path.relative(packages.root.dir, localPkg.dir); - const packageJsonPath = path.join(packagePath, 'package.json'); + // Any import directive that is found is collected for processing later + if (imp.type === 'directive') { + const parts = imp.path.split(':'); + if (parts[1] !== 'add-import') { + return; + } + const [type, name] = parts.slice(2); + if (!name.match(/^(@[-\w\.~]+\/)?[-\w\.~]*$/i)) { + throw new Error( + `Invalid package name to add as dependency: '${name}'`, + ); + } - context.report({ - node, - messageId: conflict.oldDepsField ? 'switch' : 'undeclared', - data: { - ...conflict, - packagePath, - addFlag: getAddFlagForDepsField(conflict.depsField), - packageName: imp.packageName, - packageJsonPath: packageJsonPath, - }, - }); - } - }); + importsToAdd.push({ + flag: getAddFlagForDepsField(type).trim(), + name, + node: imp.node, + }); + return; + } + + // We skip imports for the package itself + if (imp.packageName === localPkg.packageJson.name) { + return; + } + + const modulePath = path.relative(localPkg.dir, filePath); + const expectedType = getExpectedDepType( + localPkg.packageJson, + imp.packageName, + modulePath, + ); + + const conflict = findConflict( + localPkg.packageJson, + imp.packageName, + expectedType, + ); + + if (conflict) { + try { + const fullImport = imp.path + ? `${imp.packageName}/${imp.path}` + : imp.packageName; + require.resolve(fullImport, { + paths: [localPkg.dir], + }); + } catch { + // If the dependency doesn't resolve then it's likely a type import, ignore + return; + } + + const packagePath = path.relative(packages.root.dir, localPkg.dir); + const packageJsonPath = path.join(packagePath, 'package.json'); + + context.report({ + node, + messageId: conflict.oldDepsField ? 'switch' : 'undeclared', + data: { + ...conflict, + packagePath, + addFlag: getAddFlagForDepsField(conflict.depsField), + packageName: imp.packageName, + packageJsonPath: packageJsonPath, + }, + // This fix callback is always executed, regardless of whether linting is run with + // fixes enabled or not. There is no way to determine if fixes are being applied, so + // instead our fix will replace the import with a directive that will be picked up + // on the next run. When ESLint applies fixes all rules are re-run to make sure the fixes + // applied correctly, which means that these directives will be picked up, executed, + // and switched back to the original import immediately. + // This is not true for all editor integrations. For example, VSCode translates there fixes + // to native editor commands, and does not re-run ESLint. This means that the import directive + // will end up in source code, and the import directive fix needs to be applied manually too. + // There is to my knowledge no way around this that doesn't get very hacky, so it will do for now. + fix: conflict.oldDepsField + ? undefined + : fixer => { + return fixer.replaceText( + imp.node, + `'directive:add-import:${conflict.depsField}:${imp.packageName}'`, + ); + }, + }); + } + }), + }; }, }; diff --git a/packages/eslint-plugin/src/no-undeclared-imports.test.ts b/packages/eslint-plugin/src/no-undeclared-imports.test.ts index 78844899ba..e92d422057 100644 --- a/packages/eslint-plugin/src/no-undeclared-imports.test.ts +++ b/packages/eslint-plugin/src/no-undeclared-imports.test.ts @@ -18,6 +18,10 @@ import { RuleTester } from 'eslint'; import { join as joinPath } from 'path'; import rule from '../rules/no-undeclared-imports'; +jest.mock('child_process', () => ({ + execFileSync: jest.fn(), +})); + const RULE = 'no-undeclared-imports'; const FIXTURE = joinPath(__dirname, '__fixtures__/monorepo'); @@ -45,6 +49,9 @@ const ERR_SWITCHED = ( 'package.json', )}.`, }); +const ERR_SWITCH_BACK = () => ({ + message: 'Switch back to import declaration', +}); process.chdir(FIXTURE); @@ -130,6 +137,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'lodash'`, + output: `import 'directive:add-import:dependencies:lodash'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -137,6 +145,7 @@ ruleTester.run(RULE, rule, { }, { code: `import { debounce } from 'lodash'`, + output: `import { debounce } from 'directive:add-import:dependencies:lodash'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -144,6 +153,7 @@ ruleTester.run(RULE, rule, { }, { code: `import * as _ from 'lodash'`, + output: `import * as _ from 'directive:add-import:dependencies:lodash'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -151,6 +161,7 @@ ruleTester.run(RULE, rule, { }, { code: `import _ from 'lodash'`, + output: `import _ from 'directive:add-import:dependencies:lodash'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -158,6 +169,7 @@ ruleTester.run(RULE, rule, { }, { code: `import('lodash')`, + output: `import('directive:add-import:dependencies:lodash')`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -165,6 +177,7 @@ ruleTester.run(RULE, rule, { }, { code: `require('lodash')`, + output: `require('directive:add-import:dependencies:lodash')`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -172,13 +185,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'lodash'`, - filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), - errors: [ - ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), - ], - }, - { - code: `import 'lodash'`, + output: `import 'directive:add-import:devDependencies:lodash'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.test.ts'), errors: [ ERR_UNDECLARED( @@ -191,6 +198,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'react'`, + output: `import 'directive:add-import:peerDependencies:react'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED( @@ -203,6 +211,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'react'`, + output: `import 'directive:add-import:peerDependencies:react'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.test.ts'), errors: [ ERR_UNDECLARED( @@ -215,6 +224,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'react-dom'`, + output: `import 'directive:add-import:dependencies:react-dom'`, filename: joinPath(FIXTURE, 'packages/foo/src/index.ts'), errors: [ ERR_UNDECLARED( @@ -226,6 +236,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'react-dom'`, + output: `import 'directive:add-import:devDependencies:react-dom'`, filename: joinPath(FIXTURE, 'packages/foo/src/index.test.ts'), errors: [ ERR_UNDECLARED( @@ -238,6 +249,7 @@ ruleTester.run(RULE, rule, { }, { code: `import '@internal/foo'`, + output: `import 'directive:add-import:dependencies:@internal/foo'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED( @@ -247,5 +259,43 @@ ruleTester.run(RULE, rule, { ), ], }, + + // Switching back to original import declarations + { + code: `import 'directive:add-import:dependencies:lodash'`, + output: `import 'lodash'`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, + { + code: `import { debounce } from 'directive:add-import:dependencies:lodash'`, + output: `import { debounce } from 'lodash'`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, + { + code: `import * as _ from 'directive:add-import:dependencies:lodash'`, + output: `import * as _ from 'lodash'`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, + { + code: `import _ from 'directive:add-import:dependencies:lodash'`, + output: `import _ from 'lodash'`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, + { + code: `import('directive:add-import:dependencies:lodash')`, + output: `import('lodash')`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, + { + code: `require('directive:add-import:dependencies:lodash')`, + output: `require('lodash')`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, ], }); diff --git a/packages/integration-aws-node/CHANGELOG.md b/packages/integration-aws-node/CHANGELOG.md index e5ac2a8532..40192bdfaf 100644 --- a/packages/integration-aws-node/CHANGELOG.md +++ b/packages/integration-aws-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/integration-aws-node +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + ## 0.1.2-next.0 ### Patch Changes diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json index a45cb03e14..7afc31cc47 100644 --- a/packages/integration-aws-node/package.json +++ b/packages/integration-aws-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-aws-node", "description": "Helpers for fetching AWS account credentials", - "version": "0.1.2-next.0", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index 028c939822..02a8c9b7e4 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/integration-react +## 1.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## 1.1.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 1.1.11-next.2 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 119a8683d6..39a8a9908a 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-react", "description": "Frontend package for managing integrations towards external systems", - "version": "1.1.11-next.2", + "version": "1.1.12-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -30,7 +30,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 3a84452505..f81b1824fe 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration +## 1.4.3 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + ## 1.4.3-next.0 ### Patch Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index 02c19e1b1d..25e6ba8bf7 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration", "description": "Helpers for managing integrations towards external systems", - "version": "1.4.3-next.0", + "version": "1.4.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/release-manifests/CHANGELOG.md b/packages/release-manifests/CHANGELOG.md index fa15839a35..f59447666f 100644 --- a/packages/release-manifests/CHANGELOG.md +++ b/packages/release-manifests/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/release-manifests +## 0.0.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + ## 0.0.9-next.0 ### Patch Changes diff --git a/packages/release-manifests/package.json b/packages/release-manifests/package.json index 65d1026ca6..0c6ad64446 100644 --- a/packages/release-manifests/package.json +++ b/packages/release-manifests/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/release-manifests", "description": "Helper library for receiving release manifests", - "version": "0.0.9-next.0", + "version": "0.0.9", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 996377c198..5893c3d87c 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/repo-tools +## 0.1.4-next.0 + +### Patch Changes + +- 9129ca8cabb: Log API report instructions when api-report is missing. +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.1.5 + +## 0.1.3 + +### Patch Changes + +- 32a4a05838c: Tweaked type dependency check to trim wildcard type imports. +- 6ba8faf22ac: The API report generation process is now able to detect and generate reports for additional entry points declared in the package `"exports"` field. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + ## 0.1.3-next.1 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 9d24bfad2c..fb1d0c4af8 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/repo-tools", "description": "CLI for Backstage repo tooling ", - "version": "0.1.3-next.1", + "version": "0.1.4-next.0", "publishConfig": { "access": "public" }, diff --git a/packages/repo-tools/src/commands/api-reports/api-extractor.ts b/packages/repo-tools/src/commands/api-reports/api-extractor.ts index 1fe7602617..8194ede7a4 100644 --- a/packages/repo-tools/src/commands/api-reports/api-extractor.ts +++ b/packages/repo-tools/src/commands/api-reports/api-extractor.ts @@ -487,6 +487,9 @@ export async function runApiExtraction({ showVerboseMessages: false, showDiagnostics: false, messageCallback(message) { + if (message.text.includes('The API report file is missing')) { + shouldLogInstructions = true; + } if ( message.text.includes( 'You have changed the public API signature for this project.', @@ -506,7 +509,11 @@ export async function runApiExtraction({ // This release tag validation makes sure that the release tag of known entry points match expectations. // The root index entrypoint is only allowed @public exports, while /alpha and /beta only allow @alpha and @beta. - if (validateReleaseTags && !usesExperimentalTypeBuild) { + if ( + validateReleaseTags && + !usesExperimentalTypeBuild && + fs.pathExistsSync(extractorConfig.reportFilePath) + ) { if (['index', 'alpha', 'beta'].includes(name)) { const report = await fs.readFile( extractorConfig.reportFilePath, diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 2d2b669e38..e1c03b9f9c 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,43 @@ # techdocs-cli-embedded-app +## 0.2.81-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.10.0-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/app-defaults@1.3.0-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/test-utils@1.3.0-next.0 + - @backstage/plugin-techdocs@1.6.1-next.0 + - @backstage/cli@0.22.6-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.2.80 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/cli@0.22.4 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/app-defaults@1.2.1 + ## 0.2.80-next.2 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 2cbb1aabc8..eab13938f4 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.80-next.2", + "version": "0.2.81-next.0", "private": true, "backstage": { "role": "frontend" diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index facd967e90..9c1aaee26a 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,33 @@ # @techdocs/cli +## 1.4.1-next.0 + +### Patch Changes + +- b348420a804: Adding global-agent to enable the ability to publish through a proxy +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/cli-common@0.1.12 + - @backstage/plugin-techdocs-node@1.6.1-next.0 + +## 1.4.0 + +### Minor Changes + +- 8e465ce52e2: Running `@techdocs/cli generate` with the `--verbose` flag will now print the mkdocs output. +- ea2bbef1b16: Added support for an HTTPS proxy for techdocs AWS S3 requests + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.6.0 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + ## 1.4.0-next.2 ### Patch Changes diff --git a/packages/techdocs-cli/README.md b/packages/techdocs-cli/README.md index ae296d2c26..85c0075946 100644 --- a/packages/techdocs-cli/README.md +++ b/packages/techdocs-cli/README.md @@ -40,6 +40,14 @@ yarn start yarn techdocs-cli:dev [...options] ``` +### Connecting behind a proxy + +```sh +# Prior to executing the techdocs-cli command +export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY} +export GLOBAL_AGENT_NO_PROXY=${NO_PROXY} +``` + ### Using an example docs project For the purpose of local development, we have created an example documentation project. You are of course also free to create your own local test site - all it takes is a `docs/index.md` and an `mkdocs.yml` in a directory. diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index e8d9277871..c8929f3d6a 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,7 +1,7 @@ { "name": "@techdocs/cli", "description": "Utility CLI for managing TechDocs sites in Backstage.", - "version": "1.4.0-next.2", + "version": "1.4.1-next.0", "publishConfig": { "access": "public" }, @@ -69,6 +69,7 @@ "commander": "^9.1.0", "dockerode": "^3.3.1", "fs-extra": "^10.0.1", + "global-agent": "^3.0.0", "http-proxy": "^1.18.1", "react-dev-utils": "^12.0.0-next.60", "serve-handler": "^6.1.3", diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index e521e9af91..382cce8c09 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/test-utils +## 1.3.0-next.0 + +### Minor Changes + +- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.4 + +## 1.2.6 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/core-app-api@1.6.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.11 + ## 1.2.6-next.2 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 59ec2ce989..7670d43cbd 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/test-utils", "description": "Utilities to test Backstage plugins and apps.", - "version": "1.2.6-next.2", + "version": "1.3.0-next.0", "publishConfig": { "access": "public" }, diff --git a/packages/test-utils/src/testUtils/defaultApis.ts b/packages/test-utils/src/testUtils/defaultApis.ts index 1ff10bfe6f..2231d28cd0 100644 --- a/packages/test-utils/src/testUtils/defaultApis.ts +++ b/packages/test-utils/src/testUtils/defaultApis.ts @@ -89,6 +89,7 @@ export const defaultApis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => GoogleAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), @@ -103,6 +104,7 @@ export const defaultApis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => MicrosoftAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), @@ -117,6 +119,7 @@ export const defaultApis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => GithubAuth.create({ + configApi, discoveryApi, oauthRequestApi, defaultScopes: ['read:user'], @@ -132,6 +135,7 @@ export const defaultApis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => OktaAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), @@ -146,6 +150,7 @@ export const defaultApis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => GitlabAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), @@ -160,6 +165,7 @@ export const defaultApis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => OneLoginAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), @@ -174,6 +180,7 @@ export const defaultApis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => BitbucketAuth.create({ + configApi, discoveryApi, oauthRequestApi, defaultScopes: ['team'], @@ -189,6 +196,7 @@ export const defaultApis = [ }, factory: ({ discoveryApi, oauthRequestApi, configApi }) => { return AtlassianAuth.create({ + configApi, discoveryApi, oauthRequestApi, environment: configApi.getOptionalString('auth.environment'), diff --git a/packages/theme/CHANGELOG.md b/packages/theme/CHANGELOG.md index 2950839e68..5f25f513d4 100644 --- a/packages/theme/CHANGELOG.md +++ b/packages/theme/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/theme +## 0.2.18 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + ## 0.2.18-next.0 ### Patch Changes diff --git a/packages/theme/package.json b/packages/theme/package.json index d24a43abdb..999fb02dac 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/theme", "description": "material-ui theme for use with Backstage.", - "version": "0.2.18-next.0", + "version": "0.2.18", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index 58b37f1731..53fb3b9f8d 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-adr-backend +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + +## 0.3.1 + +### Patch Changes + +- 2a73ded3861: Support MADR v3 format +- 8bf24946c66: Adjust express dependencies to be the same as the rest of the project +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + ## 0.3.1-next.2 ### Patch Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index f73bf159b0..fb0c211284 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.3.1-next.2", + "version": "0.3.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr-backend/src/index.ts b/plugins/adr-backend/src/index.ts index 5cc8f50b72..89c88ab3e7 100644 --- a/plugins/adr-backend/src/index.ts +++ b/plugins/adr-backend/src/index.ts @@ -15,7 +15,7 @@ */ /** - * ADR backend plugin + * Architecture Decision Records backend plugin. * * @packageDocumentation */ diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md index 5040e0955c..6b5a58da2a 100644 --- a/plugins/adr-common/CHANGELOG.md +++ b/plugins/adr-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-adr-common +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/plugin-search-common@1.2.2 + ## 0.2.7-next.1 ### Patch Changes diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json index 9eeeeb2803..e6364f7915 100644 --- a/plugins/adr-common/package.json +++ b/plugins/adr-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-adr-common", "description": "Common functionalities for the adr plugin", - "version": "0.2.7-next.1", + "version": "0.2.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index a50f1a60d3..f67ab9bc20 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-adr +## 0.4.2-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + +## 0.4.1 + +### Patch Changes + +- d293f4aaf83: Updated readme instructions +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + ## 0.4.1-next.2 ### Patch Changes diff --git a/plugins/adr/package.json b/plugins/adr/package.json index 5e56c39638..453ff62792 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.4.1-next.2", + "version": "0.4.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,7 +33,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-markdown": "^8.0.0", "react-use": "^17.2.4", "remark-gfm": "^3.0.1" diff --git a/plugins/adr/src/index.ts b/plugins/adr/src/index.ts index f24b3ac531..f405621c4a 100644 --- a/plugins/adr/src/index.ts +++ b/plugins/adr/src/index.ts @@ -15,7 +15,7 @@ */ /** - * ADR frontend plugin + * Architecture Decision Records frontend plugin. * * @packageDocumentation */ diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index bcbd88a755..29771be91c 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-airbrake-backend +## 0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + +## 0.2.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + ## 0.2.16-next.2 ### Patch Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index 52bd89e909..fa3c29c022 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake-backend", - "version": "0.2.16-next.2", + "version": "0.2.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md index 088bfbdcf9..e0efd2802b 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-airbrake +## 0.3.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/test-utils@1.3.0-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/dev-utils@1.0.14-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/dev-utils@1.0.13 + - @backstage/theme@0.2.18 + ## 0.3.16-next.2 ### Patch Changes diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index e577ee8862..8249410795 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.16-next.2", + "version": "0.3.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,7 +31,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/airbrake/src/index.ts b/plugins/airbrake/src/index.ts index 717d544dc9..6f189e36b8 100644 --- a/plugins/airbrake/src/index.ts +++ b/plugins/airbrake/src/index.ts @@ -15,7 +15,7 @@ */ /** - * The Airbrake plugin provides connectivity between Backstage and Airbrake (https://airbrake.io/). + * The Airbrake plugin provides connectivity between Backstage and {@link https://airbrake.io/ | Airbrake}. * * @packageDocumentation */ diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index efde01c0b5..27a470ce2c 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-allure +## 0.1.33-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.1.32 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.32-next.2 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index 18bf52feab..986fc62f17 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-allure", "description": "A Backstage plugin that integrates with Allure", - "version": "0.1.32-next.2", + "version": "0.1.33-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -30,7 +30,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md index e457b76bf8..b05b09ab78 100644 --- a/plugins/analytics-module-ga/CHANGELOG.md +++ b/plugins/analytics-module-ga/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-analytics-module-ga +## 0.1.28-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## 0.1.27 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 0.1.27-next.2 ### Patch Changes diff --git a/plugins/analytics-module-ga/README.md b/plugins/analytics-module-ga/README.md index d6e2642e2b..6fdfc91306 100644 --- a/plugins/analytics-module-ga/README.md +++ b/plugins/analytics-module-ga/README.md @@ -236,7 +236,7 @@ make and test changes is to do the following: Code for the isolated version of the plugin can be found inside the [/dev](./dev) directory. Changes to the plugin are hot-reloaded. -#### Recommended Dev Config +### Recommended Dev Config Paste this into your `app-config.local.yaml` while developing this plugin: diff --git a/plugins/analytics-module-ga/api-report.md b/plugins/analytics-module-ga/api-report.md index 557f472f71..f28c919f33 100644 --- a/plugins/analytics-module-ga/api-report.md +++ b/plugins/analytics-module-ga/api-report.md @@ -25,6 +25,4 @@ export class GoogleAnalytics implements AnalyticsApi { }, ): GoogleAnalytics; } - -// (No @packageDocumentation comment for this package) ``` diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index b7152b1f69..f77807b138 100644 --- a/plugins/analytics-module-ga/package.json +++ b/plugins/analytics-module-ga/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga", - "version": "0.1.27-next.2", + "version": "0.1.28-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -28,7 +28,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-ga": "^3.3.0", "react-use": "^17.2.4" }, diff --git a/plugins/analytics-module-ga/src/index.ts b/plugins/analytics-module-ga/src/index.ts index fca8d91658..7b96c761fb 100644 --- a/plugins/analytics-module-ga/src/index.ts +++ b/plugins/analytics-module-ga/src/index.ts @@ -14,5 +14,11 @@ * limitations under the License. */ +/** + * Analytics Module plugin for Google Analytics. + * + * @packageDocumentation + */ + export { analyticsModuleGA } from './plugin'; export * from './apis/implementations/AnalyticsApi'; diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md index acc474e6e3..6386aee20b 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-apache-airflow +## 0.2.10-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + +## 0.2.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + ## 0.2.9-next.2 ### Patch Changes diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index 070cbc4136..ab732c8129 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apache-airflow", - "version": "0.2.9-next.2", + "version": "0.2.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -26,7 +26,7 @@ "@backstage/core-plugin-api": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "cross-fetch": "^3.1.5", "qs": "^6.10.1", "react-use": "^17.2.4" diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 56644c2322..2c850a0cb3 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-api-docs +## 0.9.2-next.0 + +### Patch Changes + +- ca50c3bbea1: Corrected styling of nested objects in AsyncAPI to avoid inappropriate uppercase text transformation of nested objects. +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-catalog@1.10.0-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.9.1 + +### Patch Changes + +- 095e755d9b5: Add ApiDefinitionDialog component for fast access to the API definition in ProvidedApiCards and ConsumedApiCards. +- 8bc7dcec820: Fix dark theme Swagger's clear button font color. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 9820eb5d24f: Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.9.1-next.2 ### Patch Changes diff --git a/plugins/api-docs/dev/asyncapi-example-api.yaml b/plugins/api-docs/dev/asyncapi-example-api.yaml index 725811d0cc..3895006979 100644 --- a/plugins/api-docs/dev/asyncapi-example-api.yaml +++ b/plugins/api-docs/dev/asyncapi-example-api.yaml @@ -133,6 +133,8 @@ spec: description: Light intensity measured in lumens. sentAt: $ref: "#/components/schemas/sentAt" + sentBy: + $ref: "#/components/schemas/sentBy" turnOnOffPayload: type: object properties: @@ -144,6 +146,8 @@ spec: description: Whether to turn on or off the light. sentAt: $ref: "#/components/schemas/sentAt" + sentBy: + $ref: "#/components/schemas/sentBy" dimLightPayload: type: object properties: @@ -154,10 +158,25 @@ spec: maximum: 100 sentAt: $ref: "#/components/schemas/sentAt" + sentBy: + $ref: "#/components/schemas/sentBy" sentAt: type: string format: date-time description: Date and time when the message was sent. + sentBy: + type: object + description: Description of the message sender. + properties: + name: + type: string + description: Name of the sender. + type: + type: string + description: Type of the sender. + enum: + - user + - machine securitySchemes: apiKey: diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index d7db6566f9..8e24c3ccea 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs", "description": "A Backstage plugin that helps represent API entities in the frontend", - "version": "0.9.1-next.2", + "version": "0.9.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -41,7 +41,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "graphiql": "^1.8.8", "graphql": "^16.0.0", "graphql-ws": "^5.4.1", diff --git a/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx b/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx index fd8948828c..64452b7191 100644 --- a/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx +++ b/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx @@ -76,6 +76,8 @@ const useStyles = makeStyles((theme: BackstageTheme) => ({ ...theme.typography.button, borderRadius: theme.shape.borderRadius, color: theme.palette.primary.main, + // override whatever may be in the theme's typography to ensure consistency with asyncapi + textTransform: 'inherit', }, '& a': { color: theme.palette.link, diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md index 8e48be2ab8..6a7ec3d0f2 100644 --- a/plugins/apollo-explorer/CHANGELOG.md +++ b/plugins/apollo-explorer/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-apollo-explorer +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## 0.1.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.1.9-next.2 ### Patch Changes diff --git a/plugins/apollo-explorer/api-report.md b/plugins/apollo-explorer/api-report.md index 1d3b41eac1..66cc473d0b 100644 --- a/plugins/apollo-explorer/api-report.md +++ b/plugins/apollo-explorer/api-report.md @@ -40,6 +40,4 @@ export const apolloExplorerPlugin: BackstagePlugin< {}, {} >; - -// (No @packageDocumentation comment for this package) ``` diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index 0fcc315797..81ac0f02b9 100644 --- a/plugins/apollo-explorer/package.json +++ b/plugins/apollo-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apollo-explorer", - "version": "0.1.9-next.2", + "version": "0.1.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -28,7 +28,6 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.57", "react-use": "^17.2.4", "use-deep-compare-effect": "^1.8.1" }, diff --git a/plugins/apollo-explorer/src/index.ts b/plugins/apollo-explorer/src/index.ts index 6d07535fc3..565557e79f 100644 --- a/plugins/apollo-explorer/src/index.ts +++ b/plugins/apollo-explorer/src/index.ts @@ -13,4 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +/** + * Integrates Apollo Explorer graphs as a tool to browse GraphQL API endpoints inside Backstage. + * + * @packageDocumentation + */ export { apolloExplorerPlugin, ApolloExplorerPage } from './plugin'; diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index 79c8276eeb..85873f3ddb 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-app-backend +## 0.3.44-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/config-loader@1.1.9 + - @backstage/types@1.0.2 + +## 0.3.43 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config-loader@1.1.9 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.3.43-next.2 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 77804372d1..79a9c70ca5 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-backend", "description": "A Backstage backend plugin that serves the Backstage frontend app", - "version": "0.3.43-next.2", + "version": "0.3.44-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index a22b2e40ee..3a68d5a495 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-auth-backend +## 0.18.2-next.0 + +### Patch Changes + +- d8f774c30df: Enforce the secret visibility of certificates and client secrets in the auth backend. Also, document all known options for each auth plugin. +- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + +## 0.18.1 + +### Patch Changes + +- e262738b8a0: Handle difference in expiration time between Microsoft session and Backstage session which caused the Backstage token to be invalid during a time frame. +- 86cece2c1fb: Updated dependency `@types/passport-microsoft` to `^1.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 529de8c4211: Added authentication provider for Azure Easy Authentication. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.18.1-next.2 ### Patch Changes diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md index 63aa060875..7515083c09 100644 --- a/plugins/auth-backend/api-report.md +++ b/plugins/auth-backend/api-report.md @@ -398,6 +398,8 @@ export type OAuthState = { env: string; origin?: string; scope?: string; + redirectUrl?: string; + flow?: string; }; // @public diff --git a/plugins/auth-backend/config.d.ts b/plugins/auth-backend/config.d.ts index 5aff9df90a..8d76ca8bf5 100644 --- a/plugins/auth-backend/config.d.ts +++ b/plugins/auth-backend/config.d.ts @@ -62,30 +62,72 @@ export interface Config { */ providers?: { google?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + callbackUrl?: string; + }; }; github?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + callbackUrl?: string; + enterpriseInstanceUrl?: string; + }; }; gitlab?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + audience?: string; + callbackUrl?: string; + }; }; saml?: { entryPoint: string; logoutUrl?: string; issuer: string; + /** + * @visibility secret + */ cert: string; audience?: string; + /** + * @visibility secret + */ privateKey?: string; authnContext?: string[]; identifierFormat?: string; + /** + * @visibility secret + */ decryptionPvk?: string; signatureAlgorithm?: 'sha256' | 'sha512'; digestAlgorithm?: string; acceptedClockSkewMs?: number; }; okta?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + audience: string; + authServerId?: string; + idp?: string; + callbackUrl?: string; + }; }; oauth2?: { [authEnv: string]: { @@ -101,19 +143,56 @@ export interface Config { }; }; oidc?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + callbackUrl?: string; + metadataUrl: string; + scope?: string; + prompt?: string; + }; }; auth0?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + domain: string; + callbackUrl?: string; + audience?: string; + connection?: string; + connectionScope?: string; + }; }; microsoft?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + tenantId: string; + callbackUrl?: string; + }; }; onelogin?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + issuer: string; + callbackUrl?: string; + }; }; awsalb?: { - issuer?: string; + iss?: string; region: string; }; cfaccess?: { diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index bcc62814ed..83a9a55906 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend", "description": "A Backstage backend plugin that handles authentication", - "version": "0.18.1-next.2", + "version": "0.18.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts index e0d4f0e051..1b6653d97e 100644 --- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts +++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts @@ -83,56 +83,10 @@ describe('OAuthAdapter', () => { callbackUrl: 'http://domain.org/auth/test-provider/handler/frame', }; - it('sets the correct headers in start', async () => { - const oauthProvider = new OAuthAdapter( - providerInstance, - oAuthProviderOptions, - ); - const mockRequest = { - query: { - scope: 'user', - env: 'development', - }, - } as unknown as express.Request; + const defaultState = { nonce: 'nonce', env: 'development' }; - const mockResponse = { - cookie: jest.fn().mockReturnThis(), - end: jest.fn().mockReturnThis(), - setHeader: jest.fn().mockReturnThis(), - statusCode: jest.fn().mockReturnThis(), - } as unknown as express.Response; - - await oauthProvider.start(mockRequest, mockResponse); - // nonce cookie checks - expect(mockResponse.cookie).toHaveBeenCalledTimes(1); - expect(mockResponse.cookie).toHaveBeenCalledWith( - `${oAuthProviderOptions.providerId}-nonce`, - expect.any(String), - expect.objectContaining({ - httpOnly: true, - path: '/auth/test-provider/handler', - maxAge: TEN_MINUTES_MS, - domain: 'domain.org', - sameSite: 'lax', - secure: false, - }), - ); - // redirect checks - expect(mockResponse.setHeader).toHaveBeenCalledTimes(2); - expect(mockResponse.setHeader).toHaveBeenCalledWith('Location', '/url'); - expect(mockResponse.setHeader).toHaveBeenCalledWith('Content-Length', '0'); - expect(mockResponse.statusCode).toEqual(301); - expect(mockResponse.end).toHaveBeenCalledTimes(1); - }); - - it('sets the refresh cookie if refresh is enabled', async () => { - const oauthProvider = new OAuthAdapter(providerInstance, { - ...oAuthProviderOptions, - isOriginAllowed: () => false, - }); - - const state = { nonce: 'nonce', env: 'development' }; - const mockRequest = { + const createEncodedQueryMockRequest = (state: any) => { + return { cookies: { 'test-provider-nonce': 'nonce', }, @@ -140,12 +94,69 @@ describe('OAuthAdapter', () => { state: encodeState(state), }, } as unknown as express.Request; + }; - const mockResponse = { - cookie: jest.fn().mockReturnThis(), - setHeader: jest.fn().mockReturnThis(), - end: jest.fn().mockReturnThis(), - } as unknown as express.Response; + const mockResponse = { + cookie: jest.fn().mockReturnThis(), + end: jest.fn().mockReturnThis(), + setHeader: jest.fn().mockReturnThis(), + statusCode: jest.fn().mockReturnThis(), + redirect: jest.fn().mockReturnThis(), + status: jest.fn().mockReturnThis(), + json: jest.fn().mockReturnThis(), + } as unknown as express.Response; + + const mockStartRequest = { + query: { + scope: 'user', + env: 'development', + }, + } as unknown as express.Request; + + const expectedStartAuthCookieData = { + httpOnly: true, + path: '/auth/test-provider/handler', + maxAge: TEN_MINUTES_MS, + domain: 'domain.org', + sameSite: 'lax', + secure: false, + }; + + it('sets the correct headers in start', async () => { + const oauthProvider = new OAuthAdapter( + providerInstance, + oAuthProviderOptions, + ); + + await oauthProvider.start(mockStartRequest, mockResponse); + // nonce cookie checks + expect(mockResponse.cookie).toHaveBeenCalledTimes(1); + expect(mockResponse.cookie).toHaveBeenCalledWith( + `${oAuthProviderOptions.providerId}-nonce`, + expect.any(String), + expect.objectContaining(expectedStartAuthCookieData), + ); + expect(mockResponse.setHeader).toHaveBeenCalledTimes(2); + expect(mockResponse.setHeader).toHaveBeenCalledWith('Location', '/url'); + expect(mockResponse.setHeader).toHaveBeenCalledWith('Content-Length', '0'); + expect(mockResponse.statusCode).toEqual(301); + expect(mockResponse.end).toHaveBeenCalledTimes(1); + expect(mockResponse.redirect).not.toHaveBeenCalled(); + }); + + const refreshCookieData = { + ...expectedStartAuthCookieData, + path: '/auth/test-provider', + maxAge: THOUSAND_DAYS_MS, + }; + + it('sets the refresh cookie if refresh is enabled', async () => { + const oauthProvider = new OAuthAdapter(providerInstance, { + ...oAuthProviderOptions, + isOriginAllowed: () => false, + }); + + const mockRequest = createEncodedQueryMockRequest(defaultState); await oauthProvider.frameHandler(mockRequest, mockResponse); expect(mockCookieConfigurer).toHaveBeenCalledTimes(1); @@ -153,15 +164,26 @@ describe('OAuthAdapter', () => { expect(mockResponse.cookie).toHaveBeenCalledWith( expect.stringContaining('test-provider-refresh-token'), expect.stringContaining('token'), - expect.objectContaining({ - httpOnly: true, - path: '/auth/test-provider', - maxAge: THOUSAND_DAYS_MS, - domain: 'domain.org', - secure: false, - sameSite: 'lax', - }), + expect.objectContaining(refreshCookieData), ); + expect(mockResponse.redirect).not.toHaveBeenCalled(); + }); + + it('sets the refresh cookie if refresh is enabled with redirect', async () => { + const oauthProvider = new OAuthAdapter(providerInstance, { + ...oAuthProviderOptions, + isOriginAllowed: () => false, + }); + + const state = { + ...defaultState, + redirectUrl: 'http://localhost:3000', + flow: 'redirect', + }; + const mockRequest = createEncodedQueryMockRequest(state); + + await oauthProvider.frameHandler(mockRequest, mockResponse); + expect(mockResponse.redirect).toHaveBeenCalledTimes(1); }); it('persists scope through cookie if enabled', async () => { @@ -179,32 +201,15 @@ describe('OAuthAdapter', () => { }); // First we test the /start request, making sure state is set - const mockStartReq = { - query: { - scope: 'user', - env: 'development', - }, - } as unknown as express.Request; - const mockStartRes = { - cookie: jest.fn().mockReturnThis(), - end: jest.fn().mockReturnThis(), - setHeader: jest.fn().mockReturnThis(), - statusCode: jest.fn().mockReturnThis(), - } as unknown as express.Response; - - await oauthProvider.start(mockStartReq, mockStartRes); + await oauthProvider.start(mockStartRequest, mockResponse); expect(handlers.start).toHaveBeenCalledTimes(1); expect(handlers.start).toHaveBeenCalledWith({ - query: { - scope: 'user', - env: 'development', - }, + ...mockStartRequest, scope: 'user', state: { nonce: expect.any(String), env: 'development', - origin: undefined, scope: 'user', }, }); @@ -223,6 +228,7 @@ describe('OAuthAdapter', () => { cookie: jest.fn().mockReturnThis(), setHeader: jest.fn().mockReturnThis(), end: jest.fn().mockReturnThis(), + redirect: jest.fn().mockReturnThis(), } as unknown as express.Response; await oauthProvider.frameHandler(mockHandleReq, mockHandleRes); @@ -230,17 +236,11 @@ describe('OAuthAdapter', () => { expect(mockHandleRes.cookie).toHaveBeenCalledWith( 'test-provider-granted-scope', 'user', - expect.objectContaining({ - httpOnly: true, - path: '/auth/test-provider', - maxAge: THOUSAND_DAYS_MS, - domain: 'domain.org', - secure: false, - sameSite: 'lax', - }), + expect.objectContaining(refreshCookieData), ); + expect(mockResponse.redirect).not.toHaveBeenCalled(); - // Them make sure scopes are forwarded correctly during refresh + // Then make sure scopes are forwarded correctly during refresh const mockRefreshReq = { query: { scope: 'ignore-me' }, cookies: { @@ -252,6 +252,7 @@ describe('OAuthAdapter', () => { const mockRefreshRes = { status: jest.fn().mockReturnThis(), json: jest.fn().mockReturnThis(), + redirect: jest.fn().mockReturnThis(), } as unknown as express.Response; await oauthProvider.refresh(mockRefreshReq, mockRefreshRes); expect(handlers.refresh).toHaveBeenCalledTimes(1); @@ -261,8 +262,18 @@ describe('OAuthAdapter', () => { refreshToken: 'refresh-token', }), ); + expect(mockRefreshRes.redirect).not.toHaveBeenCalled(); }); + const mockRequestWithHeader = { + header: () => 'XMLHttpRequest', + cookies: { + 'test-provider-refresh-token': 'token', + }, + query: {}, + get: jest.fn(), + } as unknown as express.Request; + it('removes refresh cookie and calls logout handler when logging out', async () => { const logoutSpy = jest.spyOn(providerInstance, 'logout'); const oauthProvider = new OAuthAdapter(providerInstance, { @@ -270,22 +281,8 @@ describe('OAuthAdapter', () => { isOriginAllowed: () => false, }); - const mockRequest = { - cookies: { - 'test-provider-refresh-token': 'token', - }, - header: () => 'XMLHttpRequest', - get: jest.fn(), - } as unknown as express.Request; - - const mockResponse = { - cookie: jest.fn().mockReturnThis(), - end: jest.fn().mockReturnThis(), - status: jest.fn().mockReturnThis(), - } as unknown as express.Response; - - await oauthProvider.logout(mockRequest, mockResponse); - expect(mockRequest.get).toHaveBeenCalledTimes(1); + await oauthProvider.logout(mockRequestWithHeader, mockResponse); + expect(mockRequestWithHeader.get).toHaveBeenCalledTimes(1); expect(logoutSpy).toHaveBeenCalledTimes(1); expect(mockResponse.cookie).toHaveBeenCalledTimes(1); expect(mockResponse.cookie).toHaveBeenCalledWith( @@ -294,6 +291,7 @@ describe('OAuthAdapter', () => { expect.objectContaining({ path: '/auth/test-provider' }), ); expect(mockResponse.end).toHaveBeenCalledTimes(1); + expect(mockResponse.redirect).not.toHaveBeenCalled(); }); it('gets new access-token when refreshing', async () => { @@ -302,20 +300,7 @@ describe('OAuthAdapter', () => { isOriginAllowed: () => false, }); - const mockRequest = { - header: () => 'XMLHttpRequest', - cookies: { - 'test-provider-refresh-token': 'token', - }, - query: {}, - } as unknown as express.Request; - - const mockResponse = { - json: jest.fn().mockReturnThis(), - status: jest.fn().mockReturnThis(), - } as unknown as express.Response; - - await oauthProvider.refresh(mockRequest, mockResponse); + await oauthProvider.refresh(mockRequestWithHeader, mockResponse); expect(mockResponse.json).toHaveBeenCalledTimes(1); expect(mockResponse.json).toHaveBeenCalledWith({ ...mockResponseData, @@ -328,6 +313,7 @@ describe('OAuthAdapter', () => { }, }, }); + expect(mockResponse.redirect).not.toHaveBeenCalled(); }); it('sets new access-token when old cookie exists', async () => { @@ -337,20 +323,12 @@ describe('OAuthAdapter', () => { }); const mockRequest = { - header: () => 'XMLHttpRequest', + ...mockRequestWithHeader, cookies: { 'test-provider-refresh-token': 'old-token', }, - query: {}, - get: jest.fn(), } as unknown as express.Request; - const mockResponse = { - json: jest.fn().mockReturnThis(), - status: jest.fn().mockReturnThis(), - cookie: jest.fn().mockReturnThis(), - } as unknown as express.Response; - await oauthProvider.refresh(mockRequest, mockResponse); expect(mockRequest.get).toHaveBeenCalledTimes(1); expect(mockCookieConfigurer).toHaveBeenCalledTimes(1); @@ -358,15 +336,9 @@ describe('OAuthAdapter', () => { expect(mockResponse.cookie).toHaveBeenCalledWith( 'test-provider-refresh-token', 'token', - expect.objectContaining({ - httpOnly: true, - path: '/auth/test-provider', - maxAge: THOUSAND_DAYS_MS, - domain: 'domain.org', - secure: false, - sameSite: 'lax', - }), + expect.objectContaining(refreshCookieData), ); + expect(mockResponse.redirect).not.toHaveBeenCalled(); }); it('sets the correct nonce cookie configuration', async () => { @@ -380,162 +352,89 @@ describe('OAuthAdapter', () => { ...oAuthProviderOptions, }); - const mockRequest = { - query: { - scope: 'user', - env: 'development', - origin: 'http://domain.org', - }, - } as unknown as express.Request; - - const mockResponse = { - cookie: jest.fn().mockReturnThis(), - end: jest.fn().mockReturnThis(), - setHeader: jest.fn().mockReturnThis(), - statusCode: jest.fn().mockReturnThis(), - } as unknown as express.Response; - - await oauthProvider.start(mockRequest, mockResponse); + await oauthProvider.start(mockStartRequest, mockResponse); expect(mockCookieConfigurer).not.toHaveBeenCalled(); expect(mockResponse.cookie).toHaveBeenCalledTimes(1); expect(mockResponse.cookie).toHaveBeenCalledWith( `${oAuthProviderOptions.providerId}-nonce`, expect.any(String), - expect.objectContaining({ - httpOnly: true, - domain: 'domain.org', - maxAge: TEN_MINUTES_MS, - path: '/auth/test-provider/handler', - secure: false, - sameSite: 'lax', - }), + expect.objectContaining(expectedStartAuthCookieData), ); + expect(mockResponse.redirect).not.toHaveBeenCalled(); }); - it('sets the correct nonce cookie configuration using origin from request', async () => { - const config = { - baseUrl: 'http://domain.org/auth', - appUrl: 'http://domain.org', - isOriginAllowed: () => false, - }; + const config = { + baseUrl: 'http://domain.org/auth', + appUrl: 'http://domain.org', + isOriginAllowed: () => false, + }; + const mockStartRequestWithOrigin = { + query: { + scope: 'user', + env: 'development', + origin: 'http://other.domain', + }, + } as unknown as express.Request; + + it('sets the correct nonce cookie configuration using origin from request', async () => { const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, { ...oAuthProviderOptions, callbackUrl: 'https://domain.org/auth/test-provider/handler/frame', }); - const mockRequest = { - query: { - scope: 'user', - env: 'development', - origin: 'http://other.domain', - }, - } as unknown as express.Request; - - const mockResponse = { - cookie: jest.fn().mockReturnThis(), - end: jest.fn().mockReturnThis(), - setHeader: jest.fn().mockReturnThis(), - statusCode: jest.fn().mockReturnThis(), - } as unknown as express.Response; - - await oauthProvider.start(mockRequest, mockResponse); + await oauthProvider.start(mockStartRequestWithOrigin, mockResponse); expect(mockCookieConfigurer).not.toHaveBeenCalled(); expect(mockResponse.cookie).toHaveBeenCalledTimes(1); expect(mockResponse.cookie).toHaveBeenCalledWith( `${oAuthProviderOptions.providerId}-nonce`, expect.any(String), expect.objectContaining({ - httpOnly: true, - domain: 'domain.org', - maxAge: TEN_MINUTES_MS, - path: '/auth/test-provider/handler', + ...expectedStartAuthCookieData, secure: true, sameSite: 'none', }), ); + expect(mockResponse.redirect).not.toHaveBeenCalled(); }); - it('sets the correct cookie configuration using an secure callbackUrl', async () => { - const config = { - baseUrl: 'https://domain.org/auth', - appUrl: 'http://domain.org', - isOriginAllowed: () => false, - }; + const secureCookieData = { + ...refreshCookieData, + secure: true, + sameSite: 'lax', + maxAge: THOUSAND_DAYS_MS, + }; + it('sets the correct cookie configuration using an secure callbackUrl', async () => { const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, { ...oAuthProviderOptions, callbackUrl: 'https://domain.org/auth/test-provider/handler/frame', }); - const state = { - nonce: 'nonce', - env: 'development', - }; - - const mockRequest = { - cookies: { - 'test-provider-nonce': 'nonce', - }, - query: { - state: encodeState(state), - }, - } as unknown as express.Request; - - const mockResponse = { - cookie: jest.fn().mockReturnThis(), - setHeader: jest.fn().mockReturnThis(), - end: jest.fn().mockReturnThis(), - } as unknown as express.Response; - + const mockRequest = createEncodedQueryMockRequest(defaultState); await oauthProvider.frameHandler(mockRequest, mockResponse); expect(mockCookieConfigurer).not.toHaveBeenCalled(); expect(mockResponse.cookie).toHaveBeenCalledTimes(1); expect(mockResponse.cookie).toHaveBeenCalledWith( expect.stringContaining('test-provider-refresh-token'), expect.stringContaining('token'), - expect.objectContaining({ - httpOnly: true, - domain: 'domain.org', - path: '/auth/test-provider', - secure: true, - sameSite: 'lax', - }), + expect.objectContaining(secureCookieData), ); + expect(mockResponse.redirect).not.toHaveBeenCalled(); }); - it('sets the correct cookie configuration when on different domains and secure', async () => { - const config = { - baseUrl: 'https://domain.org/auth', - appUrl: 'http://domain.org', - isOriginAllowed: () => false, - }; + const secureSameSiteNoneCookieData = { + ...secureCookieData, + sameSite: 'none', + }; + it('sets the correct cookie configuration when on different domains and secure', async () => { const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, { ...oAuthProviderOptions, callbackUrl: 'https://authdomain.org/auth/test-provider/handler/frame', }); - const state = { - nonce: 'nonce', - env: 'development', - }; - - const mockRequest = { - cookies: { - 'test-provider-nonce': 'nonce', - }, - query: { - state: encodeState(state), - }, - } as unknown as express.Request; - - const mockResponse = { - cookie: jest.fn().mockReturnThis(), - setHeader: jest.fn().mockReturnThis(), - end: jest.fn().mockReturnThis(), - } as unknown as express.Response; - + const mockRequest = createEncodedQueryMockRequest(defaultState); await oauthProvider.frameHandler(mockRequest, mockResponse); expect(mockCookieConfigurer).not.toHaveBeenCalled(); expect(mockResponse.cookie).toHaveBeenCalledTimes(1); @@ -543,106 +442,108 @@ describe('OAuthAdapter', () => { expect.stringContaining('test-provider-refresh-token'), expect.stringContaining('token'), expect.objectContaining({ - httpOnly: true, + ...secureSameSiteNoneCookieData, domain: 'authdomain.org', - path: '/auth/test-provider', - secure: true, - sameSite: 'none', }), ); + expect(mockResponse.redirect).not.toHaveBeenCalled(); }); + const configOriginAllowed = { + ...config, + isOriginAllowed: () => true, + }; + it('sets the correct cookie configuration using origin from state', async () => { - const config = { - baseUrl: 'https://domain.org/auth', - appUrl: 'http://domain.org', - isOriginAllowed: () => true, - }; + const oauthProvider = OAuthAdapter.fromConfig( + configOriginAllowed, + providerInstance, + { + ...oAuthProviderOptions, + callbackUrl: 'https://domain.org/auth/test-provider/handler/frame', + }, + ); - const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, { - ...oAuthProviderOptions, - callbackUrl: 'https://domain.org/auth/test-provider/handler/frame', - }); - - const state = { - nonce: 'nonce', - env: 'development', + const mockRequest = createEncodedQueryMockRequest({ + ...defaultState, origin: 'http://other.domain', - }; - - const mockRequest = { - cookies: { - 'test-provider-nonce': 'nonce', - }, - query: { - state: encodeState(state), - }, - } as unknown as express.Request; - - const mockResponse = { - cookie: jest.fn().mockReturnThis(), - setHeader: jest.fn().mockReturnThis(), - end: jest.fn().mockReturnThis(), - } as unknown as express.Response; - + }); await oauthProvider.frameHandler(mockRequest, mockResponse); expect(mockCookieConfigurer).not.toHaveBeenCalled(); expect(mockResponse.cookie).toHaveBeenCalledTimes(1); expect(mockResponse.cookie).toHaveBeenCalledWith( expect.stringContaining('test-provider-refresh-token'), expect.stringContaining('token'), - expect.objectContaining({ - httpOnly: true, - domain: 'domain.org', - path: '/auth/test-provider', - secure: true, - sameSite: 'none', - }), + expect.objectContaining(secureSameSiteNoneCookieData), ); + expect(mockResponse.redirect).not.toHaveBeenCalled(); }); - it('sets the correct cookie configuration using origin from header', async () => { - const config = { - baseUrl: 'https://domain.org/auth', - appUrl: 'http://domain.org', - isOriginAllowed: () => false, - }; + const mockRequestWithGetMockReturn = { + header: () => 'XMLHttpRequest', + cookies: { + 'test-provider-refresh-token': 'old-token', + }, + query: {}, + get: jest.fn().mockReturnValue('http://other.domain'), + } as unknown as express.Request; + it('sets the correct cookie configuration using origin from header', async () => { const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, { ...oAuthProviderOptions, callbackUrl: 'https://domain.org/auth/test-provider/handler/frame', }); - const mockRequest = { - header: () => 'XMLHttpRequest', - cookies: { - 'test-provider-refresh-token': 'old-token', - }, - query: {}, - get: jest.fn().mockReturnValue('http://other.domain'), - } as unknown as express.Request; - - const mockResponse = { - json: jest.fn().mockReturnThis(), - status: jest.fn().mockReturnThis(), - cookie: jest.fn().mockReturnThis(), - } as unknown as express.Response; - - await oauthProvider.refresh(mockRequest, mockResponse); - expect(mockRequest.get).toHaveBeenCalledTimes(1); + await oauthProvider.refresh(mockRequestWithGetMockReturn, mockResponse); + expect(mockRequestWithGetMockReturn.get).toHaveBeenCalledTimes(1); expect(mockCookieConfigurer).not.toHaveBeenCalled(); expect(mockResponse.cookie).toHaveBeenCalledTimes(1); expect(mockResponse.cookie).toHaveBeenCalledWith( 'test-provider-refresh-token', 'token', - expect.objectContaining({ - httpOnly: true, - path: '/auth/test-provider', - maxAge: THOUSAND_DAYS_MS, - domain: 'domain.org', - secure: true, - sameSite: 'none', - }), + expect.objectContaining(secureSameSiteNoneCookieData), ); + expect(mockResponse.redirect).not.toHaveBeenCalled(); + }); + + it('executed a response redirect when flow query string is set to "redirect"', async () => { + const handlers = { + start: jest.fn(async (_req: { state: OAuthState }) => ({ + url: '/url', + status: 301, + })), + handler: jest.fn(async () => ({ response: mockResponseData })), + refresh: jest.fn(async () => ({ response: mockResponseData })), + }; + const configWithNoPopupEnabled = { + ...configOriginAllowed, + }; + const oauthProvider = OAuthAdapter.fromConfig( + configWithNoPopupEnabled, + handlers, + { + ...oAuthProviderOptions, + callbackUrl: 'https://domain.org/auth/test-provider/handler/frame', + }, + ); + + const state = { + ...defaultState, + origin: 'http://other.domain', + redirectUrl: 'http://domain.org', + flow: 'redirect', + }; + + const mockRequest = { + ...createEncodedQueryMockRequest(state), + get: jest.fn().mockReturnValue('http://other.domain'), + } as unknown as express.Request; + + await oauthProvider.frameHandler(mockRequest, mockResponse); + expect(mockRequest.get).not.toHaveBeenCalled(); + expect(mockCookieConfigurer).not.toHaveBeenCalled(); + expect(mockResponse.cookie).not.toHaveBeenCalled(); + expect(mockResponse.redirect).toHaveBeenCalledTimes(1); + expect(mockResponse.redirect).toHaveBeenCalledWith('http://domain.org'); }); }); diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts index 85104e9608..5f51b2d301 100644 --- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts +++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts @@ -33,7 +33,11 @@ import { NotAllowedError, } from '@backstage/errors'; import { defaultCookieConfigurer, readState, verifyNonce } from './helpers'; -import { postMessageResponse, ensuresXRequestedWith } from '../flow'; +import { + postMessageResponse, + ensuresXRequestedWith, + WebMessageResponse, +} from '../flow'; import { OAuthHandlers, OAuthStartRequest, @@ -98,6 +102,8 @@ export class OAuthAdapter implements AuthProviderRouteHandlers { const scope = req.query.scope?.toString() ?? ''; const env = req.query.env?.toString(); const origin = req.query.origin?.toString(); + const redirectUrl = req.query.redirectUrl?.toString(); + const flow = req.query.flow?.toString(); if (!env) { throw new InputError('No env provided in request query parameters'); @@ -109,7 +115,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers { // set a nonce cookie before redirecting to oauth provider this.setNonceCookie(res, nonce, cookieConfig); - const state: OAuthState = { nonce, env, origin }; + const state: OAuthState = { nonce, env, origin, redirectUrl, flow }; // If scopes are persisted then we pass them through the state so that we // can set the cookie on successful auth @@ -169,11 +175,21 @@ export class OAuthAdapter implements AuthProviderRouteHandlers { const identity = await this.populateIdentity(response.backstageIdentity); - // post message back to popup if successful - return postMessageResponse(res, appOrigin, { + const responseObj: WebMessageResponse = { type: 'authorization_response', response: { ...response, backstageIdentity: identity }, - }); + }; + + if (state.flow === 'redirect') { + if (!state.redirectUrl) { + throw new InputError( + 'No redirectUrl provided in request query parameters', + ); + } + res.redirect(state.redirectUrl); + } + // post message back to popup if successful + return postMessageResponse(res, appOrigin, responseObj); } catch (error) { const { name, message } = isError(error) ? error diff --git a/plugins/auth-backend/src/lib/oauth/types.ts b/plugins/auth-backend/src/lib/oauth/types.ts index 3902c3f026..e960af2988 100644 --- a/plugins/auth-backend/src/lib/oauth/types.ts +++ b/plugins/auth-backend/src/lib/oauth/types.ts @@ -90,6 +90,8 @@ export type OAuthState = { env: string; origin?: string; scope?: string; + redirectUrl?: string; + flow?: string; }; /** @public */ diff --git a/plugins/auth-backend/src/providers/microsoft/provider.ts b/plugins/auth-backend/src/providers/microsoft/provider.ts index fd2a1529a7..9b14a3c91b 100644 --- a/plugins/auth-backend/src/providers/microsoft/provider.ts +++ b/plugins/auth-backend/src/providers/microsoft/provider.ts @@ -50,6 +50,8 @@ import { import { Logger } from 'winston'; import fetch from 'node-fetch'; +const BACKSTAGE_SESSION_EXPIRATION = 3600; + type PrivateInfo = { refreshToken: string; }; @@ -145,12 +147,17 @@ export class MicrosoftAuthProvider implements OAuthHandlers { const { profile } = await this.authHandler(result, this.resolverContext); + const expiresInSeconds = + result.params.expires_in === undefined + ? BACKSTAGE_SESSION_EXPIRATION + : Math.min(result.params.expires_in, BACKSTAGE_SESSION_EXPIRATION); + const response: OAuthResponse = { providerInfo: { idToken: result.params.id_token, accessToken: result.accessToken, scope: result.params.scope, - expiresInSeconds: result.params.expires_in, + expiresInSeconds, }, profile, }; diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 0e7bcefae2..210658c09d 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-auth-node +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.2.12 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + ## 0.2.12-next.2 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 093b23add9..6e3a74c66d 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.2.12-next.2", + "version": "0.2.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index a4a7492ffc..6aae0be627 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-azure-devops-backend +## 0.3.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + +## 0.3.22 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.3.22-next.2 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index 1d921a468a..dcafd05680 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.3.22-next.2", + "version": "0.3.23-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md index b9fcc646b7..de9bb877d4 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-azure-devops +## 0.2.8-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-devops-common@0.3.0 + +## 0.2.7 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.2.7-next.2 ### Patch Changes diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index f8bc46f422..40104c5036 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops", - "version": "0.2.7-next.2", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,7 +37,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "humanize-duration": "^3.27.0", "luxon": "^3.0.0", "react-use": "^17.2.4" diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index 9bc9b99388..5fda3502c5 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-azure-sites-backend +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + +## 0.1.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index 3cb7023933..77b6b3091c 100644 --- a/plugins/azure-sites-backend/package.json +++ b/plugins/azure-sites-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites-backend", - "version": "0.1.5-next.2", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites/CHANGELOG.md b/plugins/azure-sites/CHANGELOG.md index 1de9e7a804..9c4b55e67f 100644 --- a/plugins/azure-sites/CHANGELOG.md +++ b/plugins/azure-sites/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-azure-sites +## 0.1.6-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-sites-common@0.1.0 + +## 0.1.5 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index 6daadf199a..6c8acb0fda 100644 --- a/plugins/azure-sites/package.json +++ b/plugins/azure-sites/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites", - "version": "0.1.5-next.2", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,7 +40,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "luxon": "^3.0.0", "react-use": "^17.2.4" }, diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index 837e71bcce..88fb467687 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-badges-backend +## 0.1.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## 0.1.37 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + ## 0.1.37-next.2 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index f570a47874..15caf0ec10 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges-backend", "description": "A Backstage backend plugin that generates README badges for your entities", - "version": "0.1.37-next.2", + "version": "0.1.38-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index 567c3e81d6..da109890b7 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-badges +## 0.2.41-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.2.40 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.2.40-next.2 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index 7e817c024d..51ed87a34a 100644 --- a/plugins/badges/package.json +++ b/plugins/badges/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges", "description": "A Backstage plugin that generates README badges for your entities", - "version": "0.2.40-next.2", + "version": "0.2.41-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,7 +37,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 203c1ef67f..da7151291a 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-bazaar-backend +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + ## 0.2.6-next.2 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index c9221e5c69..78ddc51153 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.2.6-next.2", + "version": "0.2.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index 57ba471000..139a8af90c 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-bazaar +## 0.2.7-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-catalog@1.10.0-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/cli@0.22.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/cli@0.22.4 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.2.6-next.2 ### Patch Changes diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index 6a2311004b..ef455587da 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.6-next.2", + "version": "0.2.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,7 +34,7 @@ "@date-io/luxon": "1.x", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/pickers": "^3.3.10", "@testing-library/jest-dom": "^5.10.1", "luxon": "^3.0.0", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index 0902619c92..faeeca7d48 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.2.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/integration@1.4.3 + ## 0.2.4-next.0 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 1290d9c8b8..c5cf434a60 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", "description": "Common functionalities for bitbucket-cloud plugins", - "version": "0.2.4-next.0", + "version": "0.2.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md index 1a9d86268d..4a92237aaa 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-bitrise +## 0.1.44-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.1.43 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.43-next.2 ### Patch Changes diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index 41cb8562b5..9cdbeda3cd 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitrise", "description": "A Backstage plugin that integrates towards Bitrise", - "version": "0.1.43-next.2", + "version": "0.1.44-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -30,7 +30,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "cross-fetch": "^3.1.5", "lodash": "^4.17.21", "luxon": "^3.0.0", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index f4e268aae7..1aab4dac82 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/plugin-kubernetes-common@0.6.2-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-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## 0.1.17 + +### Patch Changes + +- 90469c02c8c: Renamed `awsS3EntityProviderCatalogModule` to `catalogModuleAwsS3EntityProviders` 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. +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 +- bf611cf019a: Fix missing `dependencies` in `package.json` +- 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/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-kubernetes-common@0.6.1 + ## 0.1.17-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 79271cf4de..0380c59585 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", "description": "A Backstage catalog backend module that helps integrate towards AWS", - "version": "0.1.17-next.2", + "version": "0.1.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 86566d383f..3a7d09070f 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.15-next.0 + +### Patch Changes + +- 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 `azureDevOpsEntityProviderCatalogModule` to `catalogModuleAzureDevOpsEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- c17fa101825: Add branch filter support + https://backstage.io/docs/integrations/azure/discovery +- 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`. +- 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 diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index afe85243db..4ed831fcfd 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", "description": "A Backstage catalog backend module that helps integrate towards Azure", - "version": "0.1.14-next.2", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-azure/src/lib/azure.ts b/plugins/catalog-backend-module-azure/src/lib/azure.ts index 0c96d133d3..714090d5bc 100644 --- a/plugins/catalog-backend-module-azure/src/lib/azure.ts +++ b/plugins/catalog-backend-module-azure/src/lib/azure.ts @@ -34,6 +34,7 @@ export interface CodeSearchResultItem { project: { name: string; }; + branch?: string; } const isCloud = (host: string) => host === 'dev.azure.com'; diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts index 23a668d60b..d89f10c949 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts @@ -105,9 +105,13 @@ describe('AzureDevOpsEntityProvider', () => { await (taskDef.fn as () => Promise)(); const expectedEntities = codeSearchResults.map(item => { - const url = encodeURI( - `${expectedBaseUrl}/_git/${item.repository.name}?path=${item.path}`, - ); + const url = item.branch + ? encodeURI( + `${expectedBaseUrl}/_git/${item.repository.name}?path=${item.path}&version=GB${item.branch}`, + ) + : encodeURI( + `${expectedBaseUrl}/_git/${item.repository.name}?path=${item.path}`, + ); return { entity: { apiVersion: 'backstage.io/v1alpha1', @@ -177,6 +181,36 @@ describe('AzureDevOpsEntityProvider', () => { ); }); + // eslint-disable-next-line jest/expect-expect + it('single mutation when repos use branch filter', async () => { + return expectMutation( + 'allReposSingleFile', + { + organization: 'myorganization', + project: 'myproject', + branch: 'mybranch', + }, + [ + { + fileName: 'catalog-info.yaml', + path: '/catalog-info.yaml', + repository: { + name: 'myrepo', + }, + project: { + name: 'myproject', + }, + branch: 'mybranch', + }, + ], + 'https://dev.azure.com/myorganization/myproject', + { + 'myrepo?path=/catalog-info.yaml': + 'generated-589e8cc47341987c7a34f5291791151fa64f7754', + }, + ); + }); + // eslint-disable-next-line jest/expect-expect it('single mutation when multiple repos have multiple files', async () => { return expectMutation( diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts index 89572286a1..6ad4e9ae0b 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts @@ -177,8 +177,12 @@ export class AzureDevOpsEntityProvider implements EntityProvider { private createObjectUrl(file: CodeSearchResultItem): string { const baseUrl = `https://${this.config.host}/${this.config.organization}/${file.project.name}`; - return encodeURI( - `${baseUrl}/_git/${file.repository.name}?path=${file.path}`, - ); + + let fullUrl = `${baseUrl}/_git/${file.repository.name}?path=${file.path}`; + if (this.config.branch) { + fullUrl += `&version=GB${this.config.branch}`; + } + + return encodeURI(fullUrl); } } diff --git a/plugins/catalog-backend-module-azure/src/providers/config.test.ts b/plugins/catalog-backend-module-azure/src/providers/config.test.ts index a09079f1c3..02dbaab90e 100644 --- a/plugins/catalog-backend-module-azure/src/providers/config.test.ts +++ b/plugins/catalog-backend-module-azure/src/providers/config.test.ts @@ -44,17 +44,30 @@ describe('readAzureDevOpsConfigs', () => { }, }, }; + const provider5 = { + host: 'azure.mycompany.com', + organization: 'mycompany', + project: 'myproject', + branch: 'mybranch', + }; + const config = { catalog: { providers: { - azureDevOps: { provider1, provider2, provider3, provider4 }, + azureDevOps: { + provider1, + provider2, + provider3, + provider4, + provider5, + }, }, }, }; const actual = readAzureDevOpsConfigs(new ConfigReader(config)); - expect(actual).toHaveLength(4); + expect(actual).toHaveLength(5); expect(actual[0]).toEqual({ ...provider1, path: '/catalog-info.yaml', @@ -85,5 +98,12 @@ describe('readAzureDevOpsConfigs', () => { frequency: Duration.fromISO(provider4.schedule.frequency), }, }); + expect(actual[4]).toEqual({ + ...provider5, + branch: 'mybranch', + path: '/catalog-info.yaml', + repository: '*', + id: 'provider5', + }); }); }); diff --git a/plugins/catalog-backend-module-azure/src/providers/config.ts b/plugins/catalog-backend-module-azure/src/providers/config.ts index c84c242488..3c10a50863 100644 --- a/plugins/catalog-backend-module-azure/src/providers/config.ts +++ b/plugins/catalog-backend-module-azure/src/providers/config.ts @@ -41,6 +41,7 @@ function readAzureDevOpsConfig(id: string, config: Config): AzureDevOpsConfig { const project = config.getString('project'); const host = config.getOptionalString('host') || 'dev.azure.com'; const repository = config.getOptionalString('repository') || '*'; + const branch = config.getOptionalString('branch'); const path = config.getOptionalString('path') || '/catalog-info.yaml'; const schedule = config.has('schedule') @@ -53,6 +54,7 @@ function readAzureDevOpsConfig(id: string, config: Config): AzureDevOpsConfig { organization, project, repository, + branch, path, schedule, }; diff --git a/plugins/catalog-backend-module-azure/src/providers/types.ts b/plugins/catalog-backend-module-azure/src/providers/types.ts index b22a8551a5..3cd827b380 100644 --- a/plugins/catalog-backend-module-azure/src/providers/types.ts +++ b/plugins/catalog-backend-module-azure/src/providers/types.ts @@ -22,6 +22,7 @@ export type AzureDevOpsConfig = { organization: string; project: string; repository: string; + branch?: string; path: string; schedule?: TaskScheduleDefinition; }; diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index b1de810710..4a289a393f 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,43 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.11-next.0 + +### Patch Changes + +- 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-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## 0.1.10 + +### Patch Changes + +- 90469c02c8c: Renamed `bitbucketCloudEntityProviderCatalogModule` to `catalogModuleBitbucketCloudEntityProvider` 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`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/config@1.0.7 + ## 0.1.10-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 8ed58f0333..6e9aed31be 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", - "version": "0.1.10-next.2", + "version": "0.1.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 00341a3870..12e3d2e7d8 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.9-next.0 + +### Patch Changes + +- 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/plugin-catalog-node@1.3.5-next.0 + +## 0.1.8 + +### Patch Changes + +- 90469c02c8c: Renamed `bitbucketServerEntityProviderCatalogModule` to `catalogModuleBitbucketServerEntityProvider` 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`. +- 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 + ## 0.1.8-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index 433d4bc907..9b680a80ca 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.1.8-next.2", + "version": "0.1.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md index eef6da4c0e..c10530f41a 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## 0.2.10 + +### Patch Changes + +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.2.10-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index 79fbbe08c4..92c0adda4a 100644 --- a/plugins/catalog-backend-module-bitbucket/package.json +++ b/plugins/catalog-backend-module-bitbucket/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket", - "version": "0.2.10-next.2", + "version": "0.2.11-next.0", "deprecated": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 07ab61c8c4..98f0959dfd 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.12-next.0 + +### Patch Changes + +- 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/plugin-catalog-node@1.3.5-next.0 + +## 0.1.11 + +### Patch Changes + +- 90469c02c8c: Renamed `gerritEntityProviderCatalogModule` to `catalogModuleGerritEntityProvider` 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`. +- 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 + ## 0.1.11-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index af9727cbf9..3d66f715cc 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.1.11-next.2", + "version": "0.1.12-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 1e0c455391..44760980cb 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-catalog-backend-module-github +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @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-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## 0.2.6 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 90469c02c8c: Renamed `githubEntityProviderCatalogModule` to `catalogModuleGithubEntityProvider` 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`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @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/plugin-catalog-common@1.0.12 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.2.6-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index fe9183917e..ba7233e70f 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-github", "description": "A Backstage catalog backend module that helps integrate towards GitHub", - "version": "0.2.6-next.2", + "version": "0.2.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/src/lib/github.test.ts b/plugins/catalog-backend-module-github/src/lib/github.test.ts index 624ea5c3c9..0345d4ba3e 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.test.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.test.ts @@ -16,11 +16,10 @@ import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { GroupEntity, UserEntity } from '@backstage/catalog-model'; -import { graphql } from '@octokit/graphql'; +import { graphql as graphqlOctokit } from '@octokit/graphql'; import { graphql as graphqlMsw } from 'msw'; import { setupServer } from 'msw/node'; import { TeamTransformer, UserTransformer } from './defaultTransformers'; - import { getOrganizationTeams, getOrganizationUsers, @@ -35,11 +34,9 @@ import { } from './github'; import fetch from 'node-fetch'; -// Workaround for Node.js 18, where native fetch is available, but not yet picked up by msw -// TODO(Rugvip): remove once https://github.com/mswjs/msw/issues/1388 is resolved -(global as any).fetch = fetch; - describe('github', () => { + const graphql = graphqlOctokit.defaults({ request: { fetch } }); + const server = setupServer(); setupRequestMockHandlers(server); diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 491d972754..02a274469d 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 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 diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index ed07ea842c..3bdef6958d 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", "description": "A Backstage catalog backend module that helps integrate towards GitLab", - "version": "0.1.14-next.2", + "version": "0.2.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts index 513a5b937f..122aae7f54 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts @@ -18,9 +18,10 @@ import { ConfigReader } from '@backstage/config'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { readGitLabIntegrationConfig } from '@backstage/integration'; import { getVoidLogger } from '@backstage/backend-common'; -import { rest } from 'msw'; -import { setupServer, SetupServerApi } from 'msw/node'; +import { graphql, rest } from 'msw'; +import { setupServer, SetupServer } from 'msw/node'; import { GitLabClient, paginated } from './client'; +import { GitLabGroup, GitLabUser } from './types'; const server = setupServer(); setupRequestMockHandlers(server); @@ -30,12 +31,13 @@ const MOCK_CONFIG = readGitLabIntegrationConfig( host: 'example.com', token: 'test-token', apiBaseUrl: 'https://example.com/api/v4', + baseUrl: 'https://example.com', }), ); const FAKE_PAGED_ENDPOINT = `/some-endpoint`; const FAKE_PAGED_URL = `${MOCK_CONFIG.apiBaseUrl}${FAKE_PAGED_ENDPOINT}`; -function setupFakeFourPageURL(srv: SetupServerApi, url: string) { +function setupFakeFourPageURL(srv: SetupServer, url: string) { srv.use( rest.get(url, (req, res, ctx) => { const page = req.url.searchParams.get('page'); @@ -55,7 +57,7 @@ function setupFakeFourPageURL(srv: SetupServerApi, url: string) { } function setupFakeGroupProjectsEndpoint( - srv: SetupServerApi, + srv: SetupServer, apiBaseUrl: string, groupID: string, ) { @@ -77,7 +79,7 @@ function setupFakeGroupProjectsEndpoint( } function setupFakeInstanceProjectsEndpoint( - srv: SetupServerApi, + srv: SetupServer, apiBaseUrl: string, ) { srv.use( @@ -103,7 +105,7 @@ function setupFakeInstanceProjectsEndpoint( ); } -function setupFakeHasFileEndpoint(srv: SetupServerApi, apiBaseUrl: string) { +function setupFakeHasFileEndpoint(srv: SetupServer, apiBaseUrl: string) { srv.use( rest.head( `${apiBaseUrl}/projects/group%2Frepo/repository/files/catalog-info.yaml`, @@ -259,6 +261,228 @@ describe('GitLabClient', () => { expect(allProjects).toHaveLength(2); }); }); + + it('listUsers gets all users in the instance', async () => { + server.use( + rest.get(`${MOCK_CONFIG.apiBaseUrl}/users`, (_, res, ctx) => + res( + ctx.set('x-next-page', ''), + ctx.json([ + { + id: 1, + username: 'test1', + name: 'Test Testit', + state: 'active', + avatar_url: 'https://secure.gravatar.com/', + web_url: 'https://gitlab.example/test1', + created_at: '2023-01-19T07:27:03.333Z', + bio: '', + location: null, + public_email: null, + skype: '', + linkedin: '', + twitter: '', + website_url: '', + organization: null, + job_title: '', + pronouns: null, + bot: false, + work_information: null, + followers: 0, + following: 0, + is_followed: false, + local_time: null, + last_sign_in_at: '2023-01-19T07:27:49.601Z', + confirmed_at: '2023-01-19T07:27:02.905Z', + last_activity_on: '2023-01-19', + email: 'test@example.com', + theme_id: 1, + color_scheme_id: 1, + projects_limit: 100000, + current_sign_in_at: '2023-01-19T09:09:10.676Z', + identities: [], + can_create_group: true, + can_create_project: true, + two_factor_enabled: false, + external: false, + private_profile: false, + commit_email: 'test@example.com', + is_admin: false, + note: '', + }, + ]), + ), + ), + ); + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const allUsers: GitLabUser[] = []; + for await (const user of paginated( + options => client.listUsers(options), + {}, + )) { + allUsers.push(user); + } + + expect(allUsers).toMatchObject([ + { + id: 1, + username: 'test1', + email: 'test@example.com', + name: 'Test Testit', + state: 'active', + web_url: 'https://gitlab.example/test1', + avatar_url: 'https://secure.gravatar.com/', + }, + ]); + }); + + it('listGroups gets all groups in the instance', async () => { + server.use( + rest.get(`${MOCK_CONFIG.apiBaseUrl}/groups`, (_, res, ctx) => + res( + ctx.set('x-next-page', ''), + ctx.json([ + { + id: 1, + web_url: 'https://gitlab.example/groups/group1', + name: 'group1', + path: 'group1', + description: '', + visibility: 'internal', + share_with_group_lock: false, + require_two_factor_authentication: false, + two_factor_grace_period: 48, + project_creation_level: 'developer', + auto_devops_enabled: null, + subgroup_creation_level: 'owner', + emails_disabled: null, + mentions_disabled: null, + lfs_enabled: true, + default_branch_protection: 2, + avatar_url: null, + request_access_enabled: false, + full_name: '8020', + full_path: '8020', + created_at: '2017-06-19T06:42:34.160Z', + parent_id: null, + }, + ]), + ), + ), + ); + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const allGroups: GitLabGroup[] = []; + for await (const group of paginated( + options => client.listGroups(options), + {}, + )) { + allGroups.push(group); + } + + expect(allGroups).toMatchObject([ + { + id: 1, + name: 'group1', + full_path: '8020', + description: '', + parent_id: null, + }, + ]); + }); + + describe('getGroupMembers', () => { + it('gets member IDs', async () => { + server.use( + graphql + .link(`${MOCK_CONFIG.baseUrl}/api/graphql`) + .operation((_, res, ctx) => + res( + ctx.data({ + group: { + groupMembers: { + nodes: [{ user: { id: 'gid://gitlab/User/1' } }], + pageInfo: { + endCursor: 'end', + hasNextPage: false, + }, + }, + }, + }), + ), + ), + ); + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const members = await client.getGroupMembers('group1'); + + expect(members).toEqual([1]); + }); + + it('rejects when GraphQL returns errors', async () => { + server.use( + graphql + .link(`${MOCK_CONFIG.baseUrl}/api/graphql`) + .operation((_, res, ctx) => + res( + ctx.errors([ + { message: 'Unexpected end of document', locations: [] }, + ]), + ), + ), + ); + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + await expect(() => client.getGroupMembers('group1')).rejects.toThrow( + 'GraphQL errors: [{"message":"Unexpected end of document","locations":[]}]', + ); + }); + + it('traverses multi-page results', async () => { + server.use( + graphql + .link(`${MOCK_CONFIG.baseUrl}/api/graphql`) + .operation((req, res, ctx) => + res( + ctx.data({ + group: { + groupMembers: { + nodes: req.variables.endCursor + ? [{ user: { id: 'gid://gitlab/User/2' } }] + : [{ user: { id: 'gid://gitlab/User/1' } }], + pageInfo: { + endCursor: req.variables.endCursor ? 'end' : 'next', + hasNextPage: !req.variables.endCursor, + }, + }, + }, + }), + ), + ), + ); + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const members = await client.getGroupMembers('group1'); + + expect(members).toEqual([1, 2]); + }); + }); }); describe('paginated', () => { diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index bad0eb2a86..8f8c67895c 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -20,7 +20,7 @@ import { GitLabIntegrationConfig, } from '@backstage/integration'; import { Logger } from 'winston'; -import { GitLabGroup, GitLabMembership, GitLabUser } from './types'; +import { GitLabGroup, GitLabGroupMembersResponse, GitLabUser } from './types'; export type CommonListOptions = { [key: string]: string | number | boolean | undefined; @@ -78,16 +78,11 @@ export class GitLabClient { async listUsers( options?: UserListOptions, ): Promise> { - let requestOptions = options; - - if (!requestOptions) { - requestOptions = {}; - } - - requestOptions.without_project_bots = true; - requestOptions.exclude_internal = true; - - return this.pagedRequest(`/users?`, requestOptions); + return this.pagedRequest(`/users?`, { + ...options, + without_project_bots: true, + exclude_internal: true, + }); } async listGroups( @@ -96,30 +91,51 @@ export class GitLabClient { return this.pagedRequest(`/groups`, options); } - async getUserMemberships(userId: number): Promise { - const endpoint: string = `/users/${encodeURIComponent(userId)}/memberships`; - const request = new URL(`${this.config.apiBaseUrl}${endpoint}`); - request.searchParams.append('per_page', '100'); - - const response = await fetch(request.toString(), { - headers: getGitLabRequestOptions(this.config).headers, - method: 'GET', - }); - - if (!response.ok) { - if (response.status >= 500) { - this.logger.debug( - `Unexpected response when fetching ${request.toString()}. Expected 200 but got ${ - response.status - } - ${response.statusText}`, - ); + async getGroupMembers(groupPath: string): Promise { + const memberIds = []; + let hasNextPage: boolean = false; + let endCursor: string | null = null; + do { + const response: GitLabGroupMembersResponse = await fetch( + `${this.config.baseUrl}/api/graphql`, + { + method: 'POST', + headers: { + ...getGitLabRequestOptions(this.config).headers, + ['Content-Type']: 'application/json', + }, + body: JSON.stringify({ + variables: { group: groupPath, endCursor }, + query: `query($group: ID!, $endCursor: String) { + group(fullPath: $group) { + groupMembers(first: 100, relations: [DIRECT], after: $endCursor) { + nodes { + user { + id + } + } + pageInfo { + endCursor + hasNextPage + } + } + } + }`, + }), + }, + ).then(r => r.json()); + if (response.errors) { + throw new Error(`GraphQL errors: ${JSON.stringify(response.errors)}`); } - return []; - } - - return response.json().then(items => { - return items as GitLabMembership[]; - }); + memberIds.push( + ...response.data.group.groupMembers.nodes.map( + (node: { user: { id: string } }) => + Number(node.user.id.replace(/^gid:\/\/gitlab\/User\//, '')), + ), + ); + ({ hasNextPage, endCursor } = response.data.group.groupMembers.pageInfo); + } while (hasNextPage); + return memberIds; } /** diff --git a/plugins/catalog-backend-module-gitlab/src/lib/types.ts b/plugins/catalog-backend-module-gitlab/src/lib/types.ts index c3fc8a4ede..c27007861b 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/types.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/types.ts @@ -50,11 +50,19 @@ export type GitLabGroup = { parent_id?: number; }; -export type GitLabMembership = { - source_id: number; - source_name: string; - source_type: string; - access_level: number; +export type GitLabGroupMembersResponse = { + errors: { message: string }[]; + data: { + group: { + groupMembers: { + nodes: { user: { id: string } }[]; + pageInfo: { + endCursor: string; + hasNextPage: boolean; + }; + }; + }; + }; }; export type GitlabProviderConfig = { @@ -62,11 +70,12 @@ export type GitlabProviderConfig = { group: string; id: string; /** - * @deprecated use `fallbackBranch` instead + * The name of the branch to be used, to discover catalog files. */ branch?: string; /** - * If there is no default branch defined at the project, this fallback is used to discover catalog files. + * If no `branch` is configured and there is no default branch defined at the project as well, this fallback is used + * to discover catalog files. * Defaults to: `master` */ fallbackBranch: string; diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts index 42fa1b471c..75a4c6414c 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts @@ -449,4 +449,111 @@ describe('GitlabDiscoveryEntityProvider', () => { 'GitlabDiscoveryEntityProvider:test-id', ); }); + + it('should filter found projects based on the branch', async () => { + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'test-gitlab', + apiBaseUrl: 'https://api.gitlab.example/api/v4', + token: '1234', + }, + ], + }, + catalog: { + providers: { + gitlab: { + 'test-id': { + host: 'test-gitlab', + branch: 'test', + }, + }, + }, + }, + }); + const schedule = new PersistingTaskRunner(); + const entityProviderConnection: EntityProviderConnection = { + applyMutation: jest.fn(), + refresh: jest.fn(), + }; + const provider = GitlabDiscoveryEntityProvider.fromConfig(config, { + logger, + schedule, + })[0]; + + server.use( + rest.get( + `https://api.gitlab.example/api/v4/projects`, + (_req, res, ctx) => { + const response = [ + { + id: 123, + default_branch: 'master', + archived: false, + last_activity_at: new Date().toString(), + web_url: 'https://api.gitlab.example/test-group/test-repo', + path_with_namespace: 'test-group/test-repo', + }, + { + id: 124, + default_branch: 'master', + archived: false, + last_activity_at: new Date().toString(), + web_url: 'https://api.gitlab.example/john/example', + path_with_namespace: 'john/example', + }, + ]; + return res(ctx.json(response)); + }, + ), + rest.head( + 'https://api.gitlab.example/api/v4/projects/test-group%2Ftest-repo/repository/files/catalog-info.yaml', + (_, res, ctx) => { + return res(ctx.status(404, 'Not Found')); + }, + ), + rest.head( + 'https://api.gitlab.example/api/v4/projects/john%2Fexample/repository/files/catalog-info.yaml', + (req, res, ctx) => { + if (req.url.searchParams.get('ref') === 'test') { + return res(ctx.status(200)); + } + return res(ctx.status(404, 'Not Found')); + }, + ), + ); + + await provider.connect(entityProviderConnection); + + await provider.refresh(logger); + + expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({ + type: 'full', + entities: [ + { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Location', + metadata: { + annotations: { + 'backstage.io/managed-by-location': + 'url:https://api.gitlab.example/john/example/-/blob/test/catalog-info.yaml', + 'backstage.io/managed-by-origin-location': + 'url:https://api.gitlab.example/john/example/-/blob/test/catalog-info.yaml', + }, + name: 'generated-232185d858fee049986d202c10316d634e76a3d1', + }, + spec: { + presence: 'optional', + target: + 'https://api.gitlab.example/john/example/-/blob/test/catalog-info.yaml', + type: 'url', + }, + }, + locationKey: 'GitlabDiscoveryEntityProvider:test-id', + }, + ], + }); + }); }); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts index ece10ee8c6..6001a32a4a 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts @@ -61,10 +61,7 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { throw new Error('Either schedule or scheduler must be provided.'); } - const providerConfigs = readGitlabConfigs( - config, - options.logger.child({ target: 'GitlabDiscoveryEntityProvider' }), - ); + const providerConfigs = readGitlabConfigs(config); const integrations = ScmIntegrations.fromConfig(config).gitlab; const providers: GitlabDiscoveryEntityProvider[] = []; @@ -181,6 +178,7 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { } if ( + !this.config.branch && this.config.fallbackBranch === '*' && project.default_branch === undefined ) { @@ -188,7 +186,9 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { } const project_branch = - project.default_branch ?? this.config.fallbackBranch; + this.config.branch ?? + project.default_branch ?? + this.config.fallbackBranch; const projectHasFile: boolean = await client.hasFile( project.path_with_namespace ?? '', @@ -211,7 +211,10 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { } private createLocationSpec(project: GitLabProject): LocationSpec { - const project_branch = project.default_branch ?? this.config.fallbackBranch; + const project_branch = + this.config.branch ?? + project.default_branch ?? + this.config.fallbackBranch; return { type: 'url', target: `${project.web_url}/-/blob/${project_branch}/${this.config.catalogFile}`, 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 5a323a8dec..3d6ff0a91a 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts @@ -23,7 +23,7 @@ import { import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; -import { rest } from 'msw'; +import { graphql, rest } from 'msw'; import { setupServer } from 'msw/node'; import { GitlabOrgDiscoveryEntityProvider } from './GitlabOrgDiscoveryEntityProvider'; @@ -318,20 +318,26 @@ describe('GitlabOrgDiscoveryEntityProvider', () => { ]; return res(ctx.json(response)); }), - rest.get( - `https://api.gitlab.example/api/v4/users/1/memberships`, - (_req, res, ctx) => { - const response = [ - { - source_id: 2, - source_name: 'Group 2', - source_type: 'Namespace', - access_level: 50, - }, - ]; - return res(ctx.json(response)); - }, - ), + graphql + .link('https://test-gitlab/api/graphql') + .operation(async (req, res, ctx) => + res( + ctx.data({ + group: { + groupMembers: { + nodes: + req.variables.group === 'group1/group2' + ? [{ user: { id: 'gid://gitlab/User/1' } }] + : [], + pageInfo: { + endCursor: 'end', + hasNextPage: false, + }, + }, + }, + }), + ), + ), ); await provider.connect(entityProviderConnection); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts index acfa784c2e..1fe607afbb 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts @@ -72,10 +72,7 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { throw new Error('Either schedule or scheduler must be provided.'); } - const providerConfigs = readGitlabConfigs( - config, - options.logger.child({ target: 'GitlabOrgDiscoveryEntityProvider' }), - ); + const providerConfigs = readGitlabConfigs(config); const integrations = ScmIntegrations.fromConfig(config).gitlab; const providers: GitlabOrgDiscoveryEntityProvider[] = []; @@ -185,7 +182,7 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { }, ); - const idMappedGroup: { [groupId: number]: GitLabGroup } = {}; + const idMappedUser: { [userId: number]: GitLabUser } = {}; const res: Result = { scanned: 0, @@ -197,6 +194,21 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { matches: [], }; + for await (const user of users) { + if (!this.config.userPattern.test(user.email ?? user.username ?? '')) { + continue; + } + + res.scanned++; + + if (user.state !== 'active') { + continue; + } + + idMappedUser[user.id] = user; + res.matches.push(user); + } + for await (const group of groups) { if (!this.config.groupPattern.test(group.full_path ?? '')) { continue; @@ -212,35 +224,12 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { groupRes.scanned++; groupRes.matches.push(group); - idMappedGroup[group.id] = group; - } - - for await (const user of users) { - if (!this.config.userPattern.test(user.email ?? user.username ?? '')) { - continue; - } - - res.scanned++; - - if (user.state !== 'active') { - continue; - } - - const memberships = await client.getUserMemberships(user.id); - const userGroups: GitLabGroup[] = []; - - for (const i of memberships) { - if ( - i.source_type === 'Namespace' && - idMappedGroup.hasOwnProperty(i.source_id) - ) { - userGroups.push(idMappedGroup[i.source_id]); + for (const id of await client.getGroupMembers(group.full_path)) { + const user = idMappedUser[id]; + if (user) { + user.groups = (user.groups ?? []).concat(group); } } - - user.groups = userGroups; - - res.matches.push(user); } const groupsWithUsers = groupRes.matches.filter(group => { diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts index c9b35e78c2..1035538939 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts @@ -17,9 +17,6 @@ import { ConfigReader } from '@backstage/config'; import { Duration } from 'luxon'; import { readGitlabConfigs } from './config'; -import { getVoidLogger } from '@backstage/backend-common'; - -const logger = getVoidLogger(); describe('config', () => { it('empty gitlab config', () => { @@ -29,7 +26,7 @@ describe('config', () => { }, }); - const result = readGitlabConfigs(config, logger); + const result = readGitlabConfigs(config); expect(result).toHaveLength(0); }); @@ -47,12 +44,13 @@ describe('config', () => { }, }); - const result = readGitlabConfigs(config, logger); + const result = readGitlabConfigs(config); expect(result).toHaveLength(1); result.forEach(r => expect(r).toStrictEqual({ id: 'test', group: 'group', + branch: undefined, fallbackBranch: 'master', host: 'host', catalogFile: 'catalog-info.yaml', @@ -74,6 +72,7 @@ describe('config', () => { group: 'group', host: 'host', branch: 'not-master', + fallbackBranch: 'main', entityFilename: 'custom-file.yaml', }, }, @@ -81,13 +80,14 @@ describe('config', () => { }, }); - const result = readGitlabConfigs(config, logger); + const result = readGitlabConfigs(config); expect(result).toHaveLength(1); result.forEach(r => expect(r).toStrictEqual({ id: 'test', group: 'group', - fallbackBranch: 'not-master', + branch: 'not-master', + fallbackBranch: 'main', host: 'host', catalogFile: 'custom-file.yaml', projectPattern: /[\s\S]*/, @@ -119,12 +119,13 @@ describe('config', () => { }, }); - const result = readGitlabConfigs(config, logger); + const result = readGitlabConfigs(config); expect(result).toHaveLength(1); result.forEach(r => expect(r).toStrictEqual({ id: 'test', group: 'group', + branch: undefined, fallbackBranch: 'master', host: 'host', catalogFile: 'catalog-info.yaml', @@ -158,7 +159,7 @@ describe('config', () => { }, }); - expect(() => readGitlabConfigs(config, logger)).toThrow( + expect(() => readGitlabConfigs(config)).toThrow( "Missing required config value at 'catalog.providers.gitlab.test.host'", ); }); @@ -177,7 +178,7 @@ describe('config', () => { }, }); - const result = readGitlabConfigs(config, logger); + const result = readGitlabConfigs(config); expect(result).toHaveLength(1); expect(result[0].group).toEqual(''); }); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.ts index e5cf5a6298..cd15c4825c 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/config.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/config.ts @@ -17,7 +17,6 @@ import { readTaskScheduleDefinitionFromConfig } from '@backstage/backend-tasks'; import { Config } from '@backstage/config'; import { GitlabProviderConfig } from '../lib'; -import { Logger } from 'winston'; /** * Extracts the gitlab config from a config object @@ -26,25 +25,12 @@ import { Logger } from 'winston'; * * @param id - The provider key * @param config - The config object to extract from - * @param logger - The logger */ -function readGitlabConfig( - id: string, - config: Config, - logger: Logger, -): GitlabProviderConfig { +function readGitlabConfig(id: string, config: Config): GitlabProviderConfig { const group = config.getOptionalString('group') ?? ''; const host = config.getString('host'); const branch = config.getOptionalString('branch'); - - if (branch) { - logger.warn( - 'The configuration key `branch` has been deprecated in favor of the configuration key `fallbackBranch`.', - ); - } - - const fallbackBranch = - config.getOptionalString('fallbackBranch') ?? branch ?? 'master'; + const fallbackBranch = config.getOptionalString('fallbackBranch') ?? 'master'; const catalogFile = config.getOptionalString('entityFilename') ?? 'catalog-info.yaml'; const projectPattern = new RegExp( @@ -65,6 +51,7 @@ function readGitlabConfig( return { id, group, + branch, fallbackBranch, host, catalogFile, @@ -82,12 +69,8 @@ function readGitlabConfig( * @public * * @param config - The config object to extract from - * @param logger - The logger */ -export function readGitlabConfigs( - config: Config, - logger: Logger, -): GitlabProviderConfig[] { +export function readGitlabConfigs(config: Config): GitlabProviderConfig[] { const configs: GitlabProviderConfig[] = []; const providerConfigs = config.getOptionalConfig('catalog.providers.gitlab'); @@ -97,13 +80,7 @@ export function readGitlabConfigs( } for (const id of providerConfigs.keys()) { - configs.push( - readGitlabConfig( - id, - providerConfigs.getConfig(id), - logger.child({ target: id }), - ), - ); + configs.push(readGitlabConfig(id, providerConfigs.getConfig(id))); } return configs; diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 11393c6db2..5bf522c41b 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + - @backstage/plugin-permission-common@0.7.4 + +## 0.3.0 + +### Minor Changes + +- a811bd246c4: Added endpoint to get a list of known incremental entity providers + +### Patch Changes + +- 90469c02c8c: Renamed `incrementalIngestionEntityProviderCatalogModule` to `catalogModuleIncrementalIngestionEntityProvider` 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. +- bf611cf019a: Fix missing `dependencies` in `package.json` +- 6e612b58577: Move `@backstage/backend-defaults` to `devDependencies` +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @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/plugin-events-node@0.2.4 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + ## 0.3.0-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 5b2a534fcb..66e939dbe3 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", "description": "An entity provider for streaming large asset sources into the catalog", - "version": "0.3.0-next.2", + "version": "0.3.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 5e176f09ba..a89c835ef2 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.11-next.0 + +### Patch Changes + +- c9a0fdcd2c8: Fix deprecated types. +- Updated dependencies + - @backstage/config@1.0.7 + - @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-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## 0.5.10 + +### Patch Changes + +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.5.10-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/api-report.md b/plugins/catalog-backend-module-ldap/api-report.md index 088e34fc34..997ad55560 100644 --- a/plugins/catalog-backend-module-ldap/api-report.md +++ b/plugins/catalog-backend-module-ldap/api-report.md @@ -11,7 +11,7 @@ import { EntityProvider } from '@backstage/plugin-catalog-node'; import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { GroupEntity } from '@backstage/catalog-model'; import { JsonValue } from '@backstage/types'; -import { LocationSpec } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import { SearchEntry } from 'ldapjs'; import { SearchOptions } from 'ldapjs'; diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 06b33f1db2..6986f7a84a 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", "description": "A Backstage catalog backend module that helps integrate towards LDAP", - "version": "0.5.10-next.2", + "version": "0.5.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,6 +36,7 @@ "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "@types/ldapjs": "^2.2.0", diff --git a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts index 9c5442ca0c..00578ac3a4 100644 --- a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts @@ -27,9 +27,9 @@ import { import { CatalogProcessor, CatalogProcessorEmit, - LocationSpec, processingResult, } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; /** * Extracts teams and users out of an LDAP server. diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index dc1a32f25a..9eed88aa13 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.5.3-next.0 + +### Patch Changes + +- c9a0fdcd2c8: Fix deprecated types. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## 0.5.2 + +### Patch Changes + +- a4ebd513527: Revert using `baseUrl` for MS Graph provider as it breaks token retrieval +- 26eef93c547: Fixed msgraph catalog backend to use user.select option when fetching user from AzureAD +- 90469c02c8c: Renamed `microsoftGraphOrgEntityProviderCatalogModule` to `catalogModuleMicrosoftGraphOrgEntityProvider` 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`. +- 2c234a89325: properly support custom graph api URL +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + ## 0.5.2-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/api-report.md b/plugins/catalog-backend-module-msgraph/api-report.md index bde8c06fbb..3e4d8d99bc 100644 --- a/plugins/catalog-backend-module-msgraph/api-report.md +++ b/plugins/catalog-backend-module-msgraph/api-report.md @@ -9,7 +9,7 @@ import { Config } from '@backstage/config'; import { EntityProvider } from '@backstage/plugin-catalog-node'; import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { GroupEntity } from '@backstage/catalog-model'; -import { LocationSpec } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import * as MicrosoftGraph from '@microsoft/microsoft-graph-types'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index f66151bbc4..15f272d48f 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", - "version": "0.5.2-next.2", + "version": "0.5.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -51,6 +51,7 @@ "@backstage/backend-tasks": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@microsoft/microsoft-graph-types": "^2.6.0", "@types/node-fetch": "^2.5.12", diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts index 2beef51c31..d9119a3c4d 100644 --- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts @@ -18,9 +18,9 @@ import { Config } from '@backstage/config'; import { CatalogProcessor, CatalogProcessorEmit, - LocationSpec, processingResult, } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import { GroupTransformer, diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 8bf478947a..680e86263f 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.10-next.0 + +### Patch Changes + +- c9a0fdcd2c8: Fix deprecated types. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## 0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.9-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/api-report.md b/plugins/catalog-backend-module-openapi/api-report.md index c2af9cbe01..455816645a 100644 --- a/plugins/catalog-backend-module-openapi/api-report.md +++ b/plugins/catalog-backend-module-openapi/api-report.md @@ -3,11 +3,11 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; +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-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import { PlaceholderResolverParams } from '@backstage/plugin-catalog-backend'; import { ScmIntegrations } from '@backstage/integration'; diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index fee080d1bf..fd4a8fef4d 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", - "version": "0.1.9-next.2", + "version": "0.1.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,6 +38,7 @@ "@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", diff --git a/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts index 9dcadad61d..6b00519b2f 100644 --- a/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts +++ b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts @@ -17,10 +17,8 @@ import { UrlReader } from '@backstage/backend-common'; import { Entity } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; -import { - CatalogProcessor, - LocationSpec, -} from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { bundleFileWithRefs } from './lib'; import { Logger } from 'winston'; diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index 5bc50ae148..50c805985e 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @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.0 + +### Minor Changes + +- a1efcf9a658: Initial version of the plugin. + +### Patch Changes + +- 561ce41191d: Added a `catalogModulePuppetDbEntityProvider` alpha export for the new backend system +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 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/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.0-next.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index 252fe21969..f3df2dfdc8 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", - "version": "0.1.0-next.0", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 1cc3b3620a..e450baf77b 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,81 @@ # @backstage/plugin-catalog-backend +## 1.8.1-next.0 + +### Patch Changes + +- c9a0fdcd2c8: Fix deprecated types. +- 899ebfd8e02: Add full text search support to the `by-query` endpoint. +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.0 + - @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/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + - @backstage/plugin-search-common@1.2.2 + +## 1.8.0 + +### Minor Changes + +- 7f4ea3d3602: Add /entities/by-query endpoint returning paginated entities. + + The endpoint supports cursor base pagination and server side sorting of the entities + +### Patch Changes + +- e675f902980: Add deprecations for symbols that were moved to `@backstage/plugin-catalog-node` a long time ago: + + - `CatalogProcessor` + - `CatalogProcessorCache` + - `CatalogProcessorEmit` + - `CatalogProcessorEntityResult` + - `CatalogProcessorErrorResult` + - `CatalogProcessorLocationResult` + - `CatalogProcessorParser` + - `CatalogProcessorRefreshKeysResult` + - `CatalogProcessorRelationResult` + - `CatalogProcessorResult` + - `DeferredEntity` + - `EntityProvider` + - `EntityProviderConnection` + - `EntityProviderMutation` + - `EntityRelationSpec` + - `processingResult` + + Also moved over and deprecated the following symbols: + + - `locationSpecToLocationEntity` + - `locationSpecToMetadataName` + +- ac8929f2f31: Fix export of `defaultCatalogCollatorEntityTransformer`. +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- f093ce83d58: Fix a bug where the batch fetch by ref endpoint did not work in conjunction with filtering (e.g. if authorization was enabled). +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-permission-node@0.7.6 + - @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/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.6 + - @backstage/plugin-search-common@1.2.2 + ## 1.8.0-next.2 ### Patch Changes diff --git a/plugins/catalog-backend/alpha-api-report.md b/plugins/catalog-backend/alpha-api-report.md index df2fa3d2e9..df3e809ade 100644 --- a/plugins/catalog-backend/alpha-api-report.md +++ b/plugins/catalog-backend/alpha-api-report.md @@ -20,8 +20,8 @@ export const catalogConditions: Conditions<{ EntitiesSearchFilter, 'catalog-entity', { - value?: string | undefined; annotation: string; + value?: string | undefined; } >; hasLabel: PermissionRule< @@ -37,8 +37,8 @@ export const catalogConditions: Conditions<{ EntitiesSearchFilter, 'catalog-entity', { - value?: string | undefined; key: string; + value?: string | undefined; } >; hasSpec: PermissionRule< @@ -46,8 +46,8 @@ export const catalogConditions: Conditions<{ EntitiesSearchFilter, 'catalog-entity', { - value?: string | undefined; key: string; + value?: string | undefined; } >; isEntityKind: PermissionRule< @@ -104,8 +104,8 @@ export const permissionRules: { EntitiesSearchFilter, 'catalog-entity', { - value?: string | undefined; annotation: string; + value?: string | undefined; } >; hasLabel: PermissionRule< @@ -121,8 +121,8 @@ export const permissionRules: { EntitiesSearchFilter, 'catalog-entity', { - value?: string | undefined; key: string; + value?: string | undefined; } >; hasSpec: PermissionRule< @@ -130,8 +130,8 @@ export const permissionRules: { EntitiesSearchFilter, 'catalog-entity', { - value?: string | undefined; key: string; + value?: string | undefined; } >; isEntityKind: PermissionRule< diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index 5e7b2dee02..d491f391d5 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -11,6 +11,7 @@ import { AnalyzeLocationGenerateEntity as AnalyzeLocationGenerateEntity_2 } from import { AnalyzeLocationRequest as AnalyzeLocationRequest_2 } from '@backstage/plugin-catalog-common'; import { AnalyzeLocationResponse as AnalyzeLocationResponse_2 } from '@backstage/plugin-catalog-common'; import { CatalogApi } from '@backstage/catalog-client'; +import type { CatalogCollatorEntityTransformer as CatalogCollatorEntityTransformer_2 } from '@backstage/plugin-search-backend-module-catalog'; import { CatalogEntityDocument } from '@backstage/plugin-catalog-common'; import { CatalogProcessor as CatalogProcessor_2 } from '@backstage/plugin-catalog-node'; import { CatalogProcessorCache as CatalogProcessorCache_2 } from '@backstage/plugin-catalog-node'; @@ -23,8 +24,9 @@ import { CatalogProcessorRefreshKeysResult as CatalogProcessorRefreshKeysResult_ import { CatalogProcessorRelationResult as CatalogProcessorRelationResult_2 } from '@backstage/plugin-catalog-node'; import { CatalogProcessorResult as CatalogProcessorResult_2 } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; +import { DefaultCatalogCollatorFactory as DefaultCatalogCollatorFactory_2 } from '@backstage/plugin-search-backend-module-catalog'; +import type { DefaultCatalogCollatorFactoryOptions as DefaultCatalogCollatorFactoryOptions_2 } from '@backstage/plugin-search-backend-module-catalog'; import { DeferredEntity as DeferredEntity_2 } from '@backstage/plugin-catalog-node'; -import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; import { Entity } from '@backstage/catalog-model'; import { EntityPolicy } from '@backstage/catalog-model'; import { EntityProvider as EntityProvider_2 } from '@backstage/plugin-catalog-node'; @@ -44,7 +46,6 @@ import { PermissionRule } from '@backstage/plugin-permission-node'; import { PermissionRuleParams } from '@backstage/plugin-permission-common'; import { PluginDatabaseManager } from '@backstage/backend-common'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; -import { Readable } from 'stream'; import { Router } from 'express'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { TokenManager } from '@backstage/backend-common'; @@ -160,10 +161,9 @@ export class CatalogBuilder { useLegacySingleProcessorValidation(): this; } -// @public (undocumented) -export type CatalogCollatorEntityTransformer = ( - entity: Entity, -) => Omit; +// @public @deprecated (undocumented) +export type CatalogCollatorEntityTransformer = + CatalogCollatorEntityTransformer_2; // @public (undocumented) export type CatalogEnvironment = { @@ -286,34 +286,15 @@ export class DefaultCatalogCollator { readonly visibilityPermission: Permission; } -// @public (undocumented) -export const defaultCatalogCollatorEntityTransformer: CatalogCollatorEntityTransformer; +// @public @deprecated (undocumented) +export const defaultCatalogCollatorEntityTransformer: CatalogCollatorEntityTransformer_2; -// @public (undocumented) -export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { - // (undocumented) - static fromConfig( - _config: Config, - options: DefaultCatalogCollatorFactoryOptions, - ): DefaultCatalogCollatorFactory; - // (undocumented) - getCollator(): Promise; - // (undocumented) - readonly type = 'software-catalog'; - // (undocumented) - readonly visibilityPermission: Permission; -} +// @public @deprecated (undocumented) +export const DefaultCatalogCollatorFactory: typeof DefaultCatalogCollatorFactory_2; -// @public (undocumented) -export type DefaultCatalogCollatorFactoryOptions = { - discovery: PluginEndpointDiscovery; - tokenManager: TokenManager; - locationTemplate?: string; - filter?: GetEntitiesRequest['filter']; - batchSize?: number; - catalogClient?: CatalogApi; - entityTransformer?: CatalogCollatorEntityTransformer; -}; +// @public @deprecated (undocumented) +export type DefaultCatalogCollatorFactoryOptions = + DefaultCatalogCollatorFactoryOptions_2; // @public @deprecated (undocumented) export type DeferredEntity = DeferredEntity_2; diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 35eac97cc1..6bd5313e7d 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend", "description": "The Backstage backend plugin that provides the Backstage catalog", - "version": "1.8.0-next.2", + "version": "1.8.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -57,6 +57,7 @@ "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", "@backstage/plugin-scaffolder-common": "workspace:^", + "@backstage/plugin-search-backend-module-catalog": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "@backstage/types": "workspace:^", "@opentelemetry/api": "^1.3.0", @@ -80,7 +81,7 @@ "winston": "^3.2.1", "yaml": "^2.0.0", "yn": "^4.0.0", - "zod": "~3.18.0" + "zod": "^3.21.4" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/catalog-backend/src/index.ts b/plugins/catalog-backend/src/index.ts index b3d2bc95c7..eca155ce46 100644 --- a/plugins/catalog-backend/src/index.ts +++ b/plugins/catalog-backend/src/index.ts @@ -27,3 +27,40 @@ export * from './processing'; export * from './search'; export * from './service'; export * from './deprecated'; + +import { + DefaultCatalogCollatorFactory as _DefaultCatalogCollatorFactory, + defaultCatalogCollatorEntityTransformer as _defaultCatalogCollatorEntityTransformer, +} from '@backstage/plugin-search-backend-module-catalog'; + +/** + * @public + * @deprecated import from `@backstage/search-backend-module-catalog` instead + */ +export const DefaultCatalogCollatorFactory = _DefaultCatalogCollatorFactory; + +/** + * @public + * @deprecated import from `@backstage/search-backend-module-catalog` instead + */ +export const defaultCatalogCollatorEntityTransformer = + _defaultCatalogCollatorEntityTransformer; + +import type { + DefaultCatalogCollatorFactoryOptions as _DefaultCatalogCollatorFactoryOptions, + CatalogCollatorEntityTransformer as _CatalogCollatorEntityTransformer, +} from '@backstage/plugin-search-backend-module-catalog'; + +/** + * @public + * @deprecated import from `@backstage/search-backend-module-catalog` instead + */ +export type DefaultCatalogCollatorFactoryOptions = + _DefaultCatalogCollatorFactoryOptions; + +/** + * @public + * @deprecated import from `@backstage/search-backend-module-catalog` instead + */ +export type CatalogCollatorEntityTransformer = + _CatalogCollatorEntityTransformer; diff --git a/plugins/catalog-backend/src/migrations.test.ts b/plugins/catalog-backend/src/migrations.test.ts index f1ed40dbbe..33f88e9aa7 100644 --- a/plugins/catalog-backend/src/migrations.test.ts +++ b/plugins/catalog-backend/src/migrations.test.ts @@ -44,6 +44,67 @@ describe('migrations', () => { ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], }); + it.each(databases.eachSupportedId())( + 'latest version correctly cascades deletions, %p', + async databaseId => { + const knex = await databases.init(databaseId); + await knex.migrate.latest({ directory: migrationsDir }); + + await knex + .insert({ + entity_id: 'i1', + entity_ref: 'k:ns/n1', + unprocessed_entity: '{}', + errors: '[]', + next_update_at: new Date(), + last_discovery_at: new Date(), + }) + .into('refresh_state'); + await knex + .insert({ + entity_id: 'i2', + entity_ref: 'k:ns/n2', + unprocessed_entity: '{}', + errors: '[]', + next_update_at: new Date(), + last_discovery_at: new Date(), + }) + .into('refresh_state'); + await knex + .insert({ entity_id: 'i1', key: 'k1', value: 'v1' }) + .into('search'); + await knex + .insert({ + source_entity_ref: 'k:ns/n1', + target_entity_ref: 'k:ns/n2', + }) + .into('refresh_state_references'); + await knex + .insert({ + originating_entity_id: 'i1', + source_entity_ref: 'k:ns/n1', + target_entity_ref: 'k:ns/n2', + type: 't', + }) + .into('relations'); + await knex + .insert({ + entity_id: 'i1', + hash: 'h', + stitch_ticket: '', + final_entity: '{}', + }) + .into('final_entities'); + + await knex.delete().from('refresh_state').where({ entity_id: 'i1' }); + + await expect(knex('search')).resolves.toEqual([]); + await expect(knex('refresh_state_references')).resolves.toEqual([]); + await expect(knex('relations')).resolves.toEqual([]); + await expect(knex('final_entities')).resolves.toEqual([]); + }, + ); + it.each(databases.eachSupportedId())( '20221109192547_search_add_original_value_column.js, %p', async databaseId => { diff --git a/plugins/catalog-backend/src/modules/core/LocationEntityProcessor.test.ts b/plugins/catalog-backend/src/modules/core/LocationEntityProcessor.test.ts index 68c073eb0a..5e000f87d6 100644 --- a/plugins/catalog-backend/src/modules/core/LocationEntityProcessor.test.ts +++ b/plugins/catalog-backend/src/modules/core/LocationEntityProcessor.test.ts @@ -21,7 +21,7 @@ import { } from '@backstage/integration'; import path from 'path'; import { toAbsoluteUrl } from './LocationEntityProcessor'; -import { LocationSpec } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; describe('LocationEntityProcessor', () => { describe('toAbsoluteUrl', () => { diff --git a/plugins/catalog-backend/src/search/index.ts b/plugins/catalog-backend/src/search/index.ts index 3603ab2e60..50966e4c5b 100644 --- a/plugins/catalog-backend/src/search/index.ts +++ b/plugins/catalog-backend/src/search/index.ts @@ -14,11 +14,6 @@ * limitations under the License. */ -export { DefaultCatalogCollatorFactory } from './DefaultCatalogCollatorFactory'; -export type { DefaultCatalogCollatorFactoryOptions } from './DefaultCatalogCollatorFactory'; -export type { CatalogCollatorEntityTransformer } from './CatalogCollatorEntityTransformer'; -export { defaultCatalogCollatorEntityTransformer } from './defaultCatalogCollatorEntityTransformer'; - /** * todo(backstage/techdocs-core): stop exporting this in a future release. */ diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 7da5d69767..782ad1bf3c 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -599,16 +599,28 @@ export class CatalogBuilder { ...this.placeholderResolvers, }; - // These are always there no matter what + // The placeholder is always there no matter what const processors: CatalogProcessor[] = [ new PlaceholderProcessor({ resolvers: placeholderResolvers, reader, integrations, }), - new BuiltinKindsEntityProcessor(), ]; + const builtinKindsEntityProcessor = new BuiltinKindsEntityProcessor(); + // If the user adds a processor named 'BuiltinKindsEntityProcessor', + // skip inclusion of the catalog-backend version. + if ( + !this.processors.some( + processor => + processor.getProcessorName() === + builtinKindsEntityProcessor.getProcessorName(), + ) + ) { + processors.push(builtinKindsEntityProcessor); + } + // These are only added unless the user replaced them all if (!this.processorsReplace) { processors.push(...this.getDefaultProcessors()); diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 275bd1c42c..25cdc8d826 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -1119,6 +1119,193 @@ describe('DefaultEntitiesCatalog', () => { }, ); + it.each(databases.eachSupportedId())( + 'should filter the text results when sortOrder is not provided, %p', + async databaseId => { + await createDatabase(databaseId); + + const names = ['lion', 'cat', 'atcatss', 'dog', 'dogcat', 'aa', 's']; + const entities: Entity[] = names.map((name, index) => + // Need a stable search since default filtering is by uid, and those get generated on the fly + // during the test case. + entityFrom(`${index}`, { uid: `id${index}`, title: name }), + ); + + const notFoundEntities: Entity[] = [ + { + apiVersion: 'a', + kind: 'k', + metadata: { name: 'something' }, + spec: {}, + }, + { + apiVersion: 'a', + kind: 'k', + metadata: { name: 'something else' }, + spec: {}, + }, + ]; + + await Promise.all( + entities.concat(notFoundEntities).map(e => addEntityToSearch(e)), + ); + + const catalog = new DefaultEntitiesCatalog({ + database: knex, + logger: getVoidLogger(), + stitcher, + }); + + const filter = { + key: 'spec.should_include_this', + }; + + const request: QueryEntitiesInitialRequest = { + filter, + limit: 100, + fullTextFilter: { term: 'cAt ', fields: ['metadata.title'] }, + }; + const response = await catalog.queryEntities(request); + expect(response.items).toEqual([ + entityFrom('1', { uid: 'id1', title: 'cat' }), + entityFrom('2', { uid: 'id2', title: 'atcatss' }), + entityFrom('4', { uid: 'id4', title: 'dogcat' }), + ]); + expect(response.pageInfo.nextCursor).toBeUndefined(); + expect(response.pageInfo.prevCursor).toBeUndefined(); + expect(response.totalItems).toBe(3); + + const paginatedResponse = await catalog.queryEntities({ + ...request, + limit: 2, + }); + expect(paginatedResponse.items).toEqual([ + entityFrom('1', { uid: 'id1', title: 'cat' }), + entityFrom('2', { uid: 'id2', title: 'atcatss' }), + ]); + expect(paginatedResponse.pageInfo.nextCursor).not.toBeUndefined(); + expect(paginatedResponse.pageInfo.prevCursor).toBeUndefined(); + expect(paginatedResponse.totalItems).toBe(3); + + const paginatedResponseNext = await catalog.queryEntities({ + cursor: paginatedResponse.pageInfo.nextCursor!, + }); + expect(paginatedResponseNext.items).toEqual([ + entityFrom('4', { uid: 'id4', title: 'dogcat' }), + ]); + expect(paginatedResponseNext.pageInfo.nextCursor).toBeUndefined(); + expect(paginatedResponseNext.pageInfo.prevCursor).not.toBeUndefined(); + expect(paginatedResponseNext.totalItems).toBe(3); + + const paginatedResponsePrev = await catalog.queryEntities({ + cursor: paginatedResponseNext.pageInfo.prevCursor!, + }); + expect(paginatedResponsePrev).toMatchObject(paginatedResponse); + }, + ); + + it.each(databases.eachSupportedId())( + 'should filter the text results by multiple search fields if provided, %p', + async databaseId => { + await createDatabase(databaseId); + + const defs = [ + { + title: 'lion', + name: 'KingOfTheJungle', + }, + { title: 'cat', name: 'NotKingOfTheJungle' }, + { title: 'atcatss', name: 'NotACatKing' }, + { title: 'king', name: '123' }, + { title: 'dogcat', name: 'dogcat' }, + { title: 'aa', name: 'test123' }, + { title: 's', name: 'idk' }, + ]; + const entities: Entity[] = defs.map(({ title, name }, index) => + // Need a stable search since default filtering is by uid, and those get generated on the fly + // during the test case. + entityFrom(name, { uid: `id${index}`, title }), + ); + + const notFoundEntities: Entity[] = [ + { + apiVersion: 'a', + kind: 'k', + metadata: { name: 'something' }, + spec: {}, + }, + { + apiVersion: 'a', + kind: 'k', + metadata: { name: 'something else' }, + spec: {}, + }, + ]; + + await Promise.all( + entities.concat(notFoundEntities).map(e => addEntityToSearch(e)), + ); + + const catalog = new DefaultEntitiesCatalog({ + database: knex, + logger: getVoidLogger(), + stitcher, + }); + + const filter = { + key: 'spec.should_include_this', + }; + + const request: QueryEntitiesInitialRequest = { + filter, + limit: 100, + fullTextFilter: { + term: 'KiNg ', + fields: ['metadata.title', 'metadata.name'], + }, + }; + const response = await catalog.queryEntities(request); + + expect(response.items).toEqual([ + entityFrom('KingOfTheJungle', { uid: 'id0', title: 'lion' }), + entityFrom('NotKingOfTheJungle', { uid: 'id1', title: 'cat' }), + entityFrom('NotACatKing', { uid: 'id2', title: 'atcatss' }), + entityFrom('123', { uid: 'id3', title: 'king' }), + ]); + expect(response.pageInfo.nextCursor).toBeUndefined(); + expect(response.pageInfo.prevCursor).toBeUndefined(); + expect(response.totalItems).toBe(4); + + const paginatedResponse = await catalog.queryEntities({ + ...request, + limit: 2, + }); + expect(paginatedResponse.items).toEqual([ + entityFrom('KingOfTheJungle', { uid: 'id0', title: 'lion' }), + entityFrom('NotKingOfTheJungle', { uid: 'id1', title: 'cat' }), + ]); + expect(paginatedResponse.pageInfo.nextCursor).not.toBeUndefined(); + expect(paginatedResponse.pageInfo.prevCursor).toBeUndefined(); + expect(paginatedResponse.totalItems).toBe(4); + + const paginatedResponseNext = await catalog.queryEntities({ + cursor: paginatedResponse.pageInfo.nextCursor!, + }); + expect(paginatedResponseNext.items).toEqual([ + entityFrom('NotACatKing', { uid: 'id2', title: 'atcatss' }), + entityFrom('123', { uid: 'id3', title: 'king' }), + ]); + expect(paginatedResponseNext.pageInfo.nextCursor).toBeUndefined(); + expect(paginatedResponseNext.pageInfo.prevCursor).not.toBeUndefined(); + expect(paginatedResponseNext.totalItems).toBe(4); + + const paginatedResponsePrev = await catalog.queryEntities({ + cursor: paginatedResponseNext.pageInfo.prevCursor!, + }); + expect(paginatedResponsePrev).toMatchObject(paginatedResponse); + }, + ); + it.each(databases.eachSupportedId())( 'should include totalItems and empty entities in the response in case limit is zero, %p', async databaseId => { @@ -1577,7 +1764,11 @@ describe('DefaultEntitiesCatalog', () => { function entityFrom( name: string, - { uid, namespace }: { uid?: string; namespace?: string } = {}, + { + uid, + namespace, + title, + }: { uid?: string; namespace?: string; title?: string } = {}, ) { return { apiVersion: 'a', @@ -1586,6 +1777,7 @@ function entityFrom( name, ...(!!namespace && { namespace }), ...(!!uid && { uid }), + ...(!!title && { title }), }, spec: { should_include_this: 'yes' }, }; diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index 4e6109423e..ba165f96af 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -382,11 +382,30 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { } const normalizedFullTextFilterTerm = cursor.fullTextFilter?.term?.trim(); + const textFilterFields = cursor.fullTextFilter?.fields ?? [sortField.field]; if (normalizedFullTextFilterTerm) { - dbQuery.andWhereRaw( - 'value like ?', - `%${normalizedFullTextFilterTerm.toLocaleLowerCase('en-US')}%`, - ); + 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') + .whereIn('key', textFilterFields) + .andWhere(function keyFilter() { + this.andWhereRaw( + 'value like ?', + `%${normalizedFullTextFilterTerm.toLocaleLowerCase('en-US')}%`, + ); + }); + dbQuery.andWhere('search.entity_id', 'in', matchQuery); + } } const countQuery = dbQuery.clone(); diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index 813d888be2..37862d47bd 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-common +## 1.0.12 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-search-common@1.2.2 + ## 1.0.12-next.1 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index e2423f834b..aa7f26f4df 100644 --- a/plugins/catalog-common/package.json +++ b/plugins/catalog-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-common", "description": "Common functionalities for the catalog plugin", - "version": "1.0.12-next.1", + "version": "1.0.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-customized/CHANGELOG.md b/plugins/catalog-customized/CHANGELOG.md index 654672a156..b71628d43c 100644 --- a/plugins/catalog-customized/CHANGELOG.md +++ b/plugins/catalog-customized/CHANGELOG.md @@ -1,5 +1,21 @@ # @internal/plugin-catalog-customized +## 0.0.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.10.0-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + +## 0.0.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/plugin-catalog-react@1.4.0 + ## 0.0.8-next.2 ### Patch Changes diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json index 20ef38355b..0cca05de5a 100644 --- a/plugins/catalog-customized/package.json +++ b/plugins/catalog-customized/package.json @@ -1,7 +1,7 @@ { "name": "@internal/plugin-catalog-customized", "description": "The internal Backstage Customizable plugin for browsing the Backstage catalog", - "version": "0.0.8-next.2", + "version": "0.0.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index bd0a9d7c76..5975f7d319 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-catalog-graph +## 0.2.29-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.2.28 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.2.28-next.2 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index ab7e7e78a9..f5cc5f7619 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.2.28-next.2", + "version": "0.2.29-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -30,7 +30,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "classnames": "^2.3.1", "lodash": "^4.17.15", "p-limit": "^3.1.0", diff --git a/plugins/catalog-graphql/CHANGELOG.md b/plugins/catalog-graphql/CHANGELOG.md index 64721ef98e..041191fcef 100644 --- a/plugins/catalog-graphql/CHANGELOG.md +++ b/plugins/catalog-graphql/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-catalog-graphql +## 0.3.20-next.0 + +### Patch Changes + +- e47e69eadf0: Updated dependency `@apollo/server` to `^4.0.0`. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## 0.3.19 + +### Patch Changes + +- b990021ddeb: Updated dependency `@graphql-codegen/cli` to `^3.0.0`. + Updated dependency `@graphql-codegen/graphql-modules-preset` to `^3.0.0`. + Updated dependency `@graphql-codegen/typescript` to `^3.0.0`. + Updated dependency `@graphql-codegen/typescript-resolvers` to `^3.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.3.19-next.1 ### Patch Changes diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index 0c6fc28c09..11b899f528 100644 --- a/plugins/catalog-graphql/package.json +++ b/plugins/catalog-graphql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-graphql", "description": "An experimental Backstage catalog GraphQL module", - "version": "0.3.19-next.1", + "version": "0.3.20-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,10 +34,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { + "@apollo/client": "^3.0.0", + "@apollo/server": "^4.0.0", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/types": "workspace:^", - "apollo-server": "^3.0.0", "graphql": "^16.0.0", "graphql-modules": "^2.0.0", "graphql-tag": "^2.11.0", diff --git a/plugins/catalog-graphql/src/graphql/module.test.ts b/plugins/catalog-graphql/src/graphql/module.test.ts index 5490c2030a..d4589a2625 100644 --- a/plugins/catalog-graphql/src/graphql/module.test.ts +++ b/plugins/catalog-graphql/src/graphql/module.test.ts @@ -22,7 +22,7 @@ import { ConfigReader } from '@backstage/config'; import { ReaderEntity } from '../service/client'; import { createLogger } from 'winston'; import { setupRequestMockHandlers } from '@backstage/test-utils'; -import { gql } from 'apollo-server'; +import { gql } from '@apollo/client'; import { Module, createApplication, testkit } from 'graphql-modules'; describe('Catalog Module', () => { diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 0451769b82..2298180278 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-catalog-import +## 0.9.7-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-common@1.0.12 + +## 0.9.6 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + ## 0.9.6-next.2 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index baddab4656..d27a6118bd 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-import", "description": "A Backstage plugin the helps you import entities into your catalog", - "version": "0.9.6-next.2", + "version": "0.9.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,7 +44,7 @@ "@backstage/plugin-catalog-react": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", "git-url-parse": "^13.0.0", "js-base64": "^3.6.0", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 8ed02981ca..e38a38d596 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-catalog-node +## 1.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + +## 1.3.4 + +### Patch Changes + +- e675f902980: Added `locationSpecToMetadataName` and `locationSpecToLocationEntity` as their new home, moved over from the backend package where they now are marked as deprecated. +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/types@1.0.2 + ## 1.3.4-next.2 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index d5ad3b86ea..31b7032462 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-node", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", - "version": "1.3.4-next.2", + "version": "1.3.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index 4d8acf0936..f7a96b5f07 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-catalog-react +## 1.4.1-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + +## 1.4.0 + +### Minor Changes + +- 0a5b73b2926: Add possibility to re-use EntityPicker for filters with multiple select. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 24916d23494: Do not close `Autocomplete` powered multiple-selection filters when checking boxes +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-permission-react@0.4.11 + ## 1.4.0-next.2 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 8f0b9627c7..166da09118 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-react", "description": "A frontend library that helps other Backstage plugins interact with the catalog", - "version": "1.4.0-next.2", + "version": "1.4.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -59,7 +59,7 @@ "@backstage/version-bridge": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "classnames": "^2.2.6", "jwt-decode": "^3.1.0", "lodash": "^4.17.21", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 873c90de07..d7cd7cbe3a 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,78 @@ # @backstage/plugin-catalog +## 1.10.0-next.0 + +### Minor Changes + +- 4dbf3d3e4da: Added a new EntitySwitch isResourceType to allow different views depending on Resource type +- fc6cab4eb48: Added `isEntityWith` condition helper for `EntitySwitch` case statements. + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-search-common@1.2.2 + +## 1.9.0 + +### Minor Changes + +- 23cc40039c0: Allow `EntitySwitch` to render all cases that match the condition. + + This change introduces a new parameter for the `EntitySwitch` component + `renderMultipleMatches`. In case the parameter value is `all`, the `EntitySwitch` + will render all `EntitySwitch.Case` that contain `if` parameter, and it + evaluates to true. In case none of the cases match, the default case will be + rendered, if any. + + This means for example in the CI/CD page you can now do the following: + + ```tsx + + Jenkins + CodeBuild + No CI/CD + + ``` + + This allows the component to have multiple CI/CD systems and all of those are + rendered on the same page. + +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item +- c9a9f3c834f: Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. + +### Patch Changes + +- 3fa41696820: Make the "Copied!" message disappear automatically after some time +- 7e8930ae1c6: Fix icon alignment in `CatalogSearchResultListItem` +- dbbde6ed353: fix entity switch rendering when there is no default case +- cb8ec97cdeb: Change black & white colors to be theme aware +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.2 + ## 1.9.0-next.2 ### Minor Changes diff --git a/plugins/catalog/api-report.md b/plugins/catalog/api-report.md index d891ebb7c8..ca91296913 100644 --- a/plugins/catalog/api-report.md +++ b/plugins/catalog/api-report.md @@ -355,6 +355,14 @@ export const EntityListContainer: (props: { // @public export function EntityOrphanWarning(): JSX.Element; +// @public (undocumented) +export interface EntityPredicates { + // (undocumented) + kind?: string | string[]; + // (undocumented) + type?: string | string[]; +} + // @public export function EntityProcessingErrorsPanel(): JSX.Element | null; @@ -433,6 +441,11 @@ export function isComponentType( types: string | string[], ): (entity: Entity) => boolean; +// @public +export function isEntityWith( + predicate: EntityPredicates, +): (entity: Entity) => boolean; + // @public export function isKind(kinds: string | string[]): (entity: Entity) => boolean; @@ -444,6 +457,11 @@ export function isNamespace( // @public export function isOrphan(entity: Entity): boolean; +// @public +export function isResourceType( + types: string | string[], +): (entity: Entity) => boolean; + // @public (undocumented) export type PluginCatalogComponentsNameToClassKey = { PluginCatalogEntityLinksEmptyState: EntityLinksEmptyStateClassKey; diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index c66ae8fb5e..49242b8724 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog", "description": "The Backstage plugin for browsing the Backstage catalog", - "version": "1.9.0-next.2", + "version": "1.10.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -46,7 +46,7 @@ "@backstage/types": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "history": "^5.0.0", "lodash": "^4.17.21", "pluralize": "^8.0.0", diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx index 675f74fa8d..1961fe6cac 100644 --- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx +++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx @@ -90,9 +90,13 @@ export function EntityContextMenu(props: EntityContextMenuProps) { const alertApi = useApi(alertApiRef); const copyToClipboard = useCallback(() => { - window.navigator.clipboard - .writeText(window.location.toString()) - .then(() => alertApi.post({ message: 'Copied!', severity: 'info' })); + window.navigator.clipboard.writeText(window.location.toString()).then(() => + alertApi.post({ + message: 'Copied!', + severity: 'info', + display: 'transient', + }), + ); }, [alertApi]); const extraItems = UNSTABLE_extraContextMenuItems && [ diff --git a/plugins/catalog/src/components/EntitySwitch/conditions.test.ts b/plugins/catalog/src/components/EntitySwitch/conditions.test.ts index dfed546fd8..66408aec18 100644 --- a/plugins/catalog/src/components/EntitySwitch/conditions.test.ts +++ b/plugins/catalog/src/components/EntitySwitch/conditions.test.ts @@ -15,7 +15,34 @@ */ import { Entity } from '@backstage/catalog-model'; -import { isComponentType, isKind, isNamespace } from './conditions'; +import { + isComponentType, + isKind, + isNamespace, + isResourceType, + isEntityWith, +} from './conditions'; + +const kubernetesClusterResource: Entity = { + apiVersion: '', + kind: 'Resource', + metadata: { name: 'aKubernetesCluster' }, + spec: { type: 'kubernetes-cluster' }, +}; + +const databaseResource: Entity = { + apiVersion: '', + kind: 'Resource', + metadata: { name: 'aDatabase' }, + spec: { type: 'database' }, +}; + +const notResource: Entity = { + apiVersion: '', + kind: 'not-Resource', + metadata: { name: 'aService' }, + spec: { type: 'service' }, +}; const serviceComponent: Entity = { apiVersion: '', @@ -38,6 +65,13 @@ const notComponent: Entity = { spec: { type: 'service' }, }; +const missingSpecType: Entity = { + apiVersion: '', + kind: 'another-type', + metadata: { name: 'anEntity' }, + spec: {}, +}; + const apiKind: Entity = { apiVersion: '', kind: 'api', @@ -59,6 +93,26 @@ const bNamespace: Entity = { spec: { type: 'service' }, }; +describe('isResourceType', () => { + it('should false on non resource kinds', () => { + const checkEntity = isResourceType('kubernetes-cluster'); + + expect(checkEntity(notResource)).not.toBeTruthy(); + }); + it('should check for the intended type', () => { + const checkEntity = isResourceType('kubernetes-cluster'); + + expect(checkEntity(databaseResource)).not.toBeTruthy(); + expect(checkEntity(kubernetesClusterResource)).toBeTruthy(); + }); + it('should check for multiple types', () => { + const checkEntity = isResourceType(['database', 'kubernetes-cluster']); + + expect(checkEntity(databaseResource)).toBeTruthy(); + expect(checkEntity(kubernetesClusterResource)).toBeTruthy(); + }); +}); + describe('isComponentType', () => { it('should false on non component kinds', () => { const checkEntity = isComponentType('service'); @@ -79,6 +133,25 @@ describe('isComponentType', () => { }); }); +describe('isEntityWith', () => { + it('allows for a kind-only check (empty type array)', () => { + const checkEntity = isEntityWith({ kind: 'api', type: [] }); + expect(checkEntity(apiKind)).toBeTruthy(); + }); + it('handles missing spec.type field', () => { + const checkEntity = isEntityWith({ kind: 'another-type', type: 'service' }); + expect(checkEntity(missingSpecType)).not.toBeTruthy(); + }); + it('allows a check against no criteria', () => { + const checkEntity = isEntityWith({}); + expect(checkEntity(apiKind)).toBeTruthy(); + }); + it('allows a check against empty criteria', () => { + const checkEntity = isEntityWith({ kind: [], type: [] }); + expect(checkEntity(apiKind)).toBeTruthy(); + }); +}); + describe('isKind', () => { it('should check for the intended kind', () => { const checkEntity = isKind('component'); diff --git a/plugins/catalog/src/components/EntitySwitch/conditions.ts b/plugins/catalog/src/components/EntitySwitch/conditions.ts index 86fd38a900..f834804141 100644 --- a/plugins/catalog/src/components/EntitySwitch/conditions.ts +++ b/plugins/catalog/src/components/EntitySwitch/conditions.ts @@ -14,18 +14,26 @@ * limitations under the License. */ -import { ComponentEntity, Entity } from '@backstage/catalog-model'; +import { Entity } from '@backstage/catalog-model'; -function strCmp(a: string | undefined, b: string | undefined): boolean { +/** @public */ +export interface EntityPredicates { + kind?: string | string[]; + type?: string | string[]; +} + +function strCmp(a: unknown, b: string | undefined): boolean { return Boolean( - a && a?.toLocaleLowerCase('en-US') === b?.toLocaleLowerCase('en-US'), + a && + typeof a === 'string' && + a?.toLocaleLowerCase('en-US') === b?.toLocaleLowerCase('en-US'), ); } -function strCmpAll(value: string | undefined, cmpValues: string | string[]) { +function strCmpAll(value: unknown, cmpValues: string | string[]) { return typeof cmpValues === 'string' ? strCmp(value, cmpValues) - : cmpValues.some(cmpVal => strCmp(value, cmpVal)); + : cmpValues.length === 0 || cmpValues.some(cmpVal => strCmp(value, cmpVal)); } /** @@ -33,7 +41,7 @@ function strCmpAll(value: string | undefined, cmpValues: string | string[]) { * @public */ export function isKind(kinds: string | string[]) { - return (entity: Entity) => strCmpAll(entity.kind, kinds); + return isEntityWith({ kind: kinds }); } /** @@ -41,12 +49,33 @@ export function isKind(kinds: string | string[]) { * @public */ export function isComponentType(types: string | string[]) { + return isEntityWith({ kind: 'component', type: types }); +} + +/** + * For use in EntitySwitch.Case. Matches if the entity is a Resource of a given spec.type. + * @public + */ +export function isResourceType(types: string | string[]) { + return isEntityWith({ kind: 'resource', type: types }); +} + +/** + * For use in EntitySwitch.Case. Matches if the entity is the specified kind and type (if present). + * @public + */ +export function isEntityWith(predicate: EntityPredicates) { return (entity: Entity) => { - if (!strCmp(entity.kind, 'component')) { + if (predicate.kind && !strCmpAll(entity.kind, predicate.kind)) { return false; } - const componentEntity = entity as ComponentEntity; - return strCmpAll(componentEntity.spec.type, types); + + if (predicate.type && !strCmpAll(entity.spec?.type, predicate.type)) { + return false; + } + + // there's no type check, return true + return true; }; } diff --git a/plugins/catalog/src/components/EntitySwitch/index.ts b/plugins/catalog/src/components/EntitySwitch/index.ts index 6cccf4be6e..8848f98866 100644 --- a/plugins/catalog/src/components/EntitySwitch/index.ts +++ b/plugins/catalog/src/components/EntitySwitch/index.ts @@ -16,4 +16,11 @@ export { EntitySwitch } from './EntitySwitch'; export type { EntitySwitchProps, EntitySwitchCaseProps } from './EntitySwitch'; -export { isKind, isNamespace, isComponentType } from './conditions'; +export type { EntityPredicates } from './conditions'; +export { + isKind, + isNamespace, + isComponentType, + isResourceType, + isEntityWith, +} from './conditions'; diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index 55ec192258..f68f624292 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cicd-statistics@0.1.19-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + +## 0.1.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-cicd-statistics@0.1.18 + ## 0.1.12-next.2 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index 38de7c6799..3cef2e0ff7 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.12-next.2", + "version": "0.1.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index 97434f99c7..86c2579da9 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-cicd-statistics +## 0.1.19-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + +## 0.1.18 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + ## 0.1.18-next.2 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 8262235489..1a531cbf88 100644 --- a/plugins/cicd-statistics/package.json +++ b/plugins/cicd-statistics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics", "description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)", - "version": "0.1.18-next.2", + "version": "0.1.19-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,7 +43,7 @@ "@date-io/luxon": "^1.3.13", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/pickers": "^3.3.10", "already": "^3.2.0", "humanize-duration": "^3.27.0", diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index c43162fe14..7dc02638c4 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-circleci +## 0.3.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.3.16 + +### Patch Changes + +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.3.16-next.2 ### Patch Changes diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 55d02ce8bd..5f74d66245 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-circleci", "description": "A Backstage plugin that integrates towards Circle CI", - "version": "0.3.16-next.2", + "version": "0.3.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,7 +40,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "circleci-api": "^4.0.0", "humanize-duration": "^3.27.0", "lodash": "^4.17.21", diff --git a/plugins/circleci/src/index.ts b/plugins/circleci/src/index.ts index e20f5c7d6b..442f774b68 100644 --- a/plugins/circleci/src/index.ts +++ b/plugins/circleci/src/index.ts @@ -15,7 +15,7 @@ */ /** - * A Backstage plugin that integrates towards Circle CI + * A Backstage plugin that integrates towards CircleCI. * * @packageDocumentation */ diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md index bc5f71d8e1..e1131349cf 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-cloudbuild +## 0.3.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.3.16-next.2 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index 04fa511cb6..87b76043d2 100644 --- a/plugins/cloudbuild/package.json +++ b/plugins/cloudbuild/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cloudbuild", "description": "A Backstage plugin that integrates towards Google Cloud Build", - "version": "0.3.16-next.2", + "version": "0.3.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,7 +40,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "luxon": "^3.0.0", "qs": "^6.9.4", "react-use": "^17.2.4" diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index e98be293b8..f84df1f4fd 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-code-climate +## 0.1.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.1.16 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.16-next.2 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 9890f8b95e..1b75d7c59d 100644 --- a/plugins/code-climate/package.json +++ b/plugins/code-climate/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-code-climate", - "version": "0.1.16-next.2", + "version": "0.1.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,7 +29,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "humanize-duration": "^3.27.1", "luxon": "^3.0.0", "react-use": "^17.2.4" diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index 74336f32c8..9f498b3687 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-code-coverage-backend +## 0.2.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## 0.2.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + ## 0.2.9-next.2 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index fca52bdebc..dd4dac88c8 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.2.9-next.2", + "version": "0.2.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index 914768f638..dfa39648c7 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-code-coverage +## 0.2.10-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.2.9 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 0.2.9-next.2 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index cfdddfc6af..e09a20355e 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage", "description": "A Backstage plugin that helps you keep track of your code coverage", - "version": "0.2.9-next.2", + "version": "0.2.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,7 +32,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/styles": "^4.11.0", "highlight.js": "^10.6.0", "luxon": "^3.0.0", diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index 7390729c48..f854b3f22d 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-codescene +## 0.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.1.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 0.1.11-next.2 ### Patch Changes diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 49cedd3bc4..3e688063fc 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.11-next.2", + "version": "0.1.12-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,7 +29,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "rc-progress": "3.4.1", "react-use": "^17.2.4" }, diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 5e0de80621..e4e81e46c0 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-config-schema +## 0.1.40-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + +## 0.1.39 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + ## 0.1.39-next.2 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 730265cbea..13222fd55d 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-config-schema", "description": "A Backstage plugin that lets you browse the configuration schema of your app", - "version": "0.1.39-next.2", + "version": "0.1.40-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,7 +31,7 @@ "@backstage/types": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "jsonschema": "^1.2.6", "react-use": "^17.2.4", "zen-observable": "^0.10.0" diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index f108804cb6..8d459fb000 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-cost-insights +## 0.12.6-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-cost-insights-common@0.1.1 + +## 0.12.5 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-cost-insights-common@0.1.1 + ## 0.12.5-next.2 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index aabd4d340d..aef2c7635e 100644 --- a/plugins/cost-insights/package.json +++ b/plugins/cost-insights/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights", "description": "A Backstage plugin that helps you keep track of your cloud spend", - "version": "0.12.5-next.2", + "version": "0.12.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -41,7 +41,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/styles": "^4.9.6", "@types/recharts": "^1.8.14", "classnames": "^2.2.6", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index 402ee43c1e..46fde4973e 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-dynatrace +## 3.0.1-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 3.0.0 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 3.0.0-next.2 ### Patch Changes diff --git a/plugins/dynatrace/README.md b/plugins/dynatrace/README.md index df6bb75f10..b07fe985fe 100644 --- a/plugins/dynatrace/README.md +++ b/plugins/dynatrace/README.md @@ -49,7 +49,7 @@ const serviceEntityPage = ( + > + + - + ) ``` diff --git a/plugins/dynatrace/api-report.md b/plugins/dynatrace/api-report.md index 1677318a9f..1dded736ad 100644 --- a/plugins/dynatrace/api-report.md +++ b/plugins/dynatrace/api-report.md @@ -16,6 +16,4 @@ export const DynatraceTab: () => JSX.Element; // @public export const isDynatraceAvailable: (entity: Entity) => boolean; - -// (No @packageDocumentation comment for this package) ``` diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index c66ef32c7b..d01e7eafad 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "3.0.0-next.2", + "version": "3.0.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,7 +33,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/dynatrace/src/index.ts b/plugins/dynatrace/src/index.ts index 0c5da219a5..90688a544f 100644 --- a/plugins/dynatrace/src/index.ts +++ b/plugins/dynatrace/src/index.ts @@ -14,4 +14,10 @@ * limitations under the License. */ +/** + * A Backstage plugin that integrates towards Dynatrace. + * + * @packageDocumentation + */ + export { dynatracePlugin, DynatraceTab, isDynatraceAvailable } from './plugin'; diff --git a/plugins/entity-feedback-backend/CHANGELOG.md b/plugins/entity-feedback-backend/CHANGELOG.md index cac724d7ef..f076d9e130 100644 --- a/plugins/entity-feedback-backend/CHANGELOG.md +++ b/plugins/entity-feedback-backend/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-entity-feedback-backend +## 0.1.2-next.0 + +### Patch Changes + +- 7eba760e6f6: Added an endpoint to fetch anonymous aggregated results from an entity +- Updated dependencies + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-auth-node@0.2.13-next.0 + +## 0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-entity-feedback-common@0.1.0 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json index b482fdb212..aa88dea67f 100644 --- a/plugins/entity-feedback-backend/package.json +++ b/plugins/entity-feedback-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback-backend", - "version": "0.1.1-next.2", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback-backend/src/service/router.test.ts b/plugins/entity-feedback-backend/src/service/router.test.ts index 74fae8248b..5df0c5cf9d 100644 --- a/plugins/entity-feedback-backend/src/service/router.test.ts +++ b/plugins/entity-feedback-backend/src/service/router.test.ts @@ -258,6 +258,22 @@ describe('createRouter', () => { }); }); + describe('GET /ratings/:entityRef/aggregate', () => { + it('should get aggregated ratings for an entity correctly', async () => { + const response = await request(app) + .get('/ratings/component%3Adefault%2Fservice/aggregate') + .send(); + expect(mockDbHandler.getRatings).toHaveBeenCalledWith( + 'component:default/service', + ); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + DISLIKE: 1, + LIKE: 2, + }); + }); + }); + describe('POST /responses/:entityRef', () => { it('should record a response correctly', async () => { const body = { response: 'blah', comments: 'feedback', consent: true }; diff --git a/plugins/entity-feedback-backend/src/service/router.ts b/plugins/entity-feedback-backend/src/service/router.ts index e1243cedaf..ea759c1639 100644 --- a/plugins/entity-feedback-backend/src/service/router.ts +++ b/plugins/entity-feedback-backend/src/service/router.ts @@ -25,7 +25,10 @@ import { getBearerTokenFromAuthorizationHeader, IdentityApi, } from '@backstage/plugin-auth-node'; -import { EntityRatingsData } from '@backstage/plugin-entity-feedback-common'; +import { + EntityRatingsData, + Ratings, +} from '@backstage/plugin-entity-feedback-common'; import express from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; @@ -167,6 +170,19 @@ export async function createRouter( res.json(ratings.filter(r => accessibleEntityRefs.includes(r.userRef))); }); + router.get('/ratings/:entityRef/aggregate', async (req, res) => { + const entityRatings = ( + await dbHandler.getRatings(req.params.entityRef) + ).reduce((ratings: Ratings, { rating }) => { + ratings[rating] = ratings[rating] ?? 0; + ratings[rating]++; + + return ratings; + }, {}); + + res.json(entityRatings); + }); + router.post('/responses/:entityRef', async (req, res) => { const user = await identity.getIdentity({ request: req }); const { response, comments, consent } = req.body; diff --git a/plugins/entity-feedback-common/CHANGELOG.md b/plugins/entity-feedback-common/CHANGELOG.md index e646a4322d..ef373767ca 100644 --- a/plugins/entity-feedback-common/CHANGELOG.md +++ b/plugins/entity-feedback-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-entity-feedback-common +## 0.1.1-next.0 + +### Patch Changes + +- 7eba760e6f6: Added an endpoint to fetch anonymous aggregated results from an entity + ## 0.1.0 ### Minor Changes diff --git a/plugins/entity-feedback-common/api-report.md b/plugins/entity-feedback-common/api-report.md index 118e6c78f2..f31bb0d041 100644 --- a/plugins/entity-feedback-common/api-report.md +++ b/plugins/entity-feedback-common/api-report.md @@ -10,9 +10,7 @@ export interface EntityRatingsData { // (undocumented) entityTitle?: string; // (undocumented) - ratings: { - [ratingValue: string]: number; - }; + ratings: Ratings; } // @public (undocumented) @@ -38,4 +36,10 @@ export interface Rating { // (undocumented) userRef: string; } + +// @public (undocumented) +export interface Ratings { + // (undocumented) + [ratingValue: string]: number; +} ``` diff --git a/plugins/entity-feedback-common/package.json b/plugins/entity-feedback-common/package.json index 45a5a2b131..b1fbb3f686 100644 --- a/plugins/entity-feedback-common/package.json +++ b/plugins/entity-feedback-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-entity-feedback-common", "description": "Common functionalities for the entity-feedback plugin", - "version": "0.1.0", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback-common/src/index.ts b/plugins/entity-feedback-common/src/index.ts index eea289a899..247a5a5d54 100644 --- a/plugins/entity-feedback-common/src/index.ts +++ b/plugins/entity-feedback-common/src/index.ts @@ -40,13 +40,18 @@ export interface FeedbackResponse { userRef: string; } +/** + * @public + */ +export interface Ratings { + [ratingValue: string]: number; +} + /** * @public */ export interface EntityRatingsData { entityRef: string; entityTitle?: string; - ratings: { - [ratingValue: string]: number; - }; + ratings: Ratings; } diff --git a/plugins/entity-feedback/CHANGELOG.md b/plugins/entity-feedback/CHANGELOG.md index 72cb7b272a..1fa0d920ab 100644 --- a/plugins/entity-feedback/CHANGELOG.md +++ b/plugins/entity-feedback/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-entity-feedback +## 0.2.0-next.0 + +### Minor Changes + +- 7eba760e6f6: Added an endpoint to fetch anonymous aggregated results from an entity + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-entity-feedback-common@0.1.0 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/entity-feedback/api-report.md b/plugins/entity-feedback/api-report.md index 06b0166b0d..696536aef4 100644 --- a/plugins/entity-feedback/api-report.md +++ b/plugins/entity-feedback/api-report.md @@ -13,6 +13,7 @@ import { EntityRatingsData } from '@backstage/plugin-entity-feedback-common'; import { FeedbackResponse } from '@backstage/plugin-entity-feedback-common'; import { FetchApi } from '@backstage/core-plugin-api'; import { Rating } from '@backstage/plugin-entity-feedback-common'; +import { Ratings } from '@backstage/plugin-entity-feedback-common'; import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; @@ -22,6 +23,7 @@ export interface EntityFeedbackApi { getAllRatings(): Promise; // (undocumented) getOwnedRatings(ownerRef: string): Promise; + getRatingAggregates(entityRef: string): Promise; // (undocumented) getRatings(entityRef: string): Promise[]>; // (undocumented) @@ -48,6 +50,8 @@ export class EntityFeedbackClient implements EntityFeedbackApi { // (undocumented) getOwnedRatings(ownerRef: string): Promise; // (undocumented) + getRatingAggregates(entityRef: string): Promise; + // (undocumented) getRatings(entityRef: string): Promise[]>; // (undocumented) getResponses( diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json index 760b192440..bac96f561c 100644 --- a/plugins/entity-feedback/package.json +++ b/plugins/entity-feedback/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback", - "version": "0.1.1-next.2", + "version": "0.2.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,7 +36,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/entity-feedback/src/api/EntityFeedbackApi.ts b/plugins/entity-feedback/src/api/EntityFeedbackApi.ts index d2f1a46f55..7ec6a447f0 100644 --- a/plugins/entity-feedback/src/api/EntityFeedbackApi.ts +++ b/plugins/entity-feedback/src/api/EntityFeedbackApi.ts @@ -19,6 +19,7 @@ import { EntityRatingsData, FeedbackResponse, Rating, + Ratings, } from '@backstage/plugin-entity-feedback-common'; /** @@ -40,6 +41,11 @@ export interface EntityFeedbackApi { getRatings(entityRef: string): Promise[]>; + /** + * Returns anonymized aggregated results for one entityRef + */ + getRatingAggregates(entityRef: string): Promise; + recordResponse( entityRef: string, response: Omit, diff --git a/plugins/entity-feedback/src/api/EntityFeedbackClient.test.ts b/plugins/entity-feedback/src/api/EntityFeedbackClient.test.ts index 694fd66b06..8ef6810115 100644 --- a/plugins/entity-feedback/src/api/EntityFeedbackClient.test.ts +++ b/plugins/entity-feedback/src/api/EntityFeedbackClient.test.ts @@ -121,6 +121,24 @@ describe('EntityFeedbackClient', () => { expect(response).toEqual(ratings); }); + it('getRatingAggregates', async () => { + const ratings = { LIKE: 3, DISLIKE: 5 }; + + server.use( + rest.get( + `${mockBaseUrl}/ratings/${encodeURIComponent( + 'component:default/service', + )}/aggregate`, + (_, res, ctx) => res(ctx.json(ratings)), + ), + ); + + const response = await client.getRatingAggregates( + 'component:default/service', + ); + expect(response).toEqual(ratings); + }); + it('recordResponse', async () => { expect.assertions(1); const response = { diff --git a/plugins/entity-feedback/src/api/EntityFeedbackClient.ts b/plugins/entity-feedback/src/api/EntityFeedbackClient.ts index 34856473c8..f911cdc7f8 100644 --- a/plugins/entity-feedback/src/api/EntityFeedbackClient.ts +++ b/plugins/entity-feedback/src/api/EntityFeedbackClient.ts @@ -20,6 +20,7 @@ import { EntityRatingsData, FeedbackResponse, Rating, + Ratings, } from '@backstage/plugin-entity-feedback-common'; import { EntityFeedbackApi } from './EntityFeedbackApi'; @@ -97,6 +98,22 @@ export class EntityFeedbackClient implements EntityFeedbackApi { return resp.json(); } + async getRatingAggregates(entityRef: string): Promise { + const baseUrl = await this.discoveryApi.getBaseUrl('entity-feedback'); + const resp = await this.fetchApi.fetch( + `${baseUrl}/ratings/${encodeURIComponent(entityRef)}/aggregate`, + { + method: 'GET', + }, + ); + + if (!resp.ok) { + throw await ResponseError.fromResponse(resp); + } + + return resp.json(); + } + async recordResponse( entityRef: string, response: Omit, diff --git a/plugins/entity-validation/CHANGELOG.md b/plugins/entity-validation/CHANGELOG.md index 43ecb6527d..dc7db0eaec 100644 --- a/plugins/entity-validation/CHANGELOG.md +++ b/plugins/entity-validation/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-entity-validation +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-catalog-common@1.0.12 + +## 0.1.1 + +### Patch Changes + +- 47d246691ac: Fixed bug in EntityVaidation plugin where string in text box was unable to be updated. +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/theme@0.2.18 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json index 81c13cc46b..811f9ab3c8 100644 --- a/plugins/entity-validation/package.json +++ b/plugins/entity-validation/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-validation", - "version": "0.1.1-next.2", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,7 +40,7 @@ "@codemirror/view": "^6.0.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^20.0.0", "@uiw/react-codemirror": "^4.9.3", "lodash": "^4.17.21", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index 0e5659c538..2dc726e160 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-events-node@0.2.5-next.0 + +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `awsSqsConsumingEventPublisherEventsModule` to `eventsModuleAwsSqsConsumingEventPublisher` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 9278099801..a90dafadde 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.1.5-next.2", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 159603d965..35560f1156 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `azureDevOpsEventRouterEventsModule` to `eventsModuleAzureDevOpsEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index ef00f0f3b9..2b66bd1421 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.1.5-next.2", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 9cf0d0a70e..8189dc2b99 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `bitbucketCloudEventRouterEventsModule` to `eventsModuleBitbucketCloudEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index fa7dba892e..e575d325ff 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.1.5-next.2", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index accd659217..82bf56ef32 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `gerritEventRouterEventsModule` to `eventsModuleGerritEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index de5d104781..95612d2aab 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.1.5-next.2", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index b531c5db52..d281e432df 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-events-backend-module-github +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `githubEventRouterEventsModule` to `eventsModuleGithubEventRouter` and `githubWebhookEventsModule` to `eventsModuleGithubWebhook`, to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 4a010f5841..7ec3660013 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.1.5-next.2", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index f992585219..9a47340948 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `gitlabEventRouterEventsModule` to `eventsModuleGitlabEventRouter` and `gitlabWebhookEventsModule` to `eventsModuleGitlabWebhook` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index 917f9fdb89..3729fa4f24 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.1.5-next.2", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index aaf14aa68b..04e373d809 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.5-next.0 + +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.4 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 67d6671497..6f7ec7c54d 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-backend-test-utils", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", - "version": "0.1.5-next.2", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index 82fb0c6fc1..af29213c08 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-events-backend +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + +## 0.2.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- a5de745ac17: Updated README instructions +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + ## 0.2.4-next.2 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 4a51e56b6a..7fda105e15 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.2.4-next.2", + "version": "0.2.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index a19d9badc2..955ad8c4e0 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-events-node +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.0 + +## 0.2.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + ## 0.2.4-next.2 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 76eb1b2bf3..930cd439e3 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-node", "description": "The plugin-events-node module for @backstage/plugin-events-backend", - "version": "0.2.4-next.2", + "version": "0.2.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index edde9b9d54..c0fd1fcb21 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @internal/plugin-todo-list-backend +## 1.0.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + +## 1.0.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + ## 1.0.11-next.2 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 5579f748b2..d5a4a116e0 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.11-next.2", + "version": "1.0.12-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-common/CHANGELOG.md b/plugins/example-todo-list-common/CHANGELOG.md index 2596387d2d..40909ff841 100644 --- a/plugins/example-todo-list-common/CHANGELOG.md +++ b/plugins/example-todo-list-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @internal/plugin-todo-list-common +## 1.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 + ## 1.0.9-next.0 ### Patch Changes diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index 5463a19348..7c48939e8b 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.9-next.0", + "version": "1.0.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index 4739ab303e..87fc367b86 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,23 @@ # @internal/plugin-todo-list +## 1.0.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## 1.0.11 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 1.0.11-next.2 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index a7366ce36f..27e05d7144 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.11-next.2", + "version": "1.0.12-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -28,7 +28,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index 7874062954..950430d91f 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-explore-backend +## 0.0.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + +## 0.0.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + ## 0.0.5-next.2 ### Patch Changes diff --git a/plugins/explore-backend/api-report.md b/plugins/explore-backend/api-report.md index cc112ed3cc..e3933e350b 100644 --- a/plugins/explore-backend/api-report.md +++ b/plugins/explore-backend/api-report.md @@ -3,18 +3,14 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -/// - -import { Config } from '@backstage/config'; -import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; import { ExploreTool } from '@backstage/plugin-explore-common'; import express from 'express'; import { GetExploreToolsRequest } from '@backstage/plugin-explore-common'; import { GetExploreToolsResponse } from '@backstage/plugin-explore-common'; -import { IndexableDocument } from '@backstage/plugin-search-common'; import { Logger } from 'winston'; -import { PluginEndpointDiscovery } from '@backstage/backend-common'; -import { Readable } from 'stream'; +import type { ToolDocument as ToolDocument_2 } from '@backstage/plugin-search-backend-module-explore'; +import { ToolDocumentCollatorFactory as ToolDocumentCollatorFactory_2 } from '@backstage/plugin-search-backend-module-explore'; +import type { ToolDocumentCollatorFactoryOptions as ToolDocumentCollatorFactoryOptions_2 } from '@backstage/plugin-search-backend-module-explore'; // @public (undocumented) export function createRouter(options: RouterOptions): Promise; @@ -40,27 +36,13 @@ export class StaticExploreToolProvider implements ExploreToolProvider { getTools(request: GetExploreToolsRequest): Promise; } -// @public -export interface ToolDocument extends IndexableDocument, ExploreTool {} +// @public @deprecated (undocumented) +export type ToolDocument = ToolDocument_2; -// @public -export class ToolDocumentCollatorFactory implements DocumentCollatorFactory { - // (undocumented) - execute(): AsyncGenerator; - // (undocumented) - static fromConfig( - _config: Config, - options: ToolDocumentCollatorFactoryOptions, - ): ToolDocumentCollatorFactory; - // (undocumented) - getCollator(): Promise; - // (undocumented) - readonly type: string; -} +// @public @deprecated (undocumented) +export const ToolDocumentCollatorFactory: typeof ToolDocumentCollatorFactory_2; -// @public -export type ToolDocumentCollatorFactoryOptions = { - discovery: PluginEndpointDiscovery; - logger: Logger; -}; +// @public @deprecated (undocumented) +export type ToolDocumentCollatorFactoryOptions = + ToolDocumentCollatorFactoryOptions_2; ``` diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index dbdab19329..30ab27bf07 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore-backend", - "version": "0.0.5-next.2", + "version": "0.0.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -25,6 +25,7 @@ "@backstage/backend-common": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-explore-common": "workspace:^", + "@backstage/plugin-search-backend-module-explore": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "@types/express": "*", "express": "^4.18.1", diff --git a/plugins/explore-backend/src/index.ts b/plugins/explore-backend/src/index.ts index a0e7216621..ca501db96b 100644 --- a/plugins/explore-backend/src/index.ts +++ b/plugins/explore-backend/src/index.ts @@ -20,7 +20,6 @@ * @packageDocumentation */ -export * from './search'; export * from './service'; export * from './tools'; @@ -28,3 +27,28 @@ export * from './tools'; * @internal Example only - do not use in production */ export { exampleTools } from './example/exampleTools'; + +import { ToolDocumentCollatorFactory as _ToolDocumentCollatorFactory } from '@backstage/plugin-search-backend-module-explore'; +import type { + ToolDocument as _ToolDocument, + ToolDocumentCollatorFactoryOptions as _ToolDocumentCollatorFactoryOptions, +} from '@backstage/plugin-search-backend-module-explore'; + +/** + * @public + * @deprecated import from `@backstage/search-backend-module-explore` instead + */ +export const ToolDocumentCollatorFactory = _ToolDocumentCollatorFactory; + +/** + * @public + * @deprecated import from `@backstage/search-backend-module-explore` instead + */ +export type ToolDocument = _ToolDocument; + +/** + * @public + * @deprecated import from `@backstage/search-backend-module-explore` instead + */ +export type ToolDocumentCollatorFactoryOptions = + _ToolDocumentCollatorFactoryOptions; diff --git a/plugins/explore-react/CHANGELOG.md b/plugins/explore-react/CHANGELOG.md index 1f68752e6e..954492e81e 100644 --- a/plugins/explore-react/CHANGELOG.md +++ b/plugins/explore-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-explore-react +## 0.0.27 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-explore-common@0.0.1 + ## 0.0.27-next.2 ### Patch Changes diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json index 6bb7ad5f0a..fbbde21b0f 100644 --- a/plugins/explore-react/package.json +++ b/plugins/explore-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore-react", "description": "A frontend library for Backstage plugins that want to interact with the explore plugin", - "version": "0.0.27-next.2", + "version": "0.0.27", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md index 72d93cf927..f5cbde7200 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,43 @@ # @backstage/plugin-explore +## 0.4.2-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-explore-react@0.0.27 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + +## 0.4.1 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-explore-react@0.0.27 + - @backstage/theme@0.2.18 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + ## 0.4.1-next.2 ### Patch Changes diff --git a/plugins/explore/package.json b/plugins/explore/package.json index c91671c816..eb5e1da5b3 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore", "description": "A Backstage plugin for building an exploration page of your software ecosystem", - "version": "0.4.1-next.2", + "version": "0.4.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,7 +44,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "classnames": "^2.2.6", "react-use": "^17.2.4" }, diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index 1fbf09d8d4..50440aba5d 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-firehydrant +## 0.2.1-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.2.0 + +### Minor Changes + +- e2e3dd08a54: Allow firehydrant to use component annotation + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.33-next.2 ### Patch Changes diff --git a/plugins/firehydrant/README.md b/plugins/firehydrant/README.md index d7169e08f0..4472536245 100644 --- a/plugins/firehydrant/README.md +++ b/plugins/firehydrant/README.md @@ -56,3 +56,11 @@ proxy: # Supply the token you generated from https://app.firehydrant.io/organizations/bots Authorization: Bearer fhb-e4911b22bcd788c4a4afeb0c111ffbfa ``` + +4. Optionally add an annotation to the yaml config file of a component + +```yaml +metadata: + annotations: + firehydrant.com/service-name: +``` diff --git a/plugins/firehydrant/api-report.md b/plugins/firehydrant/api-report.md index 2e3bcf6385..0ff5bbc62a 100644 --- a/plugins/firehydrant/api-report.md +++ b/plugins/firehydrant/api-report.md @@ -6,6 +6,7 @@ /// import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { Entity } from '@backstage/catalog-model'; import { RouteRef } from '@backstage/core-plugin-api'; // @public (undocumented) @@ -19,4 +20,7 @@ export const firehydrantPlugin: BackstagePlugin< {}, {} >; + +// @public (undocumented) +export const isFireHydrantAvailable: (entity: Entity) => boolean; ``` diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 293679c2ea..2268ca77a1 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-firehydrant", "description": "A Backstage plugin that integrates towards FireHydrant", - "version": "0.1.33-next.2", + "version": "0.2.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,13 +23,14 @@ "clean": "backstage-cli package clean" }, "dependencies": { + "@backstage/catalog-model": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "luxon": "^3.0.0", "react-use": "^17.2.4" }, diff --git a/plugins/firehydrant/src/api/index.ts b/plugins/firehydrant/src/api/index.ts index 7101b5dc62..1cbf10ec9b 100644 --- a/plugins/firehydrant/src/api/index.ts +++ b/plugins/firehydrant/src/api/index.ts @@ -30,6 +30,7 @@ export interface FireHydrantAPI { getServiceDetails(options: { serviceName: string; + lookupByName: boolean; }): Promise; getServiceIncidents(options: { @@ -77,11 +78,13 @@ export class FireHydrantAPIClient implements FireHydrantAPI { async getServiceDetails(options: { serviceName: string; + lookupByName: boolean; }): Promise { + const queryOpt = options.lookupByName ? 'name' : 'query'; + const query = new URLSearchParams(); + query.set(queryOpt, options.serviceName); const proxyUrl = await this.getApiUrl(); - const response = await fetch( - `${proxyUrl}/services?query=${options.serviceName}`, - ); + const response = await fetch(`${proxyUrl}/services?${query}`); if (!response.ok) { throw new Error( diff --git a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx index 20dbb77e86..ce2b1f5391 100644 --- a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx +++ b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx @@ -30,7 +30,9 @@ const apis = TestApiRegistry.from([fireHydrantApiRef, mockFireHydrantApi]); jest.mock('@backstage/plugin-catalog-react', () => ({ useEntity: () => { - return { entity: { metadata: { name: 'service-example' } } }; + return { + entity: { kind: 'Component', metadata: { name: 'service-example' } }, + }; }, })); diff --git a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx index bc2dd46fef..b6bfbcc13b 100644 --- a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx +++ b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx @@ -39,6 +39,7 @@ import { ResponseErrorPanel, } from '@backstage/core-components'; import { configApiRef, useApi } from '@backstage/core-plugin-api'; +import { isFireHydrantAvailable, getFireHydrantServiceName } from '../hooks'; const useStyles = makeStyles(theme => ({ button: { @@ -149,14 +150,14 @@ export const ServiceDetailsCard = () => { const startDate = DateTime.now().minus({ days: 30 }).toUTC(); const endDate = DateTime.now().toUTC(); + // The service name is provided by an annotation or a Backstage generated service name. // The Backstage service name in FireHydrant is a unique formatted string // that requires the entity's kind, name, and namespace. - const fireHydrantServiceName = `${entity?.kind}:${ - entity?.metadata?.namespace ?? 'default' - }/${entity?.metadata?.name}`; + const fireHydrantServiceName = getFireHydrantServiceName(entity); const { loading, value, error } = useServiceDetails({ serviceName: fireHydrantServiceName, + lookupByName: isFireHydrantAvailable(entity), }); const activeIncidents: string[] = value?.service?.active_incidents ?? []; diff --git a/plugins/firehydrant/src/components/hooks.test.ts b/plugins/firehydrant/src/components/hooks.test.ts new file mode 100644 index 0000000000..f35d6774ce --- /dev/null +++ b/plugins/firehydrant/src/components/hooks.test.ts @@ -0,0 +1,78 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { isFireHydrantAvailable, getFireHydrantServiceName } from './hooks'; + +describe('firehydrant-hooks-isFireHydrantAvailable', () => { + it('should find an annotation', () => { + const e: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + namespace: 'default', + name: 'test-fh-name', + annotations: { + 'firehydrant.com/service-name': 'test-fh-name', + }, + }, + }; + expect(isFireHydrantAvailable(e)).toEqual(true); + }); + + it('should not find an annotation', () => { + const e: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + namespace: 'default', + name: 'test-fh-name', + }, + }; + expect(isFireHydrantAvailable(e)).toEqual(false); + }); +}); + +describe('firehydrant-hooks-getFireHydrantServiceName', () => { + it('should return annotation service name', () => { + const expected = 'test-fh-name'; + const e: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + namespace: 'default', + name: 'test-fh-name', + annotations: { + 'firehydrant.com/service-name': expected, + }, + }, + }; + expect(getFireHydrantServiceName(e)).toEqual(expected); + }); + + it('should return generated service name', () => { + const expected = 'component:default/test-fh-name'; + const e: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + namespace: 'default', + name: 'test-fh-name', + annotations: {}, + }, + }; + expect(getFireHydrantServiceName(e)).toEqual(expected); + }); +}); diff --git a/plugins/firehydrant/src/components/hooks.ts b/plugins/firehydrant/src/components/hooks.ts new file mode 100644 index 0000000000..c4055b1724 --- /dev/null +++ b/plugins/firehydrant/src/components/hooks.ts @@ -0,0 +1,25 @@ +/* + * 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 { Entity, stringifyEntityRef } from '@backstage/catalog-model'; + +export const FIREHYDRANT_SERVICE_NAME_ANNOTATION = + 'firehydrant.com/service-name'; +/** @public */ +export const isFireHydrantAvailable = (entity: Entity) => + Boolean(entity.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION]); +export const getFireHydrantServiceName = (entity: Entity) => + entity?.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION] ?? + stringifyEntityRef(entity); diff --git a/plugins/firehydrant/src/components/serviceDetails.ts b/plugins/firehydrant/src/components/serviceDetails.ts index 9c12677577..f0ea325419 100644 --- a/plugins/firehydrant/src/components/serviceDetails.ts +++ b/plugins/firehydrant/src/components/serviceDetails.ts @@ -17,13 +17,22 @@ import useAsyncRetry from 'react-use/lib/useAsyncRetry'; import { fireHydrantApiRef } from '../api'; import { errorApiRef, useApi } from '@backstage/core-plugin-api'; -export const useServiceDetails = ({ serviceName }: { serviceName: string }) => { +export const useServiceDetails = ({ + serviceName, + lookupByName, +}: { + serviceName: string; + lookupByName: boolean; +}) => { const api = useApi(fireHydrantApiRef); const errorApi = useApi(errorApiRef); const { loading, value, error, retry } = useAsyncRetry(async () => { try { - return await api.getServiceDetails({ serviceName: serviceName }); + return await api.getServiceDetails({ + serviceName: serviceName, + lookupByName: lookupByName, + }); } catch (e) { errorApi.post(e); return Promise.reject(e); diff --git a/plugins/firehydrant/src/index.ts b/plugins/firehydrant/src/index.ts index f1ef66fd3e..218b944244 100644 --- a/plugins/firehydrant/src/index.ts +++ b/plugins/firehydrant/src/index.ts @@ -20,4 +20,8 @@ * @packageDocumentation */ -export { firehydrantPlugin, FirehydrantCard } from './plugin'; +export { + firehydrantPlugin, + FirehydrantCard, + isFireHydrantAvailable, +} from './plugin'; diff --git a/plugins/firehydrant/src/plugin.ts b/plugins/firehydrant/src/plugin.ts index 6deefe4fce..14a8c53c66 100644 --- a/plugins/firehydrant/src/plugin.ts +++ b/plugins/firehydrant/src/plugin.ts @@ -50,3 +50,6 @@ export const FirehydrantCard = firehydrantPlugin.provide( }, }), ); + +/** @public */ +export { isFireHydrantAvailable } from './components/hooks'; diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index af439b6fd0..3cb8c21d6c 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-fossa +## 0.2.49-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.2.48 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.2.48-next.2 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index 1135c76bb1..f7d14a79aa 100644 --- a/plugins/fossa/package.json +++ b/plugins/fossa/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-fossa", "description": "A Backstage plugin that integrates towards FOSSA", - "version": "0.2.48-next.2", + "version": "0.2.49-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -41,7 +41,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "cross-fetch": "^3.1.5", "luxon": "^3.0.0", "p-limit": "^3.0.2", diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index 2460deb73c..e13f9f04eb 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-gcalendar +## 0.3.13-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.3.12 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.3.12-next.2 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index 83471340b8..5a0508b41c 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.12-next.2", + "version": "0.3.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -28,7 +28,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@maxim_mazurok/gapi.client.calendar": "^3.0.20220408", "@tanstack/react-query": "^4.1.3", "classnames": "^2.3.1", diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md index ecb3ec60fc..b952be109f 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-gcp-projects +## 0.3.36-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## 0.3.35 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.3.35-next.2 ### Patch Changes diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index 1029b37cd0..516a72cbfa 100644 --- a/plugins/gcp-projects/package.json +++ b/plugins/gcp-projects/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gcp-projects", "description": "A Backstage plugin that helps you manage projects in GCP", - "version": "0.3.35-next.2", + "version": "0.3.36-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,7 +38,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^20.0.0" }, "peerDependencies": { diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index c97568b076..34e2e430ae 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-git-release-manager +## 0.3.30-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## 0.3.29 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 0.3.29-next.2 ### Patch Changes diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index 0c9507bc24..b43ee73925 100644 --- a/plugins/git-release-manager/package.json +++ b/plugins/git-release-manager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-git-release-manager", "description": "A Backstage plugin that helps you manage releases in git", - "version": "0.3.29-next.2", + "version": "0.3.30-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,7 +29,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", "luxon": "^3.0.0", "qs": "^6.10.1", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index ffec353673..df186ba39d 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-github-actions +## 0.5.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.5.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 0.5.16-next.2 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index d26249218e..78c0f5096a 100644 --- a/plugins/github-actions/package.json +++ b/plugins/github-actions/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-actions", "description": "A Backstage plugin that integrates towards GitHub Actions", - "version": "0.5.16-next.2", + "version": "0.5.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,7 +42,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", "luxon": "^3.0.0", "react-use": "^17.2.4" diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index cc8c6a838e..47f7e4d86b 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-github-deployments +## 0.1.48-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.1.47 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 0.1.47-next.2 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index f9019b5029..e60e3da91a 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-deployments", "description": "A Backstage plugin that integrates towards GitHub Deployments", - "version": "0.1.47-next.2", + "version": "0.1.48-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,7 +33,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@octokit/graphql": "^5.0.0", "luxon": "^3.0.0", "react-use": "^17.2.4" diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md index 5a440a28f3..affbf603a6 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-github-issues +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.2.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 0.2.5-next.2 ### Patch Changes diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index 83e457a606..cac335d9e3 100644 --- a/plugins/github-issues/package.json +++ b/plugins/github-issues/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-github-issues", - "version": "0.2.5-next.2", + "version": "0.2.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,7 +31,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.61", + "@material-ui/lab": "4.0.0-alpha.61", "luxon": "^3.0.0", "octokit": "^2.0.4", "react-use": "^17.4.0" diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md index ae15428eed..681552a571 100644 --- a/plugins/github-pull-requests-board/CHANGELOG.md +++ b/plugins/github-pull-requests-board/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-github-pull-requests-board +## 0.1.11-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.1.10 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 0.1.10-next.2 ### Patch Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index ff5393988b..1792a6e98c 100644 --- a/plugins/github-pull-requests-board/package.json +++ b/plugins/github-pull-requests-board/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-pull-requests-board", "description": "A Backstage plugin that allows you to see all open Pull Requests for all the repositories owned by your team", - "version": "0.1.10-next.2", + "version": "0.1.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,7 +42,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", "luxon": "^3.0.0", "p-limit": "^4.0.0", diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md index 8522e1e16c..6201080830 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-gitops-profiles +## 0.3.35-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## 0.3.34 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.3.34-next.2 ### Patch Changes diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index 291b73b308..2208c6d011 100644 --- a/plugins/gitops-profiles/package.json +++ b/plugins/gitops-profiles/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gitops-profiles", "description": "A Backstage plugin that helps you manage GitOps profiles", - "version": "0.3.34-next.2", + "version": "0.3.35-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,12 +33,13 @@ "clean": "backstage-cli package clean" }, "dependencies": { + "@backstage/config": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx b/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx index 5aa59a1cae..eb58e03580 100644 --- a/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx +++ b/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx @@ -14,7 +14,11 @@ * limitations under the License. */ -import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; +import { + MockConfigApi, + renderInTestApp, + TestApiRegistry, +} from '@backstage/test-utils'; import React from 'react'; import { gitOpsApiRef, GitOpsRestApi } from '../../api'; import ProfileCatalog from './ProfileCatalog'; @@ -31,6 +35,7 @@ import { githubAuthApiRef } from '@backstage/core-plugin-api'; describe('ProfileCatalog', () => { it('should render', async () => { const oauthRequestApi = new OAuthRequestManager(); + const configApi = new MockConfigApi({}); const apis = TestApiRegistry.from( [gitOpsApiRef, new GitOpsRestApi('http://localhost:3008')], [ @@ -40,6 +45,7 @@ describe('ProfileCatalog', () => { 'http://example.com/{{pluginId}}', ), oauthRequestApi, + configApi: configApi, }), ], ); diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md index 71d7aa3af0..06ca6ecca7 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-gocd +## 0.1.23-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.1.22 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.22-next.2 ### Patch Changes diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index f9789ffde4..a8e2599f3b 100644 --- a/plugins/gocd/package.json +++ b/plugins/gocd/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gocd", "description": "A Backstage plugin that integrates towards GoCD", - "version": "0.1.22-next.2", + "version": "0.1.23-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,7 +37,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "lodash": "^4.17.21", "luxon": "^3.0.0", "qs": "^6.10.1", diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md index f110d7b813..816962b034 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-graphiql +## 0.2.49-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## 0.2.48 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.2.48-next.2 ### Patch Changes diff --git a/plugins/graphiql/api-report.md b/plugins/graphiql/api-report.md index c96966c585..ea765d4d2b 100644 --- a/plugins/graphiql/api-report.md +++ b/plugins/graphiql/api-report.md @@ -16,7 +16,7 @@ import { RouteRef } from '@backstage/core-plugin-api'; export type EndpointConfig = { id: string; title: string; - url: string; + url: string | Promise; method?: 'POST'; headers?: { [name in string]: string; diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index a608ecb8db..fcdf347ba1 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphiql", "description": "Backstage plugin for browsing GraphQL APIs", - "version": "0.2.48-next.2", + "version": "0.2.49-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -37,7 +37,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "graphiql": "^1.5.12", "graphql": "^16.0.0", "graphql-ws": "^5.4.1", diff --git a/plugins/graphiql/src/lib/api/GraphQLEndpoints.ts b/plugins/graphiql/src/lib/api/GraphQLEndpoints.ts index 7f9c0ca4ee..52dc40fd81 100644 --- a/plugins/graphiql/src/lib/api/GraphQLEndpoints.ts +++ b/plugins/graphiql/src/lib/api/GraphQLEndpoints.ts @@ -26,7 +26,7 @@ export type EndpointConfig = { id: string; title: string; // Endpoint URL - url: string; + url: string | Promise; // only supports POST right now method?: 'POST'; // Defaults to setting Content-Type to application/json @@ -66,7 +66,7 @@ export class GraphQLEndpoints implements GraphQLBrowseApi { ...config.headers, ...options.headers, }; - const res = await fetch(url, { + const res = await fetch(await url, { method, headers, body, diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index 0ab0918031..1e2f5059eb 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-graphql-backend +## 0.1.34-next.0 + +### Patch Changes + +- e47e69eadf0: Updated dependency `@apollo/server` to `^4.0.0`. +- Updated dependencies + - @backstage/plugin-catalog-graphql@0.3.20-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + +## 0.1.33 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-graphql@0.3.19 + - @backstage/config@1.0.7 + ## 0.1.33-next.2 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index 401119b052..736c057a5b 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-backend", "description": "An experimental Backstage backend plugin for GraphQL", - "version": "0.1.33-next.2", + "version": "0.1.34-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,13 +33,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { + "@apollo/server": "^4.0.0", "@backstage/backend-common": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-catalog-graphql": "workspace:^", "@graphql-tools/schema": "^9.0.0", "@types/express": "^4.17.6", - "apollo-server": "^3.0.0", - "apollo-server-express": "^3.0.0", "express": "^4.17.1", "express-promise-router": "^4.1.0", "graphql": "^16.0.0", diff --git a/plugins/graphql-backend/src/service/router.ts b/plugins/graphql-backend/src/service/router.ts index aa83b51beb..fbddee435f 100644 --- a/plugins/graphql-backend/src/service/router.ts +++ b/plugins/graphql-backend/src/service/router.ts @@ -19,7 +19,8 @@ import express from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; import { createApplication } from 'graphql-modules'; -import { ApolloServer } from 'apollo-server-express'; +import { ApolloServer } from '@apollo/server'; +import { expressMiddleware } from '@apollo/server/express4'; import { createModule as createCatalogModule } from '@backstage/plugin-catalog-graphql'; import { Config } from '@backstage/config'; import helmet from 'helmet'; @@ -61,8 +62,6 @@ export async function createRouter( response.json({ status: 'ok' }); }); - const apolloMiddleware = server.getMiddleware({ path: '/' }); - if (process.env.NODE_ENV === 'development') router.use( helmet.contentSecurityPolicy({ @@ -72,7 +71,7 @@ export async function createRouter( }), ); - router.use(apolloMiddleware); + router.use(expressMiddleware(server)); router.use(errorHandler()); return router; diff --git a/plugins/graphql-voyager/CHANGELOG.md b/plugins/graphql-voyager/CHANGELOG.md index 982dfec9dc..480e859caa 100644 --- a/plugins/graphql-voyager/CHANGELOG.md +++ b/plugins/graphql-voyager/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-graphql-voyager +## 0.1.2-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## 0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json index 5d2b809bb3..deba02b6a4 100644 --- a/plugins/graphql-voyager/package.json +++ b/plugins/graphql-voyager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-voyager", "description": "Backstage plugin for GraphQL Voyager", - "version": "0.1.1-next.2", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -28,7 +28,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "graphql-voyager": "^1.0.0-rc.31", "react-use": "^17.2.4" }, diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 51552a0135..0c1e662fef 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-home +## 0.4.33-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.4.32 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 0.4.32-next.2 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 2957625478..767ed33557 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-home", "description": "A Backstage plugin that helps you build a home page", - "version": "0.4.32-next.2", + "version": "0.4.33-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -41,7 +41,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "lodash": "^4.17.21", "react-use": "^17.2.4" }, diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index e3d63efd71..ae6e292c85 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-ilert +## 0.2.6-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.2.5 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.2.5-next.2 ### Patch Changes diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index cc8183d6cb..67573d1e3a 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-ilert", "description": "A Backstage plugin that integrates towards iLert", - "version": "0.2.5-next.2", + "version": "0.2.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,7 +32,7 @@ "@date-io/luxon": "1.x", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/pickers": "^3.3.10", "humanize-duration": "^3.26.0", "luxon": "^3.0.0", diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index f18f75d0a4..0655d6c189 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-jenkins-backend +## 0.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-jenkins-common@0.1.14 + - @backstage/plugin-permission-common@0.7.4 + +## 0.1.33 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-jenkins-common@0.1.14 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + ## 0.1.33-next.2 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index daf5073792..54375b6f30 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.1.33-next.2", + "version": "0.1.34-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-common/CHANGELOG.md b/plugins/jenkins-common/CHANGELOG.md index 820a600fc1..73be4b306c 100644 --- a/plugins/jenkins-common/CHANGELOG.md +++ b/plugins/jenkins-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-jenkins-common +## 0.1.14 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + ## 0.1.14-next.1 ### Patch Changes diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json index 8786afd22c..04cc34b48d 100644 --- a/plugins/jenkins-common/package.json +++ b/plugins/jenkins-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-jenkins-common", - "version": "0.1.14-next.1", + "version": "0.1.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index fe8f1e2d13..97bfce2e07 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-jenkins +## 0.7.16-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-jenkins-common@0.1.14 + +## 0.7.15 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-jenkins-common@0.1.14 + - @backstage/theme@0.2.18 + ## 0.7.15-next.2 ### Patch Changes diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index 204d88db60..23bbcfedcd 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins", "description": "A Backstage plugin that integrates towards Jenkins", - "version": "0.7.15-next.2", + "version": "0.7.16-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,7 +42,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "luxon": "^3.0.0", "react-use": "^17.2.4" }, diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index 92bcf3de3f..d844d8339b 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-kafka-backend +## 0.2.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## 0.2.36 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + ## 0.2.36-next.2 ### Patch Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index 38b1f60fcb..d29ce0fb82 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.2.36-next.2", + "version": "0.2.37-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md index 1706f206e7..324b9ae111 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-kafka +## 0.3.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 0.3.16-next.2 ### Patch Changes diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index 017c14881a..a39b72c5b9 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka", "description": "A Backstage plugin that integrates towards Kafka", - "version": "0.3.16-next.2", + "version": "0.3.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,7 +32,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index ac1287f8aa..75a4567b98 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/plugin-kubernetes-backend +## 0.10.0-next.0 + +### Minor Changes + +- 804f6d16b0c: **BREAKING**: `KubernetesBuilder.create` now requires a `permissions` field of type `PermissionEvaluator`. The kubernetes `/proxy` endpoint now requires two tokens: the `Backstage-Kubernetes-Authorization` header should contain a bearer token for the target cluster, and the `Authorization` header should contain a backstage identity token. The kubernetes `/proxy` endpoint now requires a `Backstage-Kubernetes-Cluster` header replacing the previously required `X-Kubernetes-Cluster` header. + +### Patch Changes + +- 75d4985f5e8: Fixes bug whereby backstage crashes when bad credentials are provided to the kubernetes plugin. +- 83d250badc6: Fix parsing error when kubernetes api is returning badly structured data. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/plugin-kubernetes-common@0.6.2-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + +## 0.9.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-kubernetes-common@0.6.1 + ## 0.9.4-next.2 ### Patch Changes diff --git a/plugins/kubernetes-backend/api-report.md b/plugins/kubernetes-backend/api-report.md index a6a4bcfc58..449131a26e 100644 --- a/plugins/kubernetes-backend/api-report.md +++ b/plugins/kubernetes-backend/api-report.md @@ -17,6 +17,7 @@ import { KubernetesRequestAuth } from '@backstage/plugin-kubernetes-common'; import type { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; import { Logger } from 'winston'; import type { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; +import { PermissionEvaluator } from '@backstage/plugin-permission-common'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; import type { RequestHandler } from 'express'; import { TokenCredential } from '@azure/identity'; @@ -141,6 +142,9 @@ export class GoogleServiceAccountAuthTranslator ): Promise; } +// @public +export const HEADER_KUBERNETES_AUTH: string; + // @public export const HEADER_KUBERNETES_CLUSTER: string; @@ -200,6 +204,7 @@ export class KubernetesBuilder { clusterSupplier: KubernetesClustersSupplier, catalogApi: CatalogApi, proxy: KubernetesProxy, + permissionApi: PermissionEvaluator, ): express.Router; // (undocumented) protected buildServiceLocator( @@ -271,6 +276,8 @@ export interface KubernetesEnvironment { config: Config; // (undocumented) logger: Logger; + // (undocumented) + permissions: PermissionEvaluator; } // @public @@ -340,9 +347,16 @@ export type KubernetesObjectTypes = export class KubernetesProxy { constructor(logger: Logger, clusterSupplier: KubernetesClustersSupplier); // (undocumented) - createRequestHandler(): RequestHandler; + createRequestHandler( + options: KubernetesProxyCreateRequestHandlerOptions, + ): RequestHandler; } +// @public +export type KubernetesProxyCreateRequestHandlerOptions = { + permissionApi: PermissionEvaluator; +}; + // @public export interface KubernetesServiceLocator { // (undocumented) @@ -418,6 +432,8 @@ export interface RouterOptions { discovery: PluginEndpointDiscovery; // (undocumented) logger: Logger; + // (undocumented) + permissions: PermissionEvaluator; } // @public (undocumented) diff --git a/plugins/kubernetes-backend/examples/dice-roller/metrics-server.yaml b/plugins/kubernetes-backend/examples/dice-roller/metrics-server.yaml index 673064aaf2..06875a5cf1 100644 --- a/plugins/kubernetes-backend/examples/dice-roller/metrics-server.yaml +++ b/plugins/kubernetes-backend/examples/dice-roller/metrics-server.yaml @@ -82,7 +82,7 @@ spec: emptyDir: {} containers: - name: metrics-server - image: k8s.gcr.io/metrics-server-amd64:v0.3.1 + image: registry.k8s.io/metrics-server-amd64:v0.3.1 args: - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index ee7844c76e..8f7b071c9a 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.9.4-next.2", + "version": "0.10.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,6 +42,8 @@ "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", + "@backstage/plugin-permission-node": "workspace:^", "@google-cloud/container": "^4.0.0", "@jest-mock/express": "^2.0.1", "@kubernetes/client-node": "0.18.1", diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.test.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.test.ts index 2696587e69..1f8d525ea8 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.test.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.test.ts @@ -17,6 +17,13 @@ import AWS from 'aws-sdk'; import AWSMock from 'aws-sdk-mock'; import { AwsIamKubernetesAuthTranslator } from './AwsIamKubernetesAuthTranslator'; +const awsError: AWS.AWSError = { + code: '123', + message: 'no way', + name: 'nope', + time: new Date(), +}; + describe('AwsIamKubernetesAuthTranslator tests', () => { let role: any = undefined; const credentials: any = { @@ -84,6 +91,25 @@ describe('AwsIamKubernetesAuthTranslator tests', () => { expect(response.serviceAccountToken).toBeDefined(); }); + describe('When the credentials is failing', () => { + beforeEach(() => { + jest.spyOn(AWS.config, 'getCredentials').mockImplementation(cb => { + cb(awsError, null); + }); + }); + it('throws the right error', async () => { + const authTranslator = new AwsIamKubernetesAuthTranslator(); + await expect( + authTranslator.decorateClusterDetailsWithAuth({ + assumeRole: role, + name: 'test-cluster', + url: '', + authProvider: 'aws', + }), + ).rejects.toEqual(awsError); + }); + }); + describe('When the role is assumed', () => { // These credentials are not real. // Pulled from example in docs: https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts index b89945902d..84e60c9c69 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts @@ -55,46 +55,44 @@ export class AwsIamKubernetesAuthTranslator assumeRole?: string, externalId?: string, ): Promise { - return new Promise(async (resolve, reject) => { - const awsCreds = await this.awsGetCredentials(); + const awsCreds = await this.awsGetCredentials(); - if (!(awsCreds instanceof Credentials)) - return reject(Error('No AWS credentials found.')); + if (!(awsCreds instanceof Credentials)) + throw new Error('No AWS credentials found.'); - let creds: SigningCreds = { - accessKeyId: awsCreds.accessKeyId, - secretAccessKey: awsCreds.secretAccessKey, - sessionToken: awsCreds.sessionToken, + let creds: SigningCreds = { + accessKeyId: awsCreds.accessKeyId, + secretAccessKey: awsCreds.secretAccessKey, + sessionToken: awsCreds.sessionToken, + }; + + if (!this.validCredentials(creds)) + throw new Error('Invalid AWS credentials found.'); + if (!assumeRole) return creds; + + try { + const params: AWS.STS.Types.AssumeRoleRequest = { + RoleArn: assumeRole, + RoleSessionName: 'backstage-login', }; + if (externalId) params.ExternalId = externalId; - if (!this.validCredentials(creds)) - return reject(Error('Invalid AWS credentials found.')); - if (!assumeRole) return resolve(creds); + const assumedRole = await new AWS.STS().assumeRole(params).promise(); - try { - const params: AWS.STS.Types.AssumeRoleRequest = { - RoleArn: assumeRole, - RoleSessionName: 'backstage-login', - }; - if (externalId) params.ExternalId = externalId; - - const assumedRole = await new AWS.STS().assumeRole(params).promise(); - - if (!assumedRole.Credentials) { - throw new Error(`No credentials returned for role ${assumeRole}`); - } - - creds = { - accessKeyId: assumedRole.Credentials.AccessKeyId, - secretAccessKey: assumedRole.Credentials.SecretAccessKey, - sessionToken: assumedRole.Credentials.SessionToken, - }; - } catch (e) { - console.warn(`There was an error assuming the role: ${e}`); - return reject(Error(`Unable to assume role: ${e}`)); + if (!assumedRole.Credentials) { + throw new Error(`No credentials returned for role ${assumeRole}`); } - return resolve(creds); - }); + + creds = { + accessKeyId: assumedRole.Credentials.AccessKeyId, + secretAccessKey: assumedRole.Credentials.SecretAccessKey, + sessionToken: assumedRole.Credentials.SessionToken, + }; + } catch (e) { + console.warn(`There was an error assuming the role: ${e}`); + throw new Error(`Unable to assume role: ${e}`); + } + return creds; } async getBearerToken( clusterName: string, diff --git a/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts b/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts index cc2dea26c0..8eb7a066df 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts @@ -31,16 +31,24 @@ import { import { KubernetesBuilder } from './KubernetesBuilder'; import { KubernetesFanOutHandler } from './KubernetesFanOutHandler'; import { CatalogApi } from '@backstage/catalog-client'; -import { HEADER_KUBERNETES_CLUSTER } from './KubernetesProxy'; +import { + HEADER_KUBERNETES_CLUSTER, + HEADER_KUBERNETES_AUTH, +} from './KubernetesProxy'; import { setupServer } from 'msw/node'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { rest } from 'msw'; +import { + AuthorizeResult, + PermissionEvaluator, +} from '@backstage/plugin-permission-common'; describe('KubernetesBuilder', () => { let app: express.Express; let kubernetesFanOutHandler: jest.Mocked; let config: Config; let catalogApi: CatalogApi; + let permissions: jest.Mocked; beforeAll(async () => { const logger = getVoidLogger(); @@ -74,10 +82,16 @@ describe('KubernetesBuilder', () => { getKubernetesObjectsByEntity: jest.fn(), } as any; + permissions = { + authorize: jest.fn(), + authorizeConditional: jest.fn(), + }; + const { router } = await KubernetesBuilder.createBuilder({ config, logger, catalogApi, + permissions, }) .setObjectsProvider(kubernetesFanOutHandler) .setClusterSupplier(clusterSupplier) @@ -250,6 +264,7 @@ describe('KubernetesBuilder', () => { logger, config, catalogApi, + permissions, }) .setClusterSupplier(clusterSupplier) .setServiceLocator(serviceLocator) @@ -271,27 +286,32 @@ describe('KubernetesBuilder', () => { expect(response.status).toEqual(200); }); }); - describe('post /proxy', () => { const worker = setupServer(); setupRequestMockHandlers(worker); beforeEach(() => { worker.use( - rest.post('https://localhost:1234/api/v1/namespaces', (req, res, ctx) => - req - .arrayBuffer() - .then(body => - res( - ctx.set('content-type', `${req.headers.get('content-type')}`), - ctx.body(body), - ), - ), + rest.post( + 'https://localhost:1234/api/v1/namespaces', + (req, res, ctx) => { + if (!req.headers.get('Authorization')) { + return res(ctx.status(401)); + } + return req + .arrayBuffer() + .then(body => + res( + ctx.set('content-type', `${req.headers.get('content-type')}`), + ctx.body(body), + ), + ); + }, ), ); }); - it('returns the given request body', async () => { + it('returns the given request body with permission set to allow', async () => { const requestBody = { kind: 'Namespace', apiVersion: 'v1', @@ -300,9 +320,14 @@ describe('KubernetesBuilder', () => { }, }; + permissions.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); + const proxyEndpointRequest = request(app) .post('/proxy/api/v1/namespaces') .set(HEADER_KUBERNETES_CLUSTER, 'some-cluster') + .set(HEADER_KUBERNETES_AUTH, 'randomtoken') .send(requestBody); worker.use(rest.all(proxyEndpointRequest.url, req => req.passthrough())); @@ -312,7 +337,7 @@ describe('KubernetesBuilder', () => { expect(response.body).toStrictEqual(requestBody); }); - it('supports yaml content type', async () => { + it('supports yaml content type with permission set to allow', async () => { const requestBody = `--- kind: Namespace apiVersion: v1 @@ -320,9 +345,14 @@ metadata: name: new-ns `; + permissions.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); + const proxyEndpointRequest = request(app) .post('/proxy/api/v1/namespaces') .set(HEADER_KUBERNETES_CLUSTER, 'some-cluster') + .set(HEADER_KUBERNETES_AUTH, 'randomtoken') .set('content-type', 'application/yaml') .send(requestBody); @@ -331,5 +361,50 @@ metadata: const response = await proxyEndpointRequest; expect(response.text).toEqual(requestBody); }); + + it('returns a 403 response if Permission Policy is in place that blocks endpoint', async () => { + const requestBody = { + kind: 'Namespace', + apiVersion: 'v1', + metadata: { + name: 'new-ns', + }, + }; + + permissions.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.DENY }]), + ); + + const proxyEndpointRequest = request(app) + .post('/proxy/api/v1/namespaces') + .set(HEADER_KUBERNETES_CLUSTER, 'some-cluster') + .set(HEADER_KUBERNETES_AUTH, 'randomtoken') + .send(requestBody); + + worker.use(rest.all(proxyEndpointRequest.url, req => req.passthrough())); + + const response = await proxyEndpointRequest; + + expect(response.status).toEqual(403); + }); + }); + describe('get /.well-known/backstage/permissions/metadata', () => { + it('lists permissions supported by the kubernetes plugin', async () => { + const response = await request(app).get( + '/.well-known/backstage/permissions/metadata', + ); + + expect(response.status).toEqual(200); + expect(response.body).toMatchObject({ + permissions: [ + { + type: 'basic', + name: 'kubernetes.proxy', + attributes: {}, + }, + ], + rules: [], + }); + }); }); }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts index 74ec9eada2..367e5edef3 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts @@ -15,6 +15,9 @@ */ import { CatalogApi } from '@backstage/catalog-client'; import { Config } from '@backstage/config'; +import { kubernetesPermissions } from '@backstage/plugin-kubernetes-common'; +import { PermissionEvaluator } from '@backstage/plugin-permission-common'; +import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; import express from 'express'; import Router from 'express-promise-router'; import { Duration } from 'luxon'; @@ -49,6 +52,7 @@ export interface KubernetesEnvironment { logger: Logger; config: Config; catalogApi: CatalogApi; + permissions: PermissionEvaluator; } /** @@ -89,6 +93,7 @@ export class KubernetesBuilder { public async build(): KubernetesBuilderReturn { const logger = this.env.logger; const config = this.env.config; + const permissions = this.env.permissions; logger.info('Initializing Kubernetes backend'); @@ -126,6 +131,7 @@ export class KubernetesBuilder { clusterSupplier, this.env.catalogApi, proxy, + permissions, ); return { @@ -262,12 +268,17 @@ export class KubernetesBuilder { clusterSupplier: KubernetesClustersSupplier, catalogApi: CatalogApi, proxy: KubernetesProxy, + permissionApi: PermissionEvaluator, ): express.Router { const logger = this.env.logger; const router = Router(); - router.use('/proxy', proxy.createRequestHandler()); + router.use('/proxy', proxy.createRequestHandler({ permissionApi })); router.use(express.json()); - + router.use( + createPermissionIntegrationRouter({ + permissions: kubernetesPermissions, + }), + ); // @deprecated router.post('/services/:serviceId', async (req, res) => { const serviceId = req.params.serviceId; diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts index 17a86eb30d..53aaa1ad3a 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts @@ -502,6 +502,47 @@ describe('getKubernetesObjectsByEntity', () => { }); }); + it('pods api is returning garbage', async () => { + getClustersByEntity.mockImplementation(() => + Promise.resolve({ + clusters: [ + { + name: 'test-cluster', + authProvider: 'serviceAccount', + }, + ], + }), + ); + + fetchObjectsForService.mockImplementation((_: ObjectFetchParams) => + Promise.resolve({ + errors: [], + responses: [ + { + garbage: ['thrash', 'rubbish'], + }, + ], + }), + ); + + mockMetrics(fetchPodMetricsByNamespaces); + + const sut = getKubernetesFanOutHandler([]); + + const result = await sut.getKubernetesObjectsByEntity({ + entity, + auth: {}, + }); + + expect(getClustersByEntity.mock.calls.length).toBe(1); + expect(fetchObjectsForService.mock.calls.length).toBe(1); + expect(fetchPodMetricsByNamespaces.mock.calls.length).toBe(0); + + expect(result).toStrictEqual({ + items: [], + }); + }); + it('retrieve objects for two clusters', async () => { getClustersByEntity.mockImplementation(() => Promise.resolve({ diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 63e46a44e3..f71c6506bd 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -49,6 +49,14 @@ import { PodStatus, } from '@kubernetes/client-node'; +const isRejected = ( + input: PromiseSettledResult, +): input is PromiseRejectedResult => input.status === 'rejected'; + +const isFulfilled = ( + input: PromiseSettledResult, +): input is PromiseFulfilledResult => input.status === 'fulfilled'; + /** * * @public @@ -298,12 +306,12 @@ export class KubernetesFanOutHandler { auth: KubernetesRequestAuth, requestContext: ServiceLocatorRequestContext, ) { - const clusterDetails: ClusterDetails[] = await ( + const clusterDetails: ClusterDetails[] = ( await this.serviceLocator.getClustersByEntity(entity, requestContext) ).clusters; // Execute all of these async actions simultaneously/without blocking sequentially as no common object is modified by them - return await Promise.all( + const promiseResults = await Promise.allSettled( clusterDetails.map(cd => { const kubernetesAuthTranslator: KubernetesAuthTranslator = this.getAuthTranslator(cd.authProvider); @@ -313,6 +321,11 @@ export class KubernetesFanOutHandler { ); }), ); + + promiseResults.filter(isRejected).map(item => { + this.logger.info(`Failed to decorate cluster details: ${item.reason}`); + }); + return promiseResults.filter(isFulfilled).map(item => item.value); } toObjectsByEntityResponse( @@ -324,7 +337,7 @@ export class KubernetesFanOutHandler { (item.errors !== undefined && item.errors.length >= 1) || (item.resources !== undefined && item.resources.length >= 1 && - item.resources.some(fr => fr.resources.length >= 1)), + item.resources.some(fr => fr.resources?.length >= 1)), ), }; } diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index 4254bb33da..d2404af839 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -30,6 +30,10 @@ import { HEADER_KUBERNETES_CLUSTER, KubernetesProxy, } from './KubernetesProxy'; +import { + AuthorizeResult, + PermissionEvaluator, +} from '@backstage/plugin-permission-common'; describe('KubernetesProxy', () => { let proxy: KubernetesProxy; @@ -64,6 +68,11 @@ describe('KubernetesProxy', () => { getClusters: jest.fn(), }; + const permissionApi: jest.Mocked = { + authorize: jest.fn(), + authorizeConditional: jest.fn(), + }; + beforeEach(() => { jest.resetAllMocks(); proxy = new KubernetesProxy(getVoidLogger(), clusterSupplier); @@ -71,13 +80,16 @@ describe('KubernetesProxy', () => { it('should return a ERROR_NOT_FOUND if no clusters are found', async () => { clusterSupplier.getClusters.mockResolvedValue([]); + permissionApi.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); const req = buildMockRequest('test', 'api'); const { res, next } = getMockRes(); - await expect(proxy.createRequestHandler()(req, res, next)).rejects.toThrow( - NotFoundError, - ); + await expect( + proxy.createRequestHandler({ permissionApi })(req, res, next), + ).rejects.toThrow(NotFoundError); }); it('should pass the exact response from Kubernetes', async () => { @@ -100,7 +112,13 @@ describe('KubernetesProxy', () => { authProvider: 'serviceAccount', }, ] as ClusterDetails[]); - const app = express().use('/mountpath', proxy.createRequestHandler()); + const app = express().use( + '/mountpath', + proxy.createRequestHandler({ permissionApi }), + ); + permissionApi.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); const requestPromise = request(app) .get('/mountpath/api') .set(HEADER_KUBERNETES_CLUSTER, 'cluster1'); diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 178105ef79..49a381b75a 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -18,9 +18,16 @@ import { ErrorResponseBody, ForwardedError, InputError, + NotAllowedError, NotFoundError, serializeError, } from '@backstage/errors'; +import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; +import { kubernetesProxyPermission } from '@backstage/plugin-kubernetes-common'; +import { + PermissionEvaluator, + AuthorizeResult, +} from '@backstage/plugin-permission-common'; import { bufferFromFileOrString } from '@kubernetes/client-node'; import type { Request, RequestHandler } from 'express'; import { createProxyMiddleware } from 'http-proxy-middleware'; @@ -34,7 +41,24 @@ export const APPLICATION_JSON: string = 'application/json'; * * @public */ -export const HEADER_KUBERNETES_CLUSTER: string = 'X-Kubernetes-Cluster'; +export const HEADER_KUBERNETES_CLUSTER: string = 'Backstage-Kubernetes-Cluster'; + +/** + * The header that is used to specify the Authentication Authorities token. + * e.x if using the google auth provider as your authentication authority then this field would be the google provided bearer token. + * @public + */ +export const HEADER_KUBERNETES_AUTH: string = + 'Backstage-Kubernetes-Authorization'; + +/** + * The options object expected to be passed as a parameter to KubernetesProxy.createRequestHandler(). + * + * @public + */ +export type KubernetesProxyCreateRequestHandlerOptions = { + permissionApi: PermissionEvaluator; +}; /** * A proxy that routes requests to the Kubernetes API. @@ -49,8 +73,29 @@ export class KubernetesProxy { private readonly clusterSupplier: KubernetesClustersSupplier, ) {} - public createRequestHandler(): RequestHandler { + public createRequestHandler( + options: KubernetesProxyCreateRequestHandlerOptions, + ): RequestHandler { + const { permissionApi } = options; return async (req, res, next) => { + const token = getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ); + + const authorizeResponse = ( + await permissionApi.authorize( + [{ permission: kubernetesProxyPermission }], + { + token, + }, + ) + )[0]; + + if (authorizeResponse.result === AuthorizeResult.DENY) { + res.status(403).json({ error: new NotAllowedError('Unauthorized') }); + return; + } + const middleware = await this.getMiddleware(req); middleware(req, res, next); }; @@ -104,6 +149,11 @@ export class KubernetesProxy { res.status(500).json(body); }, + onProxyReq: (proxyReq, req) => { + // the kubernetes proxy endpoint expects a header field labeled `Backstage-Kubernetes-Authorization` that will be used to authenticate with the Kubernetes Api. The token provided as a value should be an bearer token for the target cluster. + const token = req.header(HEADER_KUBERNETES_AUTH) ?? ''; + proxyReq.setHeader('Authorization', token); + }, }); this.middlewareForClusterName.set(originalCluster.name, middleware); diff --git a/plugins/kubernetes-backend/src/service/index.ts b/plugins/kubernetes-backend/src/service/index.ts index 620f788ac2..2f3e907879 100644 --- a/plugins/kubernetes-backend/src/service/index.ts +++ b/plugins/kubernetes-backend/src/service/index.ts @@ -16,5 +16,10 @@ export * from './KubernetesBuilder'; export { DEFAULT_OBJECTS } from './KubernetesFanOutHandler'; -export { HEADER_KUBERNETES_CLUSTER, KubernetesProxy } from './KubernetesProxy'; +export { + HEADER_KUBERNETES_CLUSTER, + KubernetesProxy, + HEADER_KUBERNETES_AUTH, +} from './KubernetesProxy'; +export type { KubernetesProxyCreateRequestHandlerOptions } from './KubernetesProxy'; export * from './router'; diff --git a/plugins/kubernetes-backend/src/service/router.ts b/plugins/kubernetes-backend/src/service/router.ts index 341956553e..f7e58f535c 100644 --- a/plugins/kubernetes-backend/src/service/router.ts +++ b/plugins/kubernetes-backend/src/service/router.ts @@ -21,6 +21,7 @@ import express from 'express'; import { KubernetesBuilder } from './KubernetesBuilder'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { CatalogApi } from '@backstage/catalog-client'; +import { PermissionEvaluator } from '@backstage/plugin-permission-common'; /** * @@ -32,6 +33,7 @@ export interface RouterOptions { catalogApi: CatalogApi; clusterSupplier?: KubernetesClustersSupplier; discovery: PluginEndpointDiscovery; + permissions: PermissionEvaluator; } /** diff --git a/plugins/kubernetes-backend/src/service/standaloneApplication.ts b/plugins/kubernetes-backend/src/service/standaloneApplication.ts index 8234f89d48..e3afb5a385 100644 --- a/plugins/kubernetes-backend/src/service/standaloneApplication.ts +++ b/plugins/kubernetes-backend/src/service/standaloneApplication.ts @@ -28,6 +28,7 @@ import { Logger } from 'winston'; import { createRouter } from './router'; import { ConfigReader } from '@backstage/config'; import { CatalogClient } from '@backstage/catalog-client'; +import { PermissionEvaluator } from '@backstage/plugin-permission-common'; export interface ApplicationOptions { enableCors: boolean; @@ -47,6 +48,8 @@ export async function createStandaloneApplication( discoveryApi: SingleHostDiscovery.fromConfig(config), }); + const permissions = {} as PermissionEvaluator; + app.use(helmet()); if (enableCors) { app.use(cors()); @@ -54,7 +57,10 @@ export async function createStandaloneApplication( app.use(compression()); app.use(express.json()); app.use(requestLoggingHandler()); - app.use('/', await createRouter({ logger, config, discovery, catalogApi })); + app.use( + '/', + await createRouter({ logger, config, discovery, catalogApi, permissions }), + ); app.use(notFoundHandler()); app.use(errorHandler()); diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 35044f7576..862899600e 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-kubernetes-common +## 0.6.2-next.0 + +### Patch Changes + +- 804f6d16b0c: Introduced proxy permission types to be used with the kubernetes proxy endpoint's permission framework integration. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-permission-common@0.7.4 + +## 0.6.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + ## 0.6.1-next.1 ### Patch Changes diff --git a/plugins/kubernetes-common/api-report.md b/plugins/kubernetes-common/api-report.md index fb41895f1a..6c88074e50 100644 --- a/plugins/kubernetes-common/api-report.md +++ b/plugins/kubernetes-common/api-report.md @@ -3,6 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { BasicPermission } from '@backstage/plugin-permission-common'; import { Entity } from '@backstage/catalog-model'; import type { JsonObject } from '@backstage/types'; import { PodStatus } from '@kubernetes/client-node'; @@ -217,6 +218,12 @@ export type KubernetesErrorTypes = // @public (undocumented) export type KubernetesFetchError = StatusError | RawFetchError; +// @public +export const kubernetesPermissions: BasicPermission[]; + +// @public +export const kubernetesProxyPermission: BasicPermission; + // @public (undocumented) export interface KubernetesRequestAuth { // (undocumented) diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index e100b64500..4eb4a02bf9 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-common", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", - "version": "0.6.1-next.1", + "version": "0.6.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -39,6 +39,7 @@ }, "dependencies": { "@backstage/catalog-model": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", "@kubernetes/client-node": "0.18.1" }, "devDependencies": { diff --git a/plugins/kubernetes-common/src/index.ts b/plugins/kubernetes-common/src/index.ts index ade73e4f79..d5cf8dcf61 100644 --- a/plugins/kubernetes-common/src/index.ts +++ b/plugins/kubernetes-common/src/index.ts @@ -22,3 +22,7 @@ export * from './types'; export * from './catalog-entity-constants'; +export { + kubernetesProxyPermission, + kubernetesPermissions, +} from './permissions'; diff --git a/plugins/kubernetes-common/src/permissions.ts b/plugins/kubernetes-common/src/permissions.ts new file mode 100644 index 0000000000..d3ccbe8171 --- /dev/null +++ b/plugins/kubernetes-common/src/permissions.ts @@ -0,0 +1,31 @@ +/* + * 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 { createPermission } from '@backstage/plugin-permission-common'; + +/** This permission is used to check access to the proxy endpoint + * @public + */ +export const kubernetesProxyPermission = createPermission({ + name: 'kubernetes.proxy', + attributes: {}, +}); + +/** + * List of all Kubernetes permissions. + * @public + */ +export const kubernetesPermissions = [kubernetesProxyPermission]; diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 05929a7d46..cc8131b399 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-kubernetes +## 0.7.10-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/plugin-kubernetes-common@0.6.2-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.7.9 + +### Patch Changes + +- 8adeb19b37d: GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-kubernetes-common@0.6.1 + ## 0.7.9-next.2 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index ed806ee521..f674402545 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes", "description": "A Backstage plugin that integrates towards Kubernetes", - "version": "0.7.9-next.2", + "version": "0.7.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,7 +43,7 @@ "@kubernetes/client-node": "0.18.1", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@types/react": "^16.13.1 || ^17.0.0", "cronstrue": "^2.2.0", "js-yaml": "^4.0.0", diff --git a/plugins/lighthouse-backend/CHANGELOG.md b/plugins/lighthouse-backend/CHANGELOG.md index 0caf949bd6..7320fc7b77 100644 --- a/plugins/lighthouse-backend/CHANGELOG.md +++ b/plugins/lighthouse-backend/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-lighthouse-backend +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + - @backstage/plugin-lighthouse-common@0.1.1 + +## 0.1.1 + +### Patch Changes + +- 46829bc2f0e: Update README.md; typo with plugin name & removed unneeded "import { Router } from 'express';" +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-lighthouse-common@0.1.1 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/lighthouse-backend/package.json b/plugins/lighthouse-backend/package.json index 7fa51b3446..523f3837f5 100644 --- a/plugins/lighthouse-backend/package.json +++ b/plugins/lighthouse-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-backend", "description": "Backend functionalities for lighthouse", - "version": "0.1.1-next.2", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse-common/CHANGELOG.md b/plugins/lighthouse-common/CHANGELOG.md index 001182cf98..a44c2b52a6 100644 --- a/plugins/lighthouse-common/CHANGELOG.md +++ b/plugins/lighthouse-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-lighthouse-common +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/lighthouse-common/package.json b/plugins/lighthouse-common/package.json index cf7a598ce8..9cd13e7510 100644 --- a/plugins/lighthouse-common/package.json +++ b/plugins/lighthouse-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-common", "description": "Common functionalities for lighthouse, to be shared between lighthouse and lighthouse-backend plugin", - "version": "0.1.1-next.0", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md index f326707dfa..e662f3d81d 100644 --- a/plugins/lighthouse/CHANGELOG.md +++ b/plugins/lighthouse/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-lighthouse +## 0.4.2-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-lighthouse-common@0.1.1 + +## 0.4.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-lighthouse-common@0.1.1 + ## 0.4.1-next.2 ### Patch Changes diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index 3fcb24986d..c46fcffe57 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse", "description": "A Backstage plugin that integrates towards Lighthouse", - "version": "0.4.1-next.2", + "version": "0.4.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,7 +42,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/linguist-backend/CHANGELOG.md b/plugins/linguist-backend/CHANGELOG.md index ac922c735b..5f38af055f 100644 --- a/plugins/linguist-backend/CHANGELOG.md +++ b/plugins/linguist-backend/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-linguist-backend +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-linguist-common@0.1.0 + +## 0.2.0 + +### Minor Changes + +- 4a1c318853d: **BREAKING** The linguist-backend `createRouter` now requires that the `tokenManger` is passed to the router. + +### Patch Changes + +- 8a298b47240: Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API). +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 2ea57821629: Fixed bug in LinguistBackendApi that caused initial batch of entities to be skipped. +- b271d5ca052: Allow kind to be configurable + + ```ts + return createRouter({ schedule: schedule, kind: ['Component'] }, { ...env }); + ``` + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-linguist-common@0.1.0 + ## 0.2.0-next.2 ### Patch Changes diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json index 01c4f12afa..d9f971d178 100644 --- a/plugins/linguist-backend/package.json +++ b/plugins/linguist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist-backend", - "version": "0.2.0-next.2", + "version": "0.2.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist/CHANGELOG.md b/plugins/linguist/CHANGELOG.md index 3d83855122..1670d80f97 100644 --- a/plugins/linguist/CHANGELOG.md +++ b/plugins/linguist/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-linguist +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-linguist-common@0.1.0 + +## 0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- ab997ce243f: Updated `README.md` to removed images with refresh button as this feature was not implemented in the current version +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-linguist-common@0.1.0 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/linguist/package.json b/plugins/linguist/package.json index 276bb81574..0a36244b81 100644 --- a/plugins/linguist/package.json +++ b/plugins/linguist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist", - "version": "0.1.1-next.2", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,7 +37,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "luxon": "^2.0.2", "react-use": "^17.2.4", "slugify": "^1.6.4" diff --git a/plugins/microsoft-calendar/CHANGELOG.md b/plugins/microsoft-calendar/CHANGELOG.md index 69a93bc320..1cb17d787b 100644 --- a/plugins/microsoft-calendar/CHANGELOG.md +++ b/plugins/microsoft-calendar/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-microsoft-calendar +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.1.1 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/microsoft-calendar/README.md b/plugins/microsoft-calendar/README.md index 219a7cf2dc..92421046e2 100644 --- a/plugins/microsoft-calendar/README.md +++ b/plugins/microsoft-calendar/README.md @@ -1,7 +1,6 @@ # Microsoft-Calendar Plugin -Welcome to the Microsoft calendar plugin! -_This plugin was created through the Backstage CLI_ +This plugin is contributed by [StatusNeo](https://statusneo.com/) ## Features diff --git a/plugins/microsoft-calendar/package.json b/plugins/microsoft-calendar/package.json index 8d20a5de70..8170c7847f 100644 --- a/plugins/microsoft-calendar/package.json +++ b/plugins/microsoft-calendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-microsoft-calendar", - "version": "0.1.1-next.2", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -13,10 +13,24 @@ "role": "frontend-plugin" }, "author": { - "name": "Abhay Soni", - "email": "abhaysoni.developer@gmail.com", - "url": "https://github.com/Abhay-soni-developer" + "name": "Statusneo", + "email": "reach@statusneo.com", + "url": "https://statusneo.com/" }, + "contributors": [ + { + "email": "abhaysoni.developer@gmail.com", + "url": "https://github.com/Abhay-soni-developer", + "name": "abhaysoni" + } + ], + "maintainers": [ + { + "email": "abhaysoni.developer@gmail.com", + "url": "https://github.com/Abhay-soni-developer", + "name": "abhaysoni" + } + ], "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index 93b27ba385..81112322fb 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-newrelic-dashboard +## 0.2.10-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## 0.2.9 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + ## 0.2.9-next.2 ### Patch Changes diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index 9958741b5f..8718cbfe70 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.2.9-next.2", + "version": "0.2.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,7 +29,7 @@ "@backstage/plugin-catalog-react": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "devDependencies": { diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md index bd0ef0d06f..60ccace53b 100644 --- a/plugins/newrelic/CHANGELOG.md +++ b/plugins/newrelic/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-newrelic +## 0.3.35-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## 0.3.34 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 66fdf05a1ef: Updated installation instructions +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.3.34-next.2 ### Patch Changes diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index 3ad74b3949..89823c559b 100644 --- a/plugins/newrelic/package.json +++ b/plugins/newrelic/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-newrelic", "description": "A Backstage plugin that integrates towards New Relic", - "version": "0.3.34-next.2", + "version": "0.3.35-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,7 +38,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/octopus-deploy/CHANGELOG.md b/plugins/octopus-deploy/CHANGELOG.md index a3743722b8..8b39119ce2 100644 --- a/plugins/octopus-deploy/CHANGELOG.md +++ b/plugins/octopus-deploy/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-octopus-deploy +## 0.1.1-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.1.0 + +### Minor Changes + +- b7fff1171f0: Initial version + +### Patch Changes + +- cb0fc15a992: Added Octopus Deploy logo +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.0-next.2 ### Patch Changes diff --git a/plugins/octopus-deploy/package.json b/plugins/octopus-deploy/package.json index 9ba86f1587..ce36c80678 100644 --- a/plugins/octopus-deploy/package.json +++ b/plugins/octopus-deploy/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-octopus-deploy", - "version": "0.1.0-next.2", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,7 +29,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index cb59276110..cdb4ef0b9e 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-org-react +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.1.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index a2e6623523..6b48a9c381 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.5-next.2", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,7 +38,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 4728f8be20..d4db2bcc61 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-org +## 0.6.7-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.6.6 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 36bccb5252f: Fix small UI-glitch in MemberListCard +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- a06fcac4040: Add styling to the `MembersListCard` and `ComponentsGrid` to handle overflow text. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.6.6-next.2 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index bd7ea9a344..43a102e1dd 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-org", "description": "A Backstage plugin that helps you create entity pages for your organization", - "version": "0.6.6-next.2", + "version": "0.6.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,7 +35,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "p-limit": "^3.1.0", "pluralize": "^8.0.0", "qs": "^6.10.1", diff --git a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.stories.tsx b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.stories.tsx index f183ab4d8e..526d7c9c4c 100644 --- a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.stories.tsx +++ b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.stories.tsx @@ -128,3 +128,33 @@ export const ExtraDetails = () => ( ); + +const groupWithTitle: GroupEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: 'team-a', + description: 'Team A description', + title: 'Team A title', + }, + spec: { + profile: { + email: 'team-a@example.com', + picture: + 'https://avatars.dicebear.com/api/identicon/team-a@example.com.svg?background=%23fff&margin=25', + }, + type: 'group', + children: [], + }, + relations: [dummyDepartment], +}; + +export const UseGroupTitle = () => ( + + + + + + + +); diff --git a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx index 5e795b2710..e8f06e49b3 100644 --- a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx +++ b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx @@ -81,7 +81,7 @@ export const GroupProfileCard = (props: { } const { - metadata: { name, description, annotations, links }, + metadata: { name, description, title, annotations, links }, spec: { profile }, } = group; @@ -99,7 +99,7 @@ export const GroupProfileCard = (props: { const entityMetadataEditUrl = group.metadata.annotations?.[ANNOTATION_EDIT_URL]; - const displayName = profile?.displayName ?? name; + const displayName = profile?.displayName ?? title ?? name; const emailHref = profile?.email ? `mailto:${profile.email}` : '#'; const infoCardAction = entityMetadataEditUrl ? ( { describe('applyConditions', () => { - let server: SetupServerApi; + let server: SetupServer; const mockConditions: PermissionCriteria = { not: { diff --git a/plugins/permission-common/CHANGELOG.md b/plugins/permission-common/CHANGELOG.md index e193c4f8e6..be9d35ef6a 100644 --- a/plugins/permission-common/CHANGELOG.md +++ b/plugins/permission-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-common +## 0.7.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.7.4-next.0 ### Patch Changes diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index 5b1abb5d94..8b8a6f60c0 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-common", "description": "Isomorphic types and client for Backstage permissions and authorization", - "version": "0.7.4-next.0", + "version": "0.7.4", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { @@ -46,7 +46,7 @@ "@backstage/types": "workspace:^", "cross-fetch": "^3.1.5", "uuid": "^8.0.0", - "zod": "~3.18.0" + "zod": "^3.21.4" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 59052c2184..3bd2cf06c4 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-permission-node +## 0.7.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + +## 0.7.6 + +### Patch Changes + +- 27a103ca07b: Changed the `createPermissionIntegrationRouter` API to allow `getResources`, `resourceType` and `rules` to be optional +- 37e9215c793: Update the service-to-service auth docs URL in error message. + `` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + ## 0.7.6-next.2 ### Patch Changes diff --git a/plugins/permission-node/api-report.md b/plugins/permission-node/api-report.md index f89ff0a8d5..b3d06efdc7 100644 --- a/plugins/permission-node/api-report.md +++ b/plugins/permission-node/api-report.md @@ -73,6 +73,11 @@ export type ConditionTransformer = ( conditions: PermissionCriteria, ) => PermissionCriteria; +// @public +export const createConditionAuthorizer: ( + rules: PermissionRule[], +) => (decision: PolicyDecision, resource: TResource | undefined) => boolean; + // @public export const createConditionExports: < TResourceType extends string, diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 92c0a7685a..23c24fe3cc 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-node", "description": "Common permission and authorization utilities for backend plugins", - "version": "0.7.6-next.2", + "version": "0.7.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -41,8 +41,8 @@ "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", - "zod": "~3.18.0", - "zod-to-json-schema": "~3.18.0" + "zod": "^3.21.4", + "zod-to-json-schema": "^3.20.4" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts index 1a7462665e..6e28c5ddc4 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts @@ -25,6 +25,7 @@ import { z } from 'zod'; import { createPermissionIntegrationRouter, CreatePermissionIntegrationRouterResourceOptions, + createConditionAuthorizer, } from './createPermissionIntegrationRouter'; import { createPermissionRule } from './createPermissionRule'; @@ -33,6 +34,9 @@ const testPermission: Permission = createPermission({ attributes: {}, }); +const mockTestRule1Apply = jest + .fn() + .mockImplementation((_resource: any, _params) => true); const testRule1 = createPermissionRule({ name: 'test-rule-1', description: 'Test rule 1', @@ -41,15 +45,18 @@ const testRule1 = createPermissionRule({ foo: z.string(), bar: z.number().describe('bar'), }), - apply: (_resource: any, _params) => true, + apply: mockTestRule1Apply, toQuery: _params => ({}), }); +const mockTestRule2Apply = jest + .fn() + .mockImplementation((_resource: any) => false); const testRule2 = createPermissionRule({ name: 'test-rule-2', description: 'Test rule 2', resourceType: 'test-resource', - apply: (_resource: any) => false, + apply: mockTestRule2Apply, toQuery: () => ({}), }); @@ -625,3 +632,72 @@ describe('createPermissionIntegrationRouter', () => { }); }); }); + +describe('createConditionAuthorizer', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should return true in case of allowed decision', () => { + const isAuthorized = createConditionAuthorizer([testRule1, testRule2]); + expect( + isAuthorized( + { + result: AuthorizeResult.ALLOW, + }, + {}, + ), + ).toBe(true); + + expect(mockTestRule1Apply).not.toHaveBeenCalled(); + expect(mockTestRule2Apply).not.toHaveBeenCalled(); + }); + it('should return false in case of denied decision', () => { + const isAuthorized = createConditionAuthorizer([testRule1, testRule2]); + expect( + isAuthorized( + { + result: AuthorizeResult.DENY, + }, + {}, + ), + ).toBe(false); + + expect(mockTestRule1Apply).not.toHaveBeenCalled(); + expect(mockTestRule2Apply).not.toHaveBeenCalled(); + }); + + it('should apply conditions to a resource in case of conditional decision', () => { + const isAuthorized = createConditionAuthorizer([testRule1, testRule2]); + expect( + isAuthorized( + { + pluginId: 'plugin', + resourceType: 'test-resource', + result: AuthorizeResult.CONDITIONAL, + conditions: { + allOf: [ + { + rule: 'test-rule-1', + resourceType: 'test-resource', + params: { + foo: 'a', + bar: 1, + }, + }, + { + rule: 'test-rule-2', + resourceType: 'test-resource', + params: {}, + }, + ], + }, + }, + {}, + ), + ).toBe(false); + + expect(mockTestRule1Apply).toHaveBeenCalledTimes(1); + expect(mockTestRule2Apply).toHaveBeenCalledTimes(1); + }); +}); diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts index 087de23198..850123d55e 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts @@ -27,6 +27,7 @@ import { Permission, PermissionCondition, PermissionCriteria, + PolicyDecision, } from '@backstage/plugin-permission-common'; import { PermissionRule } from '../types'; import { @@ -160,6 +161,30 @@ const applyConditions = ( return rule.apply(resource, criteria.params ?? {}); }; +/** + + * Takes some permission conditions and returns a definitive authorization result + * on the resource to which they apply. + * + * @public + */ +export const createConditionAuthorizer = ( + rules: PermissionRule[], +) => { + const getRule = createGetRule(rules); + + return ( + decision: PolicyDecision, + resource: TResource | undefined, + ): boolean => { + if (decision.result === AuthorizeResult.CONDITIONAL) { + return applyConditions(decision.conditions, resource, getRule); + } + + return decision.result === AuthorizeResult.ALLOW; + }; +}; + /** * Options for creating a permission integration router specific * for a particular resource type. diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index 31832e9a83..9da20a2875 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-permission-react +## 0.4.11 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + ## 0.4.11-next.2 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index 1d5d0713b7..afa4a4768e 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.11-next.2", + "version": "0.4.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index da2697188a..51e419f0fb 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-playlist-backend +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + - @backstage/plugin-playlist-common@0.1.5 + +## 0.2.6 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-playlist-common@0.1.5 + ## 0.2.6-next.2 ### Patch Changes diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 2d868b950a..054651b841 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.2.6-next.2", + "version": "0.2.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -39,7 +39,7 @@ "uuid": "^8.2.0", "winston": "^3.2.1", "yn": "^4.0.0", - "zod": "~3.18.0" + "zod": "^3.21.4" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/playlist-common/CHANGELOG.md b/plugins/playlist-common/CHANGELOG.md index 13e19e9204..15eebfc59b 100644 --- a/plugins/playlist-common/CHANGELOG.md +++ b/plugins/playlist-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-playlist-common +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 + ## 0.1.5-next.0 ### Patch Changes diff --git a/plugins/playlist-common/package.json b/plugins/playlist-common/package.json index 1bf0b8be27..440e46713d 100644 --- a/plugins/playlist-common/package.json +++ b/plugins/playlist-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-playlist-common", "description": "Common functionalities for the playlist plugin", - "version": "0.1.5-next.0", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist/CHANGELOG.md b/plugins/playlist/CHANGELOG.md index bc0263fd00..6e09f280bd 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-playlist +## 0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-playlist-common@0.1.5 + +## 0.1.7 + +### Patch Changes + +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 122a37a880e: Internal update to work with newer versions of react-router +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/theme@0.2.18 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-playlist-common@0.1.5 + ## 0.1.7-next.2 ### Patch Changes diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index 445171f9b8..4bf202bdba 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.7-next.2", + "version": "0.1.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,7 +40,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "lodash": "^4.17.21", "qs": "^6.9.4", "react-hook-form": "^7.13.0", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index 8b649c44de..58d68eceab 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-proxy-backend +## 0.2.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + +## 0.2.37 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 3e3eea4bc7e: The proxy-backend plugin now supports reviving request bodies that have previously been consumed by an express middleware (e.g. `express.json()`). This is done by setting `reviveConsumedRequestBodies: true` on the proxy `RouterOptions`. In order to preserve the current behavior, the proxy will **not** revive request bodies by default. + + The following is an example of a proxy `createRouter` invocation that revives request bodies: + + ```diff + const router = await createRouter({ + config, + logger, + discovery, + + reviveConsumedRequestBodies: true, + }); + ``` + +- 4acd93dae1d: Ensure that `@backstage/plugin-proxy-backend` logs the requests that it proxies when log level is set to `debug`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + ## 0.2.37-next.2 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index a7d320c37c..11caccbff3 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-proxy-backend", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", - "version": "0.2.37-next.2", + "version": "0.2.38-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md index edda54dcd1..f7f91fea98 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-rollbar-backend +## 0.1.41-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + +## 0.1.40 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + ## 0.1.40-next.2 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index 31d802dece..bec3819121 100644 --- a/plugins/rollbar-backend/package.json +++ b/plugins/rollbar-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar-backend", "description": "A Backstage backend plugin that integrates towards Rollbar", - "version": "0.1.40-next.2", + "version": "0.1.41-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md index 943db21cce..24e85c8e77 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-rollbar +## 0.4.17-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.4.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.4.16-next.2 ### Patch Changes diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index a3189c147d..4abd1b90f2 100644 --- a/plugins/rollbar/package.json +++ b/plugins/rollbar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar", "description": "A Backstage plugin that integrates towards Rollbar", - "version": "0.4.16-next.2", + "version": "0.4.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,7 +40,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "lodash": "^4.17.21", "react-sparklines": "^1.7.0", "react-use": "^17.2.4" diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/.eslintrc.js b/plugins/scaffolder-backend-module-confluence-to-markdown/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/README.md b/plugins/scaffolder-backend-module-confluence-to-markdown/README.md new file mode 100644 index 0000000000..d9b235d6c1 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/README.md @@ -0,0 +1,118 @@ +# @backstage/plugin-scaffolder-backend-module-confluence-to-markdown + +Welcome to the `confluence:transform:markdown` action for the `scaffolder-backend`. + +## Getting started + +You need to configure the action in your backend: + +## From your Backstage root directory + +```bash +# From your Backstage root directory +yarn add --cwd packages/backend @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +``` + +Configure the action: +(you can check the [docs](https://backstage.io/docs/features/software-templates/writing-custom-actions#registering-custom-actions) to see all options): + +```typescript +// packages/backend/src/plugins/scaffolder.ts + +import { createBuiltinActions } from '@backstage/plugin-scaffolder-backend'; +import { ScmIntegrations } from '@backstage/integration'; +import { createConfluenceToMarkdownAction } from '@backstage/plugin-scaffolder-backend-module-confluence-to-markdown'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const catalogClient = new CatalogClient({ discoveryApi: env.discovery }); + const integrations = ScmIntegrations.fromConfig(env.config); + + const builtInActions = createBuiltinActions({ + integrations, + catalogClient, + config: env.config, + reader: env.reader, + }); + + const actions = [ + ...builtInActions, + createConfluenceToMarkdownAction({ + integrations, + config: env.config, + reader: env.reader, + }), + ]; + + return createRouter({ + actions, + catalogClient: catalogClient, + logger: env.logger, + config: env.config, + database: env.database, + reader: env.reader, + }); +} +``` + +You will also need an access token for authorization with `Read` permissions. You can create a Personal Access Token (PAT) in confluence and add the PAT to your `app-config.yaml` + +```yaml +confluence: + baseUrl: ${CONFLUENCE_BASE_URL} + token: ${CONFLUENCE_TOKEN} +``` + +After that you can use the action in your template: + +```yaml +apiVersion: scaffolder.backstage.io/v1beta3 +kind: Template +metadata: + name: confluence-to-markdown + title: Confluence to Markdown + description: This template converts a single confluence document to Markdown for Techdocs and adds it to a given GitHub repo. + tags: + - do-not-use + - poc +spec: + owner: + type: service + parameters: + - title: Confluence and Github Repo Information + properties: + confluenceUrls: + type: array + description: Urls for confluence doc to be converted to markdown. In format /display// + items: + type: string + default: confluence url + ui:options: + addable: true + minItems: 1 + maxItems: 5 + repoUrl: + type: string + title: GitHub URL mkdocs.yaml link + description: The GitHub repo URL to your mkdocs.yaml file. Example + steps: + - id: create-docs + name: Get markdown file created and update markdown.yaml file + action: confluence:transform:markdown + input: + confluenceUrls: ${{ parameters.confluenceUrls }} + repoUrl: ${{ parameters.repoUrl }} + - id: publish + name: Publish PR to GitHub + action: publish:github:pull-request + input: + repoUrl: ?repo=${{ steps['create-docs'].output.repo }}&owner=${{ steps['create-docs'].output.owner }} + branchName: confluence-to-markdown + title: Confluence to Markdown + description: PR for converting confluence page to mkdocs +``` + +Replace `` with your GitHub URL without `https://`. + +You can find a list of all registered actions including their parameters at the /create/actions route in your Backstage application. diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md b/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md new file mode 100644 index 0000000000..398beb5059 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md @@ -0,0 +1,20 @@ +## API Report File for "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { Config } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { UrlReader } from '@backstage/backend-common'; + +// @public (undocumented) +export const createConfluenceToMarkdownAction: (options: { + reader: UrlReader; + integrations: ScmIntegrations; + config: Config; +}) => TemplateAction<{ + confluenceUrls: string[]; + repoUrl: string; +}>; +``` diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json new file mode 100644 index 0000000000..7ad5f127f6 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -0,0 +1,49 @@ +{ + "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", + "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", + "version": "0.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "backend-plugin-module" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "help": "backstage-cli help" + }, + "dependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/integration": "workspace:^", + "@backstage/plugin-scaffolder-backend": "workspace:^", + "@backstage/plugin-scaffolder-node": "workspace:^", + "@backstage/types": "workspace:^", + "fs-extra": "10.1.0", + "git-url-parse": "^13.1.0", + "node-fetch": "^2.6.7", + "node-html-markdown": "^1.3.0", + "yaml": "^2.0.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/test-utils": "workspace:^", + "mock-fs": "^5.2.0", + "msw": "^1.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts new file mode 100644 index 0000000000..b95d8ae520 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts @@ -0,0 +1,294 @@ +/* + * 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 { PassThrough } from 'stream'; +import { createConfluenceToMarkdownAction } from './confluenceToMarkdown'; +import { getVoidLogger } from '@backstage/backend-common'; +import { UrlReader } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { setupRequestMockHandlers } from '@backstage/test-utils'; +import mockFs from 'mock-fs'; +import os from 'os'; +import type { ActionContext } from '@backstage/plugin-scaffolder-node'; +import { readFile, writeFile, createWriteStream } from 'fs-extra'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; + +jest.mock('fs-extra', () => ({ + mkdirSync: jest.fn(), + readFile: jest.fn().mockResolvedValue('File contents'), + writeFile: jest.fn().mockImplementation(() => { + return Promise.resolve(); + }), + outputFile: jest.fn(), + openSync: jest.fn(), + createWriteStream: jest.fn().mockReturnValue(new PassThrough()), + ensureDir: jest.fn(), +})); + +describe('confluence:transform:markdown', () => { + const baseUrl = `https://nodomain.confluence.com`; + const worker = setupServer(); + setupRequestMockHandlers(worker); + + const config = new ConfigReader({ + confluence: { + baseUrl: baseUrl, + token: 'fake_token', + }, + }); + + const integrations = ScmIntegrations.fromConfig( + new ConfigReader({ + integrations: { + github: [{ host: 'github.com', token: 'token' }], + }, + }), + ); + + let reader: UrlReader; + let mockContext: ActionContext<{ + confluenceUrls: string[]; + repoUrl: string; + }>; + + const logger = getVoidLogger(); + jest.spyOn(logger, 'info'); + + const mockTmpDir = os.tmpdir(); + + beforeEach(() => { + reader = { + readUrl: jest.fn(), + readTree: jest.fn().mockResolvedValue({ + dir: jest.fn(), + }), + search: jest.fn(), + }; + mockContext = { + input: { + confluenceUrls: [ + 'https://nodomain.confluence.com/display/testing/mkdocs', + ], + repoUrl: 'https://notreal.github.com/space/backstage/mkdocs.yml', + }, + workspacePath: '/tmp', + logger, + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn().mockResolvedValue(mockTmpDir), + }; + mockFs({ [`${mockTmpDir}/src/docs`]: {} }); + }); + afterEach(() => { + jest.clearAllMocks(); + mockFs.restore(); + }); + + it('should call confluence to markdown action successfully with results array', async () => { + const options = { + reader, + integrations, + config, + }; + const responseBody = { + results: [ + { + id: '4444444', + type: 'page', + title: 'Testing', + body: { + export_view: { + value: '

hello world

', + }, + }, + }, + ], + }; + const responseBodyTwo = { + results: [ + { + id: '4444444', + type: 'attachment', + title: 'testing.pdf', + metadata: { + mediaType: 'application/pdf', + }, + _links: { + download: '/download/attachments/4444444/testing.pdf', + }, + }, + ], + }; + + worker.use( + rest.get(`${baseUrl}/rest/api/content`, (_, res, ctx) => + res(ctx.status(200, 'OK'), ctx.json(responseBody)), + ), + rest.get( + `${baseUrl}/rest/api/content/4444444/child/attachment`, + (_, res, ctx) => res(ctx.status(200, 'OK'), ctx.json(responseBodyTwo)), + ), + rest.get( + `${baseUrl}/download/attachments/4444444/testing.pdf`, + (_, res, ctx) => res(ctx.status(200, 'OK'), ctx.body('hello')), + ), + ); + + const action = createConfluenceToMarkdownAction(options); + + await action.handler(mockContext); + + expect(logger.info).toHaveBeenCalledWith( + `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/mkdocs.yml`, + ); + expect(logger.info).toHaveBeenCalledTimes(5); + expect(createWriteStream).toHaveBeenCalledTimes(1); + expect(readFile).toHaveBeenCalledTimes(1); + expect(writeFile).toHaveBeenCalledTimes(1); + }); + + it('should call confluence to markdown action successfully with empty results array', async () => { + const options = { + reader, + integrations, + config, + }; + const responseBody = { + results: [ + { + id: '4444444', + type: 'page', + title: 'Testing', + body: { + export_view: { + value: '

hello world

', + }, + }, + }, + ], + }; + const responseBodyTwo = { + results: [], + }; + + worker.use( + rest.get(`${baseUrl}/rest/api/content`, (_, res, ctx) => + res(ctx.status(200, 'OK'), ctx.json(responseBody)), + ), + rest.get( + `${baseUrl}/rest/api/content/4444444/child/attachment`, + (_, res, ctx) => res(ctx.status(200, 'OK'), ctx.json(responseBodyTwo)), + ), + ); + + const action = createConfluenceToMarkdownAction(options); + + await action.handler(mockContext); + + expect(logger.info).toHaveBeenCalledWith( + `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/mkdocs.yml`, + ); + expect(logger.info).toHaveBeenCalledTimes(5); + + expect(createWriteStream).not.toHaveBeenCalled(); + expect(readFile).toHaveBeenCalledTimes(1); + expect(writeFile).toHaveBeenCalledTimes(1); + }); + + it('shoud fail on the first fetch call with response.ok set to false', async () => { + const options = { + reader, + integrations, + config, + }; + const responseBody = {}; + + worker.use( + rest.get(`${baseUrl}/rest/api/content`, (_, res, ctx) => + res(ctx.status(401, 'nope'), ctx.json(responseBody)), + ), + ); + + const action = createConfluenceToMarkdownAction(options); + await expect(async () => { + await action.handler(mockContext); + }).rejects.toThrow('Request failed with 401 Error'); + }); + + it('should return nothing in results from the first api call and fail', async () => { + const options = { + reader, + integrations, + config, + }; + const responseBody = { + results: [], + }; + + worker.use( + rest.get(`${baseUrl}/rest/api/content`, (_, res, ctx) => + res(ctx.status(200, 'OK'), ctx.json(responseBody)), + ), + ); + + const action = createConfluenceToMarkdownAction(options); + await expect(async () => { + await action.handler(mockContext); + }).rejects.toThrow( + 'Could not find document https://nodomain.confluence.com/display/testing/mkdocs. Please check your input.', + ); + }); + + it('should fail on the second fetch call to confluence', async () => { + const options = { + reader, + integrations, + config, + }; + const responseBody = { + results: [ + { + id: '4444444', + type: 'page', + title: 'Testing', + body: { + export_view: { + value: '

hello world

', + }, + }, + }, + ], + }; + const responseBodyTwo = {}; + + worker.use( + rest.get(`${baseUrl}/rest/api/content`, (_, res, ctx) => + res(ctx.status(200, 'OK'), ctx.json(responseBody)), + ), + rest.get( + `${baseUrl}/rest/api/content/4444444/child/attachment`, + (_, res, ctx) => + res(ctx.status(404, 'nope'), ctx.json(responseBodyTwo)), + ), + ); + + const action = createConfluenceToMarkdownAction(options); + await expect(async () => { + await action.handler(mockContext); + }).rejects.toThrow('Request failed with 404 Error'); + }); +}); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts new file mode 100644 index 0000000000..655b1bbdb7 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts @@ -0,0 +1,182 @@ +/* + * 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 { Config } from '@backstage/config'; +import { UrlReader } from '@backstage/backend-common'; +import { ScmIntegrations } from '@backstage/integration'; +import { createFetchPlainAction } from '@backstage/plugin-scaffolder-backend'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { InputError, ConflictError } from '@backstage/errors'; +import { NodeHtmlMarkdown } from 'node-html-markdown'; +import fs from 'fs-extra'; +import parseGitUrl from 'git-url-parse'; +import YAML from 'yaml'; +import { + readFileAsString, + fetchConfluence, + getAndWriteAttachments, + createConfluenceVariables, +} from './helpers'; + +/** + * @public + */ + +export const createConfluenceToMarkdownAction = (options: { + reader: UrlReader; + integrations: ScmIntegrations; + config: Config; +}) => { + const { config, reader, integrations } = options; + const fetchPlainAction = createFetchPlainAction({ reader, integrations }); + type Obj = { + [key: string]: string; + }; + + return createTemplateAction<{ + confluenceUrls: string[]; + repoUrl: string; + }>({ + id: 'confluence:transform:markdown', + schema: { + input: { + properties: { + confluenceUrls: { + type: 'array', + title: 'Confluence URL', + description: + 'Paste your confluence url. Ensure it follows this format: https://{confluence+base+url}/display/{spacekey}/{page+title}', + items: { + type: 'string', + default: 'Confluence URL', + }, + }, + repoUrl: { + type: 'string', + title: 'GitHub Repo Url', + description: + 'mkdocs.yml file location inside the github repo you want to store the document', + }, + }, + }, + }, + async handler(ctx) { + const { confluenceUrls, repoUrl } = ctx.input; + const parsedRepoUrl = parseGitUrl(repoUrl); + const filePathToMkdocs = parsedRepoUrl.filepath.substring( + 0, + parsedRepoUrl.filepath.lastIndexOf('/') + 1, + ); + const dirPath = ctx.workspacePath; + let productArray: string[][] = []; + + ctx.logger.info(`Fetching the mkdocs.yml catalog from ${repoUrl}`); + + // This grabs the files from Github + const repoFileDir = `${dirPath}/${parsedRepoUrl.filepath}`; + await fetchPlainAction.handler({ + ...ctx, + input: { + url: `https://${parsedRepoUrl.resource}/${parsedRepoUrl.owner}/${parsedRepoUrl.name}`, + targetPath: dirPath, + }, + }); + + for (const url of confluenceUrls) { + const { spacekey, title, titleWithSpaces } = + await createConfluenceVariables(url); + // This calls confluence to get the page html and page id + const getConfluenceDoc = await fetchConfluence( + `/rest/api/content?title=${title}&spaceKey=${spacekey}&expand=body.export_view`, + config, + ); + if (getConfluenceDoc.results.length === 0) { + throw new InputError( + `Could not find document ${url}. Please check your input.`, + ); + } + // This gets attachements for the confluence page if they exist + const getDocAttachments = await fetchConfluence( + `/rest/api/content/${getConfluenceDoc.results[0].id}/child/attachment`, + config, + ); + + if (getDocAttachments.results.length) { + fs.mkdirSync(`${dirPath}/${filePathToMkdocs}docs/img`, { + recursive: true, + }); + productArray = await getAndWriteAttachments( + getDocAttachments, + dirPath, + config, + filePathToMkdocs, + ); + } + + ctx.logger.info( + `starting action for converting ${titleWithSpaces} from Confluence To Markdown`, + ); + + // This reads mkdocs.yml file + const mkdocsFileContent = await readFileAsString(repoFileDir); + const mkdocsFile = await YAML.parse(mkdocsFileContent); + ctx.logger.info( + `Adding new file - ${titleWithSpaces} to the current mkdocs.yml file`, + ); + + // This modifies the mkdocs.yml file + if (mkdocsFile !== undefined && mkdocsFile.hasOwnProperty('nav')) { + const { nav } = mkdocsFile; + if (!nav.some((i: Obj) => i.hasOwnProperty(titleWithSpaces))) { + nav.push({ + [titleWithSpaces]: `${titleWithSpaces.replace(/\s+/g, '-')}.md`, + }); + mkdocsFile.nav = nav; + } else { + throw new ConflictError( + 'This document looks to exist inside the GitHub repo. Will end the action.', + ); + } + } + + await fs.writeFile(repoFileDir, YAML.stringify(mkdocsFile)); + + // This grabs the confluence html and converts it to markdown and adds attachments + const html = getConfluenceDoc.results[0].body.export_view.value; + const markdownToPublish = NodeHtmlMarkdown.translate(html); + let newString: string = markdownToPublish; + productArray.forEach((product: string[]) => { + // This regex is looking for either [](link to confluence) or ![](link to confluence) in the newly created markdown doc and updating it to point to the versions saved(in ./docs/img) in the local version of GitHub Repo during getAndWriteAttachments + const regex = product[0].includes('.pdf') + ? new RegExp(`(\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi') + : new RegExp(`(\\!\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi'); + newString = newString.replace(regex, `$1./img/${product[1]}$3`); + }); + + ctx.logger.info(`Adding new file to repo.`); + await fs.outputFile( + `${dirPath}/${filePathToMkdocs}docs/${titleWithSpaces.replace( + /\s+/g, + '-', + )}.md`, + newString, + ); + } + + ctx.output('repo', parsedRepoUrl.name); + ctx.output('owner', parsedRepoUrl.owner); + }, + }); +}; diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts new file mode 100644 index 0000000000..58f84a8747 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts @@ -0,0 +1,128 @@ +/* + * 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 { Config } from '@backstage/config'; +import { ResponseError, ConflictError, InputError } from '@backstage/errors'; +import fs from 'fs-extra'; +import fetch, { Response } from 'node-fetch'; + +interface Links { + webui: string; + download: string; + thumbnail: string; + self: string; +} + +interface Metadata { + mediaType: string; +} + +export interface Result { + id: string; + type: string; + status: string; + title: string; + metadata: Metadata; + _links: Links; +} + +export interface Results { + results: Result[]; +} + +export const readFileAsString = async (fileDir: string) => { + const content = await fs.readFile(fileDir, 'utf-8'); + return content.toString(); +}; + +export const fetchConfluence = async (relativeUrl: string, config: Config) => { + const baseUrl = config.getString('confluence.baseUrl'); + const token = config.getString('confluence.token'); + const response: Response = await fetch(`${baseUrl}${relativeUrl}`, { + method: 'GET', + headers: { + Authorization: `Bearer ${token}`, + }, + }); + if (!response.ok) { + throw await ResponseError.fromResponse(response); + } + + return response.json(); +}; + +export const getAndWriteAttachments = async ( + arr: Results, + workspace: string, + config: Config, + mkdocsDir: string, +) => { + const productArr: string[][] = []; + const baseUrl = config.getString('confluence.baseUrl'); + const token = config.getString('confluence.token'); + await Promise.all( + await arr.results.map(async (result: Result) => { + const downloadLink = result._links.download; + const downloadTitle = result.title.replace(/ /g, '-'); + if (result.metadata.mediaType !== 'application/gliffy+json') { + productArr.push([result.title.replace(/ /g, '%20'), downloadTitle]); + } + + const res = await fetch(`${baseUrl}${downloadLink}`, { + method: 'GET', + headers: { + Authorization: `Bearer ${token}`, + }, + }); + if (!res.ok) { + throw ResponseError.fromResponse(res); + } else if (res.body !== null) { + fs.openSync(`${workspace}/${mkdocsDir}docs/img/${downloadTitle}`, 'w'); + const writeStream = fs.createWriteStream( + `${workspace}/${mkdocsDir}docs/img/${downloadTitle}`, + ); + res.body.pipe(writeStream); + await new Promise((resolve, reject) => { + writeStream.on('finish', () => { + resolve(`${workspace}/${mkdocsDir}docs/img/${downloadTitle}`); + }); + writeStream.on('error', reject); + }); + } else { + throw new ConflictError( + 'No Body on the response. Can not save images from Confluence Doc', + ); + } + }), + ); + return productArr; +}; + +export const createConfluenceVariables = async (url: string) => { + let spacekey: string | undefined = undefined; + let title: string | undefined = undefined; + let titleWithSpaces: string | undefined = ''; + const params = new URL(url); + if (params.pathname.split('/')[1] === 'display') { + spacekey = params.pathname.split('/')[2]; + title = params.pathname.split('/')[3]; + titleWithSpaces = title?.replace(/\+/g, ' '); + return { spacekey, title, titleWithSpaces }; + } + throw new InputError( + 'The Url format for Confluence is incorrect. Acceptable format is `/display//`', + ); +}; diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/index.ts new file mode 100644 index 0000000000..00f00eabda --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { createConfluenceToMarkdownAction } from './confluenceToMarkdown'; diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/index.ts new file mode 100644 index 0000000000..3d3a6c73a0 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './confluence'; diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/index.ts new file mode 100644 index 0000000000..80d2e35cb3 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/index.ts @@ -0,0 +1,23 @@ +/* + * 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. + */ + +/** + * The confluence-to-markdown module for \@backstage/plugin-scaffolder-backend. + * + * @packageDocumentation + */ + +export * from './actions'; diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 2dcb0eb279..b03b35dc72 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.1-next.0 + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.2.18 + +### Patch Changes + +- 62414770ead: allow container runner to be undefined in cookiecutter plugin +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + ## 0.2.18-next.2 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 373320191a..c78cdae972 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", - "version": "0.2.18-next.2", + "version": "0.2.19-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-gitlab/.eslintrc.js b/plugins/scaffolder-backend-module-gitlab/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md new file mode 100644 index 0000000000..9bd33f6aae --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -0,0 +1,15 @@ +# @backstage/plugin-scaffolder-backend-module-gitlab + +## 0.1.0-next.0 + +### Minor Changes + +- 1ad400bb2de: Add Gitlab Scaffolder Plugin + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/errors@1.1.5 diff --git a/plugins/scaffolder-backend-module-gitlab/README.md b/plugins/scaffolder-backend-module-gitlab/README.md new file mode 100644 index 0000000000..35353cf9c1 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/README.md @@ -0,0 +1,162 @@ +# scaffolder-backend-module-gitlab + +Welcome to the Gitlab Module for Scaffolder. + +Here you can find all Gitlab related features to improve your scaffolder: + +## Getting started + +## From your Backstage root directory + +```bash +# From your Backstage root directory +yarn add --cwd packages/backend @backstage/plugin-scaffolder-backend-module-gitlab +``` + +Configure the action: +(you can check the [docs](https://backstage.io/docs/features/software-templates/writing-custom-actions#registering-custom-actions) to see all options): + +```typescript +// packages/backend/src/plugins/scaffolder.ts + +import { + createGitlabProjectAccessTokenAction, + createGitlabProjectAccessTokenAction, + createGitlabProjectDeployTokenAction, +} from '@backstage/plugin-scaffolder-backend-module-gitlab'; + +// Create BuiltIn Actions +const builtInActions = createBuiltinActions({ + integrations, + catalogClient, + config: env.config, + reader: env.reader, +}); + +// Add Gitlab Actions +const actions = [ + ...builtInActions, + createGitlabProjectAccessTokenAction({ + integrations: integrations, + }), + createGitlabProjectAccessTokenAction({ + integrations: integrations, + }), + createGitlabProjectDeployTokenAction({ + integrations: integrations, + }), +]; + +// Create Scaffolder Router +return await createRouter({ + containerRunner, + catalogClient, + actions, + logger: env.logger, + config: env.config, + database: env.database, + reader: env.reader, +}); +``` + +After that you can use the action in your template: + +```yaml +apiVersion: scaffolder.backstage.io/v1beta3 +kind: Template +metadata: + name: gitlab-demo + title: Gitlab DEMO + description: Scaffolder Gitlab Demo +spec: + owner: backstage/techdocs-core + type: service + + parameters: + - title: Fill in some steps + required: + - name + properties: + name: + title: Name + type: string + description: Unique name of the component + ui:autofocus: true + ui:options: + rows: 5 + - title: Choose a location + required: + - repoUrl + properties: + repoUrl: + title: Repository Location + type: string + ui:field: RepoUrlPicker + ui:options: + allowedHosts: + - gitlab.com + + steps: + - id: fetch + name: Fetch + action: fetch:template + input: + url: https://github.com/TEMPLATE + values: + name: ${{ parameters.name }} + + - id: publish + name: Publish + action: publish:gitlab + input: + description: This is ${{ parameters.name }} + repoUrl: ${{ parameters.repoUrl }} + sourcePath: pimcore + defaultBranch: main + + - id: gitlab-deploy-token + name: Create Deploy Token + action: gitlab:projectDeployToken:create + input: + repoUrl: ${{ parameters.repoUrl }} + projectId: "${{ steps['publish'].output.projectId }}" + name: ${{ parameters.name }}-secret + username: ${{ parameters.name }}-secret + scopes: ['read_registry'] + + - id: gitlab-access-token + name: Gitlab Project Access Token + action: gitlab:projectAccessToken:create + input: + repoUrl: ${{ parameters.repoUrl }} + projectId: "${{ steps['publish-manifest'].output.projectId }}" + name: ${{ parameters.name }}-access-token + accessLevel: 40 + scopes: ['read_repository', 'write_repository'] + + - id: gitlab-project-variable + name: Gitlab Project Variable + action: gitlab:projectVariable:create + input: + repoUrl: ${{ parameters.repoUrl }} + projectId: "${{ steps['publish'].output.projectId }}" + key: 'VARIABLE_NAME' + value: "${{ steps['gitlab-access-token'].output.access_token }}" + variableType: 'env_var' + masked: true + variableProtected: false + raw: false + environmentScope: '*' + + - id: register + name: Register + action: catalog:register + input: + repoContentsUrl: ${{ steps['publish'].output.repoContentsUrl }} + catalogInfoPath: '/catalog-info.yaml' + + output: + links: + - title: Repository + url: ${{ steps['publish'].output.remoteUrl }} +``` diff --git a/plugins/scaffolder-backend-module-gitlab/api-report.md b/plugins/scaffolder-backend-module-gitlab/api-report.md new file mode 100644 index 0000000000..6db732fdcc --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/api-report.md @@ -0,0 +1,48 @@ +## API Report File for "@backstage/plugin-scaffolder-backend-module-gitlab" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; + +// @public +export const createGitlabProjectAccessTokenAction: (options: { + integrations: ScmIntegrationRegistry; +}) => TemplateAction<{ + repoUrl: string; + projectId: string | number; + name: string; + accessLevel: number; + scopes: string[]; + token?: string | undefined; +}>; + +// @public +export const createGitlabProjectDeployTokenAction: (options: { + integrations: ScmIntegrationRegistry; +}) => TemplateAction<{ + repoUrl: string; + projectId: string | number; + name: string; + username: string; + scopes: string[]; + token?: string | undefined; +}>; + +// @public +export const createGitlabProjectVariableAction: (options: { + integrations: ScmIntegrationRegistry; +}) => TemplateAction<{ + repoUrl: string; + projectId: string | number; + key: string; + value: string; + variableType: string; + variableProtected: boolean; + masked: boolean; + raw: boolean; + environmentScope: string; + token?: string | undefined; +}>; +``` diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json new file mode 100644 index 0000000000..e870ba57a0 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -0,0 +1,48 @@ +{ + "name": "@backstage/plugin-scaffolder-backend-module-gitlab", + "version": "0.1.0-next.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "backend-plugin-module" + }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/scaffolder-backend-module-gitlab" + }, + "keywords": [ + "backstage" + ], + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/config": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/integration": "workspace:^", + "@backstage/plugin-scaffolder-node": "workspace:^", + "@gitbeaker/node": "^35.8.0" + }, + "devDependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/cli": "workspace:^", + "@backstage/core-app-api": "workspace:^" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectAccessTokenAction.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectAccessTokenAction.ts new file mode 100644 index 0000000000..0f39e3bc33 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectAccessTokenAction.ts @@ -0,0 +1,112 @@ +/* + * 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 { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { getToken } from '../util'; + +/** + * Creates a `gitlab:create-project-access-token` Scaffolder action. + * + * @param options - Templating configuration. + * @public + */ +export const createGitlabProjectAccessTokenAction = (options: { + integrations: ScmIntegrationRegistry; +}) => { + const { integrations } = options; + return createTemplateAction<{ + repoUrl: string; + projectId: string | number; + name: string; + accessLevel: number; + scopes: string[]; + token?: string; + }>({ + id: 'gitlab:projectAccessToken:create', + schema: { + input: { + required: ['projectId', 'repoUrl'], + type: 'object', + properties: { + repoUrl: { + title: 'Repository Location', + type: 'string', + }, + projectId: { + title: 'Project ID', + type: ['string', 'number'], + }, + name: { + title: 'Deploy Token Name', + type: 'string', + }, + accessLevel: { + title: 'Access Level of the Token', + type: 'number', + }, + scopes: { + title: 'Scopes', + type: 'array', + }, + token: { + title: 'Authentication Token', + type: 'string', + description: 'The token to use for authorization to GitLab', + }, + }, + }, + output: { + type: 'object', + properties: { + access_token: { + title: 'Access Token', + type: 'string', + }, + }, + }, + }, + async handler(ctx) { + ctx.logger.info(`Creating Token for Project "${ctx.input.projectId}"`); + const { repoUrl, projectId, name, accessLevel, scopes } = ctx.input; + const { token, integrationConfig } = getToken( + repoUrl, + ctx.input.token, + integrations, + ); + + const response = await fetch( + `${integrationConfig.config.baseUrl}/api/v4/projects/${projectId}/access_tokens`, + { + method: 'POST', // *GET, POST, PUT, DELETE, etc. + headers: { + 'PRIVATE-TOKEN': token, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + name: name, + scopes: scopes, + access_level: accessLevel, + }), + }, + ); + + const result = await response.json(); + + ctx.output('access_token', result.token); + }, + }); +}; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectDeployTokenAction.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectDeployTokenAction.test.ts new file mode 100644 index 0000000000..1d3ae804c1 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectDeployTokenAction.test.ts @@ -0,0 +1,101 @@ +/* + * 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 { createGitlabProjectDeployTokenAction } from './createGitlabProjectDeployTokenAction'; +import { ScmIntegrations } from '@backstage/integration'; +import { ConfigReader } from '@backstage/config'; +import { getVoidLogger } from '@backstage/backend-common'; +import { PassThrough } from 'stream'; + +const mockGitlabClient = { + ProjectDeployTokens: { + add: jest.fn(), + }, +}; +jest.mock('@gitbeaker/node', () => ({ + Gitlab: class { + constructor() { + return mockGitlabClient; + } + }, +})); + +describe('gitlab:create-deploy-token', () => { + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'gitlab.com', + token: 'tokenlols', + apiBaseUrl: 'https://api.gitlab.com', + }, + { + host: 'hosted.gitlab.com', + apiBaseUrl: 'https://api.hosted.gitlab.com', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + const action = createGitlabProjectDeployTokenAction({ integrations }); + const mockContext = { + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: '123', + name: 'tokenname', + username: 'tokenuser', + scopes: ['read_repository'], + }, + workspacePath: 'lol', + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should work when there is a token provided through ctx.input', async () => { + mockGitlabClient.ProjectDeployTokens.add.mockResolvedValue({ + token: 'TOKEN', + username: 'User', + }); + + await action.handler({ + ...mockContext, + input: { + repoUrl: 'hosted.gitlab.com?repo=bob&owner=owner', + projectId: '123', + name: 'tokenname', + username: 'tokenuser', + scopes: ['read_repository'], + }, + }); + + expect(mockGitlabClient.ProjectDeployTokens.add).toHaveBeenCalledWith( + '123', + 'tokenname', + ['read_repository'], + { username: 'tokenuser' }, + ); + + expect(mockContext.output).toHaveBeenCalledWith('deploy_token', 'TOKEN'); + expect(mockContext.output).toHaveBeenCalledWith('user', 'User'); + }); +}); diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectDeployTokenAction.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectDeployTokenAction.ts new file mode 100644 index 0000000000..35a53c87e2 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectDeployTokenAction.ts @@ -0,0 +1,120 @@ +/* + * 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 { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { Gitlab } from '@gitbeaker/node'; +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { DeployTokenScope } from '@gitbeaker/core/dist/types/templates/ResourceDeployTokens'; +import { getToken } from '../util'; +import { InputError } from '@backstage/errors'; + +/** + * Creates a `gitlab:create-project-deploy-token` Scaffolder action. + * + * @param options - Templating configuration. + * @public + */ +export const createGitlabProjectDeployTokenAction = (options: { + integrations: ScmIntegrationRegistry; +}) => { + const { integrations } = options; + return createTemplateAction<{ + repoUrl: string; + projectId: string | number; + name: string; + username: string; + scopes: string[]; + token?: string; + }>({ + id: 'gitlab:projectDeployToken:create', + schema: { + input: { + required: ['projectId', 'repoUrl'], + type: 'object', + properties: { + repoUrl: { + title: 'Repository Location', + type: 'string', + }, + projectId: { + title: 'Project ID', + type: ['string', 'number'], + }, + name: { + title: 'Deploy Token Name', + type: 'string', + }, + username: { + title: 'Deploy Token Username', + type: 'string', + }, + scopes: { + title: 'Scopes', + type: 'array', + }, + token: { + title: 'Authentication Token', + type: 'string', + description: 'The token to use for authorization to GitLab', + }, + }, + }, + output: { + type: 'object', + properties: { + deploy_token: { + title: 'Deploy Token', + type: 'string', + }, + user: { + title: 'User', + type: 'string', + }, + }, + }, + }, + async handler(ctx) { + ctx.logger.info(`Creating Token for Project "${ctx.input.projectId}"`); + const { repoUrl, projectId, name, username, scopes } = ctx.input; + const { token, integrationConfig } = getToken( + repoUrl, + ctx.input.token, + integrations, + ); + + const api = new Gitlab({ + host: integrationConfig.config.baseUrl, + token: token, + }); + + const deployToken = await api.ProjectDeployTokens.add( + projectId, + name, + scopes as DeployTokenScope[], + { + username: username, + }, + ); + + if (!deployToken.hasOwnProperty('token')) { + throw new InputError(`No deploy_token given from gitlab instance`); + } + + ctx.output('deploy_token', deployToken.token as string); + ctx.output('user', deployToken.username); + }, + }); +}; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.ts new file mode 100644 index 0000000000..847bbc2057 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.ts @@ -0,0 +1,139 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { getToken } from '../util'; +import { Gitlab } from '@gitbeaker/node'; + +/** + * Creates a `gitlab:create-project-variable` Scaffolder action. + * + * @param options - Templating configuration. + * @public + */ +export const createGitlabProjectVariableAction = (options: { + integrations: ScmIntegrationRegistry; +}) => { + const { integrations } = options; + return createTemplateAction<{ + repoUrl: string; + projectId: string | number; + key: string; + value: string; + variableType: string; + variableProtected: boolean; + masked: boolean; + raw: boolean; + environmentScope: string; + token?: string; + }>({ + id: 'gitlab:projectVariable:create', + schema: { + input: { + required: [ + 'repoUrl', + 'projectId', + 'key', + 'value', + 'variableType', + 'variableProtected', + 'masked', + 'raw', + 'environmentScope', + ], + type: 'object', + properties: { + repoUrl: { + title: 'Repository Location', + type: 'string', + }, + projectId: { + title: 'Project ID', + type: ['string', 'number'], + }, + key: { + title: + 'The key of a variable; must have no more than 255 characters; only A-Z, a-z, 0-9, and _ are allowed', + type: 'string', + }, + value: { + title: 'The value of a variable', + type: 'string', + }, + variableType: { + title: 'Variable Type (env_var or file)', + type: 'string', + }, + variableProtected: { + title: 'Whether the variable is protected. Default: false', + type: 'boolean', + }, + masked: { + title: 'Whether the variable is masked. Default: false', + type: 'boolean', + }, + raw: { + title: 'Whether the variable is expandable. Default: false', + type: 'boolean', + }, + environmentScope: { + title: 'The environment_scope of the variable. Default: *', + type: 'string', + }, + token: { + title: 'Authentication Token', + type: 'string', + description: 'The token to use for authorization to GitLab', + }, + }, + }, + }, + async handler(ctx) { + const { + repoUrl, + projectId, + key, + value, + variableType, + variableProtected, + masked, + raw, + environmentScope, + } = ctx.input; + const { token, integrationConfig } = getToken( + repoUrl, + ctx.input.token, + integrations, + ); + + const api = new Gitlab({ + host: integrationConfig.config.baseUrl, + token: token, + }); + + await api.ProjectVariables.create(projectId, { + key: key, + value: value, + variable_type: variableType, + protected: variableProtected, + masked: masked, + raw: raw, + environment_scope: environmentScope, + }); + }, + }); +}; diff --git a/plugins/scaffolder-backend-module-gitlab/src/index.ts b/plugins/scaffolder-backend-module-gitlab/src/index.ts new file mode 100644 index 0000000000..11209e19bd --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/index.ts @@ -0,0 +1,24 @@ +/* + * 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. + */ +/** + * A module for the scaffolder backend that lets you create gitlab project access tokens or deploy tokens + * + * @packageDocumentation + */ + +export * from './actions/createGitlabProjectDeployTokenAction'; +export * from './actions/createGitlabProjectAccessTokenAction'; +export * from './actions/createGitlabProjectVariableAction'; diff --git a/plugins/scaffolder-backend-module-gitlab/src/util.ts b/plugins/scaffolder-backend-module-gitlab/src/util.ts new file mode 100644 index 0000000000..fc6667d6d3 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/util.ts @@ -0,0 +1,57 @@ +/* + * 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 { InputError } from '@backstage/errors'; +import { + GitLabIntegration, + ScmIntegrationRegistry, +} from '@backstage/integration'; + +export const parseRepoHost = (repoUrl: string): string => { + let parsed; + try { + parsed = new URL(`https://${repoUrl}`); + } catch (error) { + throw new InputError( + `Invalid repo URL passed to publisher, got ${repoUrl}, ${error}`, + ); + } + return parsed.host; +}; + +export const getToken = ( + repoUrl: string, + inputToken: string | null | undefined, + integrations: ScmIntegrationRegistry, +): { token: string; integrationConfig: GitLabIntegration } => { + const host = parseRepoHost(repoUrl); + const integrationConfig = integrations.gitlab.byHost(host); + + if (!integrationConfig) { + throw new InputError( + `No matching integration configuration for host ${host}, please check your integrations config`, + ); + } + + const token = inputToken || integrationConfig.config.token!; + const tokenType = inputToken ? 'oauthToken' : 'token'; + + if (tokenType === 'oauthToken') { + throw new InputError(`OAuth Token is currently not supported`); + } + + return { token: token, integrationConfig: integrationConfig }; +}; diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index 5c7fb1dc2d..bd3509dbd0 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.1-next.0 + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.4.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + ## 0.4.11-next.2 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index be9d053340..aa1a178d9d 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", "description": "A module for the scaffolder backend that lets you template projects using Rails", - "version": "0.4.11-next.2", + "version": "0.4.12-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index ae6d8734c9..67772961ab 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/plugin-scaffolder-node@0.1.1 + ## 0.1.3-next.2 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 36f5139b28..6f04036110 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.1.3-next.2", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index e87cf64167..2948bbc79b 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.2.16 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + ## 0.2.16-next.2 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 01ba3f5eea..50db3c38d0 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.2.16-next.2", + "version": "0.2.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 65a827797f..89bfc23549 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,60 @@ # @backstage/plugin-scaffolder-backend +## 1.12.1-next.0 + +### Patch Changes + +- e23abb37ec1: Rename output parameter `mergeRequestURL` of `publish:gitlab:merge-request` action to `mergeRequestUrl`. +- e27ddc36dad: Added a possibility to cancel the running task (executing of a scaffolder template) +- c9a0fdcd2c8: Fix deprecated types. +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.0 + - @backstage/plugin-scaffolder-common@1.2.7-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @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-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-catalog-node@1.3.5-next.0 + +## 1.12.0 + +### Minor Changes + +- 7d724d8ef56: Added the ability to be able to define an actions `input` and `output` schema using `zod` instead of hand writing types and `jsonschema` + +### Patch Changes + +- 860de10fa67: Make identity valid if subject of token is a backstage server-2-server auth token +- 65454876fb2: Minor API report tweaks +- c6c78b4acbe: throw error from catalog:fetch scaffolder action when entity is null and optional is false +- 9968f455921: catalog write action should allow any shape of object +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 7af12854970: Extended scaffolder action `catalog:fetch` to fetch multiple catalog entities by entity references. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @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 + - @backstage/plugin-scaffolder-common@1.2.6 + - @backstage/plugin-scaffolder-node@0.1.1 + ## 1.12.0-next.2 ### Patch Changes diff --git a/plugins/scaffolder-backend/alpha-api-report.md b/plugins/scaffolder-backend/alpha-api-report.md index 3199444c6b..2ecd2cc800 100644 --- a/plugins/scaffolder-backend/alpha-api-report.md +++ b/plugins/scaffolder-backend/alpha-api-report.md @@ -4,14 +4,43 @@ ```ts import { BackendFeature } from '@backstage/backend-plugin-api'; +import { ConditionalPolicyDecision } from '@backstage/plugin-permission-common'; +import { Conditions } from '@backstage/plugin-permission-node'; +import { PermissionCondition } from '@backstage/plugin-permission-common'; +import { PermissionCriteria } from '@backstage/plugin-permission-common'; +import { PermissionRule } from '@backstage/plugin-permission-node'; +import { PermissionRuleParams } from '@backstage/plugin-permission-common'; +import { ResourcePermission } from '@backstage/plugin-permission-common'; import { TaskBroker } from '@backstage/plugin-scaffolder-backend'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { TemplateEntityStepV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateFilter } from '@backstage/plugin-scaffolder-backend'; import { TemplateGlobal } from '@backstage/plugin-scaffolder-backend'; +import { TemplateParametersV1beta3 } from '@backstage/plugin-scaffolder-common'; // @alpha export const catalogModuleTemplateKind: () => BackendFeature; +// @alpha +export const createScaffolderConditionalDecision: ( + permission: ResourcePermission<'scaffolder-template'>, + conditions: PermissionCriteria< + PermissionCondition<'scaffolder-template', PermissionRuleParams> + >, +) => ConditionalPolicyDecision; + +// @alpha +export const scaffolderConditions: Conditions<{ + hasTag: PermissionRule< + TemplateParametersV1beta3 | TemplateEntityStepV1beta3, + {}, + 'scaffolder-template', + { + tag: string; + } + >; +}>; + // @alpha export const scaffolderPlugin: ( options: ScaffolderPluginOptions, diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index ca9b3543af..a50bb7a515 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -7,23 +7,29 @@ import { ActionContext as ActionContext_2 } from '@backstage/plugin-scaffolder-node'; import { CatalogApi } from '@backstage/catalog-client'; -import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; import { createPullRequest } from 'octokit-plugin-create-pull-request'; +import { Duration } from 'luxon'; import { Entity } from '@backstage/catalog-model'; import express from 'express'; import { GithubCredentialsProvider } from '@backstage/integration'; +import { HumanDuration } from '@backstage/types'; import { IdentityApi } from '@backstage/plugin-auth-node'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { Knex } from 'knex'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import { Observable } from '@backstage/types'; import { Octokit } from 'octokit'; +import { PermissionEvaluator } from '@backstage/plugin-permission-common'; +import { PermissionRule } from '@backstage/plugin-permission-node'; +import { PermissionRuleParams } from '@backstage/plugin-permission-common'; import { PluginDatabaseManager } from '@backstage/backend-common'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; +import { RESOURCE_TYPE_SCAFFOLDER_TEMPLATE } from '@backstage/plugin-scaffolder-common/alpha'; import { Schema } from 'jsonschema'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { ScmIntegrations } from '@backstage/integration'; @@ -33,6 +39,8 @@ import { TaskSpec } from '@backstage/plugin-scaffolder-common'; import { TaskSpecV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateAction as TemplateAction_2 } from '@backstage/plugin-scaffolder-node'; import { TemplateActionOptions } from '@backstage/plugin-scaffolder-node'; +import { TemplateEntityStepV1beta3 } from '@backstage/plugin-scaffolder-common'; +import { TemplateParametersV1beta3 } from '@backstage/plugin-scaffolder-common'; import { UrlReader } from '@backstage/backend-common'; import { Writable } from 'stream'; import { ZodType } from 'zod'; @@ -75,8 +83,10 @@ export function createCatalogRegisterAction(options: { // @public export function createCatalogWriteAction(): TemplateAction_2<{ + entity: {} & { + [k: string]: unknown; + }; filePath?: string | undefined; - entity: {}; }>; // @public @@ -89,7 +99,8 @@ export function createDebugLogAction(): TemplateAction_2<{ export function createFetchCatalogEntityAction(options: { catalogClient: CatalogApi; }): TemplateAction_2<{ - entityRef: string; + entityRef?: string | undefined; + entityRefs?: string[] | undefined; optional?: boolean | undefined; }>; @@ -102,6 +113,15 @@ export function createFetchPlainAction(options: { targetPath?: string | undefined; }>; +// @public +export function createFetchPlainFileAction(options: { + reader: UrlReader; + integrations: ScmIntegrations; +}): TemplateAction_2<{ + url: string; + targetPath: string; +}>; + // @public export function createFetchTemplateAction(options: { reader: UrlReader; @@ -527,6 +547,11 @@ export const createTemplateAction: < action: TemplateActionOptions, ) => TemplateAction_2; +// @public +export function createWaitAction(options?: { + maxWaitTime?: Duration | HumanDuration; +}): TemplateAction_2; + // @public export type CreateWorkerOptions = { taskBroker: TaskBroker; @@ -549,6 +574,14 @@ export interface CurrentClaimedTask { // @public export class DatabaseTaskStore implements TaskStore { + // (undocumented) + cancelTask( + options: TaskStoreEmitOptions< + { + message: string; + } & JsonObject + >, + ): Promise; // (undocumented) claimTask(): Promise; // (undocumented) @@ -640,6 +673,10 @@ export interface RouterOptions { // (undocumented) logger: Logger; // (undocumented) + permissionApi?: PermissionEvaluator; + // (undocumented) + permissionRules?: TemplatePermissionRuleInput[]; + // (undocumented) reader: UrlReader; // (undocumented) scheduler?: PluginTaskScheduler; @@ -693,6 +730,8 @@ export type SerializedTaskEvent = { // @public export interface TaskBroker { + // (undocumented) + cancel?(taskId: string): Promise; // (undocumented) claim(): Promise; // (undocumented) @@ -730,6 +769,8 @@ export type TaskCompletionState = 'failed' | 'completed'; // @public export interface TaskContext { + // (undocumented) + cancelSignal: AbortSignal; // (undocumented) complete(result: TaskCompletionState, metadata?: JsonObject): Promise; // (undocumented) @@ -749,16 +790,19 @@ export interface TaskContext { } // @public -export type TaskEventType = 'completion' | 'log'; +export type TaskEventType = 'completion' | 'log' | 'cancelled'; // @public export class TaskManager implements TaskContext { + // (undocumented) + get cancelSignal(): AbortSignal; // (undocumented) complete(result: TaskCompletionState, metadata?: JsonObject): Promise; // (undocumented) static create( task: CurrentClaimedTask, storage: TaskStore, + abortSignal: AbortSignal, logger: Logger, ): TaskManager; // (undocumented) @@ -780,14 +824,16 @@ export type TaskSecrets = TaskSecrets_2; // @public export type TaskStatus = - | 'open' - | 'processing' - | 'failed' | 'cancelled' - | 'completed'; + | 'completed' + | 'failed' + | 'open' + | 'processing'; // @public export interface TaskStore { + // (undocumented) + cancelTask?(options: TaskStoreEmitOptions): Promise; // (undocumented) claimTask(): Promise; // (undocumented) @@ -886,4 +932,14 @@ export type TemplateFilter = (...args: JsonValue[]) => JsonValue | undefined; export type TemplateGlobal = | ((...args: JsonValue[]) => JsonValue | undefined) | JsonValue; + +// @public (undocumented) +export type TemplatePermissionRuleInput< + TParams extends PermissionRuleParams = PermissionRuleParams, +> = PermissionRule< + TemplateEntityStepV1beta3 | TemplateParametersV1beta3, + {}, + typeof RESOURCE_TYPE_SCAFFOLDER_TEMPLATE, + TParams +>; ``` diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 03f813b036..d8d7347d6c 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "1.12.0-next.2", + "version": "1.12.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -56,7 +56,10 @@ "@backstage/integration": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", + "@backstage/plugin-permission-node": "workspace:^", "@backstage/plugin-scaffolder-common": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^", "@backstage/types": "workspace:^", @@ -64,6 +67,7 @@ "@gitbeaker/node": "^35.1.0", "@octokit/webhooks": "^10.0.0", "@types/express": "^4.17.6", + "@types/luxon": "^3.0.0", "azure-devops-node-api": "^11.0.1", "command-exists": "^1.2.9", "compression": "^1.7.4", @@ -92,7 +96,7 @@ "winston": "^3.2.1", "yaml": "^2.0.0", "zen-observable": "^0.10.0", - "zod": "~3.18.0" + "zod": "^3.21.4" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", @@ -109,6 +113,7 @@ "mock-fs": "^5.1.0", "msw": "^1.0.0", "supertest": "^6.1.3", + "wait-for-expect": "^3.0.2", "yaml": "^2.0.0" }, "files": [ diff --git a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts index 182bb60223..97abf41828 100644 --- a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts +++ b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts @@ -94,6 +94,7 @@ export const scaffolderPlugin = createBackendPlugin( database, httpRouter, catalogClient, + permissions, }) { const { additionalTemplateFilters, @@ -131,6 +132,7 @@ export const scaffolderPlugin = createBackendPlugin( taskWorkers, additionalTemplateFilters, additionalTemplateGlobals, + permissionApi: permissions, }); httpRouter.use(router); }, diff --git a/plugins/scaffolder-backend/src/alpha.ts b/plugins/scaffolder-backend/src/alpha.ts index ac96f081ad..713f2569aa 100644 --- a/plugins/scaffolder-backend/src/alpha.ts +++ b/plugins/scaffolder-backend/src/alpha.ts @@ -15,5 +15,6 @@ */ export * from './modules'; +export * from './service'; export { scaffolderPlugin } from './ScaffolderPlugin'; export type { ScaffolderPluginOptions } from './ScaffolderPlugin'; diff --git a/plugins/scaffolder-backend/src/processor/ScaffolderEntitiesProcessor.ts b/plugins/scaffolder-backend/src/processor/ScaffolderEntitiesProcessor.ts index d095b77b4c..1de381a8ff 100644 --- a/plugins/scaffolder-backend/src/processor/ScaffolderEntitiesProcessor.ts +++ b/plugins/scaffolder-backend/src/processor/ScaffolderEntitiesProcessor.ts @@ -24,9 +24,9 @@ import { import { CatalogProcessor, CatalogProcessorEmit, - LocationSpec, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { TemplateEntityV1beta3, templateEntityV1beta3Validator, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts index 52c76c8769..1cce7d66cb 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts @@ -23,8 +23,11 @@ import { createFetchCatalogEntityAction } from './fetch'; describe('catalog:fetch', () => { const getEntityByRef = jest.fn(); + const getEntitiesByRefs = jest.fn(); + const catalogClient = { getEntityByRef: getEntityByRef, + getEntitiesByRefs: getEntitiesByRefs, }; const action = createFetchCatalogEntityAction({ @@ -71,25 +74,6 @@ describe('catalog:fetch', () => { }); }); - it('should return null if entity not in catalog and optional is true', async () => { - getEntityByRef.mockImplementationOnce(() => { - throw new Error('Not found'); - }); - - await action.handler({ - ...mockContext, - input: { - entityRef: 'component:default/test', - optional: true, - }, - }); - - expect(getEntityByRef).toHaveBeenCalledWith('component:default/test', { - token: 'secret', - }); - expect(mockContext.output).toHaveBeenCalledWith('entity', null); - }); - it('should throw error if entity fetch fails from catalog and optional is false', async () => { getEntityByRef.mockImplementationOnce(() => { throw new Error('Not found'); @@ -127,4 +111,114 @@ describe('catalog:fetch', () => { }); expect(mockContext.output).not.toHaveBeenCalled(); }); + + it('should return entities from catalog', async () => { + getEntitiesByRefs.mockReturnValueOnce({ + items: [ + { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + } as Entity, + ], + }); + + await action.handler({ + ...mockContext, + input: { + entityRefs: ['component:default/test'], + }, + }); + + expect(getEntitiesByRefs).toHaveBeenCalledWith( + { entityRefs: ['component:default/test'] }, + { + token: 'secret', + }, + ); + expect(mockContext.output).toHaveBeenCalledWith('entities', [ + { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + }, + ]); + }); + + it('should throw error if undefined is returned for some entity', async () => { + getEntitiesByRefs.mockReturnValueOnce({ + items: [ + { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + } as Entity, + undefined, + ], + }); + + await expect( + action.handler({ + ...mockContext, + input: { + entityRefs: ['component:default/test', 'component:default/test2'], + optional: false, + }, + }), + ).rejects.toThrow('Entity component:default/test2 not found'); + + expect(getEntitiesByRefs).toHaveBeenCalledWith( + { entityRefs: ['component:default/test', 'component:default/test2'] }, + { + token: 'secret', + }, + ); + expect(mockContext.output).not.toHaveBeenCalled(); + }); + + it('should return null in case some of the entities not found and optional is true', async () => { + getEntitiesByRefs.mockReturnValueOnce({ + items: [ + { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + } as Entity, + undefined, + ], + }); + + await action.handler({ + ...mockContext, + input: { + entityRefs: ['component:default/test', 'component:default/test2'], + optional: true, + }, + }); + + expect(getEntitiesByRefs).toHaveBeenCalledWith( + { entityRefs: ['component:default/test', 'component:default/test2'] }, + { + token: 'secret', + }, + ); + expect(mockContext.output).toHaveBeenCalledWith('entities', [ + { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + }, + null, + ]); + }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts index 17e510ce64..1bcbfa0006 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts @@ -36,10 +36,26 @@ const examples = [ ], }), }, + { + description: 'Fetch multiple entities by referencse', + example: yaml.stringify({ + steps: [ + { + action: id, + id: 'fetchMultiple', + name: 'Fetch catalog entities', + input: { + entityRefs: ['component:default/name'], + }, + }, + ], + }), + }, ]; /** - * Returns entity from the catalog by entity reference. + * Returns entity or entities from the catalog by entity reference(s). + * * @public */ export function createFetchCatalogEntityAction(options: { @@ -47,13 +63,17 @@ export function createFetchCatalogEntityAction(options: { }) { const { catalogClient } = options; - return createTemplateAction<{ entityRef: string; optional?: boolean }>({ + return createTemplateAction<{ + entityRef?: string; + entityRefs?: string[]; + optional?: boolean; + }>({ id, - description: 'Returns entity from the catalog by entity reference', + description: + 'Returns entity or entities from the catalog by entity reference(s)', examples, schema: { input: { - required: ['entityRef'], type: 'object', properties: { entityRef: { @@ -61,10 +81,15 @@ export function createFetchCatalogEntityAction(options: { title: 'Entity reference', description: 'Entity reference of the entity to get', }, + entityRefs: { + type: 'array', + title: 'Entity references', + description: 'Entity references of the entities to get', + }, optional: { title: 'Optional', description: - 'Permit the entity to optionally exist. Default: false', + 'Allow the entity or entities to optionally exist. Default: false', type: 'boolean', }, }, @@ -76,29 +101,55 @@ export function createFetchCatalogEntityAction(options: { title: 'Entity found by the entity reference', type: 'object', description: - 'Object containing same values used in the Entity schema.', + 'Object containing same values used in the Entity schema. Only when used with `entityRef` parameter.', + }, + entities: { + title: 'Entities found by the entity references', + type: 'array', + items: { type: 'object' }, + description: + 'Array containing objects with same values used in the Entity schema. Only when used with `entityRefs` parameter.', }, }, }, }, async handler(ctx) { - const { entityRef, optional } = ctx.input; - let entity; - try { - entity = await catalogClient.getEntityByRef(entityRef, { + const { entityRef, entityRefs, optional } = ctx.input; + if (!entityRef && !entityRefs) { + if (optional) { + return; + } + throw new Error('Missing entity reference or references'); + } + + if (entityRef) { + const entity = await catalogClient.getEntityByRef(entityRef, { token: ctx.secrets?.backstageToken, }); - } catch (e) { - if (!optional) { - throw e; + + if (!entity && !optional) { + throw new Error(`Entity ${entityRef} not found`); } + ctx.output('entity', entity ?? null); } - if (!entity && !optional) { - throw new Error(`Entity ${entityRef} not found`); - } + if (entityRefs) { + const entities = await catalogClient.getEntitiesByRefs( + { entityRefs }, + { + token: ctx.secrets?.backstageToken, + }, + ); - ctx.output('entity', entity ?? null); + const finalEntities = entities.items.map((e, i) => { + if (!e && !optional) { + throw new Error(`Entity ${entityRefs[i]} not found`); + } + return e ?? null; + }); + + ctx.output('entities', finalEntities); + } }, }); } diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts index 9ba4a27b1a..747b5cdaed 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts @@ -30,8 +30,12 @@ import { } from './catalog'; import { TemplateFilter, TemplateGlobal } from '../../../lib'; -import { createDebugLogAction } from './debug'; -import { createFetchPlainAction, createFetchTemplateAction } from './fetch'; +import { createDebugLogAction, createWaitAction } from './debug'; +import { + createFetchPlainAction, + createFetchPlainFileAction, + createFetchTemplateAction, +} from './fetch'; import { createFilesystemDeleteAction, createFilesystemRenameAction, @@ -112,6 +116,10 @@ export const createBuiltinActions = ( reader, integrations, }), + createFetchPlainFileAction({ + reader, + integrations, + }), createFetchTemplateAction({ integrations, reader, @@ -159,6 +167,7 @@ export const createBuiltinActions = ( config, }), createDebugLogAction(), + createWaitAction(), createCatalogRegisterAction({ catalogClient, integrations }), createFetchCatalogEntityAction({ catalogClient }), createCatalogWriteAction(), diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts index 8cc50a7eba..3776ce7f03 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts @@ -15,3 +15,4 @@ */ export { createDebugLogAction } from './log'; +export { createWaitAction } from './wait'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.test.ts new file mode 100644 index 0000000000..0d4cdaba4b --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.test.ts @@ -0,0 +1,76 @@ +/* + * 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 { getVoidLogger } from '@backstage/backend-common'; +import mockFs from 'mock-fs'; +import { createWaitAction } from './wait'; +import { Writable } from 'stream'; +import os from 'os'; + +describe('debug:wait', () => { + const action = createWaitAction(); + + const logStream = { + write: jest.fn(), + } as jest.Mocked> as jest.Mocked; + + const mockTmpDir = os.tmpdir(); + const mockContext = { + input: {}, + baseUrl: 'somebase', + workspacePath: mockTmpDir, + logger: getVoidLogger(), + logStream, + output: jest.fn(), + createTemporaryDirectory: jest.fn().mockResolvedValue(mockTmpDir), + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + mockFs.restore(); + }); + + it('should wait for specified period of time', async () => { + const context = { + ...mockContext, + input: { + milliseconds: 50, + }, + }; + const start = new Date().getTime(); + await action.handler(context); + const end = new Date().getTime(); + expect(end - start).toBeGreaterThanOrEqual(50); + }); + + it('should not allow to set waiting time longer than the max waiting time', async () => { + const context = { + ...mockContext, + input: { + minutes: 11, + }, + }; + + await expect(async () => { + await action.handler(context); + }).rejects.toThrow( + 'Waiting duration is longer than the maximum threshold of 0 hours, 0 minutes, 30 seconds', + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts new file mode 100644 index 0000000000..02cab239cb --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts @@ -0,0 +1,131 @@ +/* + * 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 { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { HumanDuration } from '@backstage/types'; +import yaml from 'yaml'; +import { Duration } from 'luxon'; + +const id = 'debug:wait'; + +const MAX_WAIT_TIME_IN_ISO = 'T00:00:30'; + +const examples = [ + { + description: 'Waiting for 5 seconds', + example: yaml.stringify({ + steps: [ + { + action: id, + id: 'wait-5sec', + name: 'Waiting for 5 seconds', + input: { + seconds: 5, + }, + }, + ], + }), + }, + { + description: 'Waiting for 5 minutes', + example: yaml.stringify({ + steps: [ + { + action: id, + id: 'wait-5min', + name: 'Waiting for 5 minutes', + input: { + minutes: 5, + }, + }, + ], + }), + }, +]; + +/** + * Waits for a certain period of time. + * + * @remarks + * + * This task is useful to give some waiting time for manual intervention. + * Has to be used in a combination with other actions. + * + * @public + */ +export function createWaitAction(options?: { + maxWaitTime?: Duration | HumanDuration; +}) { + const toDuration = ( + maxWaitTime: Duration | HumanDuration | undefined, + ): Duration => { + if (maxWaitTime) { + if (maxWaitTime instanceof Duration) { + return maxWaitTime; + } + return Duration.fromObject(maxWaitTime); + } + return Duration.fromISOTime(MAX_WAIT_TIME_IN_ISO); + }; + + return createTemplateAction({ + id, + description: 'Waits for a certain period of time.', + examples, + schema: { + input: { + type: 'object', + properties: { + minutes: { + title: 'Waiting period in minutes.', + type: 'number', + }, + seconds: { + title: 'Waiting period in seconds.', + type: 'number', + }, + milliseconds: { + title: 'Waiting period in milliseconds.', + type: 'number', + }, + }, + }, + }, + async handler(ctx) { + const delayTime = Duration.fromObject(ctx.input); + const maxWait = toDuration(options?.maxWaitTime); + + if (delayTime.minus(maxWait).toMillis() > 0) { + throw new Error( + `Waiting duration is longer than the maximum threshold of ${maxWait.toHuman()}`, + ); + } + + await new Promise(resolve => { + const controller = new AbortController(); + const timeoutHandle = setTimeout(abort, delayTime.toMillis()); + ctx.signal?.addEventListener('abort', abort); + + function abort() { + ctx.signal?.removeEventListener('abort', abort); + clearTimeout(timeoutHandle!); + controller.abort(); + resolve('finished'); + } + }); + }, + }); +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts index 86d5f17803..3c4a677d4d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts @@ -21,7 +21,7 @@ import { resolve as resolvePath } from 'path'; import { UrlReader } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; -import { fetchContents } from './helpers'; +import { fetchContents, fetchFile } from './helpers'; import os from 'os'; describe('fetchContent helper', () => { @@ -37,9 +37,10 @@ describe('fetchContent helper', () => { }), ); + const readUrl = jest.fn(); const readTree = jest.fn(); const reader: UrlReader = { - readUrl: jest.fn(), + readUrl, readTree, search: jest.fn(), }; @@ -50,73 +51,165 @@ describe('fetchContent helper', () => { outputPath: os.tmpdir(), }; - it('should reject absolute file locations', async () => { - await expect( - fetchContents({ - ...options, - baseUrl: 'file:///some/path', - fetchUrl: '/etc/passwd', - }), - ).rejects.toThrow( - 'Relative path is not allowed to refer to a directory outside its parent', - ); - }); - - it('should reject relative file locations that exit the baseUrl', async () => { - await expect( - fetchContents({ - ...options, - baseUrl: 'file:///some/path', - fetchUrl: '../test', - }), - ).rejects.toThrow( - 'Relative path is not allowed to refer to a directory outside its parent', - ); - }); - - it('should copy file to outputpath', async () => { - await fetchContents({ - ...options, - baseUrl: 'file:///some/path', - fetchUrl: 'foo', - outputPath: 'somepath', + describe('fetch contents', () => { + it('should reject absolute file locations', async () => { + await expect( + fetchContents({ + ...options, + baseUrl: 'file:///some/path', + fetchUrl: '/etc/passwd', + }), + ).rejects.toThrow( + 'Relative path is not allowed to refer to a directory outside its parent', + ); }); - expect(fs.copy).toHaveBeenCalledWith(resolvePath('/some/foo'), 'somepath'); - }); - it('should reject if no integration matches location', async () => { - await expect( - fetchContents({ - ...options, - baseUrl: 'http://example.com/some/folder', - }), - ).rejects.toThrow( - 'No integration found for location http://example.com/some/folder', - ); - }); + it('should reject relative file locations that exit the baseUrl', async () => { + await expect( + fetchContents({ + ...options, + baseUrl: 'file:///some/path', + fetchUrl: '../test', + }), + ).rejects.toThrow( + 'Relative path is not allowed to refer to a directory outside its parent', + ); + }); - it('should reject if fetch url is relative and no base url is specified', async () => { - await expect( - fetchContents({ + it('should copy file to outputpath', async () => { + await fetchContents({ ...options, + baseUrl: 'file:///some/path', fetchUrl: 'foo', - }), - ).rejects.toThrow( - 'Failed to fetch, template location could not be determined and the fetch URL is relative, foo', - ); + outputPath: 'somepath', + }); + expect(fs.copy).toHaveBeenCalledWith( + resolvePath('/some/foo'), + 'somepath', + ); + }); + + it('should reject if no integration matches location', async () => { + await expect( + fetchContents({ + ...options, + baseUrl: 'http://example.com/some/folder', + }), + ).rejects.toThrow( + 'No integration found for location http://example.com/some/folder', + ); + }); + + it('should reject if fetch url is relative and no base url is specified', async () => { + await expect( + fetchContents({ + ...options, + fetchUrl: 'foo', + }), + ).rejects.toThrow( + 'Failed to fetch, template location could not be determined and the fetch URL is relative, foo', + ); + }); + + it('should fetch url contents', async () => { + const dirFunction = jest.fn(); + readTree.mockResolvedValue({ + dir: dirFunction, + }); + await fetchContents({ + ...options, + outputPath: 'foo', + fetchUrl: 'https://github.com/backstage/foo', + }); + expect(fs.ensureDir).toHaveBeenCalledWith('foo'); + expect(dirFunction).toHaveBeenCalledWith({ targetDir: 'foo' }); + }); }); - it('should fetch url contents', async () => { - const dirFunction = jest.fn(); - readTree.mockResolvedValue({ - dir: dirFunction, + describe('fetch file', () => { + it('should reject absolute file locations', async () => { + await expect( + fetchFile({ + ...options, + baseUrl: 'file:///some/path', + fetchUrl: '/etc/passwd', + }), + ).rejects.toThrow( + 'Relative path is not allowed to refer to a directory outside its parent', + ); }); - await fetchContents({ - ...options, - outputPath: 'foo', - fetchUrl: 'https://github.com/backstage/foo', + + it('should reject relative file locations that exit the baseUrl', async () => { + await expect( + fetchFile({ + ...options, + baseUrl: 'file:///some/path', + fetchUrl: '../test', + }), + ).rejects.toThrow( + 'Relative path is not allowed to refer to a directory outside its parent', + ); + }); + + it('should copy file to outputpath', async () => { + await fetchFile({ + ...options, + baseUrl: 'file:///some/path', + fetchUrl: 'foo', + outputPath: 'somepath', + }); + expect(fs.copyFile).toHaveBeenCalledWith( + resolvePath('/some/foo'), + 'somepath', + ); + }); + + it('should reject if no integration matches location', async () => { + await expect( + fetchFile({ + ...options, + baseUrl: 'http://example.com/some/folder', + }), + ).rejects.toThrow( + 'No integration found for location http://example.com/some/folder', + ); + }); + + it('should reject if fetch url is relative and no base url is specified', async () => { + await expect( + fetchFile({ + ...options, + fetchUrl: 'foo', + }), + ).rejects.toThrow( + 'Failed to fetch, template location could not be determined and the fetch URL is relative, foo', + ); + }); + + it('should fetch content from url', async () => { + readUrl.mockResolvedValue({ + buffer: () => Buffer.from('test', 'utf8'), + }); + await fetchFile({ + ...options, + outputPath: 'foo', + fetchUrl: 'https://github.com/backstage/foo', + }); + expect(fs.ensureDir).toHaveBeenCalledWith('.'); + expect(fs.outputFile).toHaveBeenCalledWith('foo', 'test'); + }); + + it('should fetch content from url into directory', async () => { + readUrl.mockResolvedValue({ + buffer: () => Buffer.from('test', 'utf8'), + }); + await fetchFile({ + ...options, + outputPath: 'mydir/foo', + fetchUrl: 'https://github.com/backstage/foo', + }); + expect(fs.ensureDir).toHaveBeenCalledWith('mydir'); + expect(fs.outputFile).toHaveBeenCalledWith('mydir/foo', 'test'); }); - expect(fs.ensureDir).toHaveBeenCalled(); - expect(dirFunction).toHaveBeenCalledWith({ targetDir: 'foo' }); }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts index 4b82595cfd..301c9991c4 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts @@ -35,6 +35,53 @@ export async function fetchContents(options: { }) { const { reader, integrations, baseUrl, fetchUrl = '.', outputPath } = options; + const fetchUrlIsAbsolute = isFetchUrlAbsolute(fetchUrl); + + // We handle both file locations and url ones + if (!fetchUrlIsAbsolute && baseUrl?.startsWith('file://')) { + const basePath = baseUrl.slice('file://'.length); + const srcDir = resolveSafeChildPath(path.dirname(basePath), fetchUrl); + await fs.copy(srcDir, outputPath); + } else { + const readUrl = getReadUrl(fetchUrl, baseUrl, integrations); + + const res = await reader.readTree(readUrl); + await fs.ensureDir(outputPath); + await res.dir({ targetDir: outputPath }); + } +} + +/** + * A helper function that reads the content of a single file from the given URL. + * Can be used in your own actions, and also used behind `fetch:plain:file` + */ +export async function fetchFile(options: { + reader: UrlReader; + integrations: ScmIntegrations; + baseUrl?: string; + fetchUrl?: string; + outputPath: string; +}) { + const { reader, integrations, baseUrl, fetchUrl = '.', outputPath } = options; + + const fetchUrlIsAbsolute = isFetchUrlAbsolute(fetchUrl); + + // We handle both file locations and url ones + if (!fetchUrlIsAbsolute && baseUrl?.startsWith('file://')) { + const basePath = baseUrl.slice('file://'.length); + const src = resolveSafeChildPath(path.dirname(basePath), fetchUrl); + await fs.copyFile(src, outputPath); + } else { + const readUrl = getReadUrl(fetchUrl, baseUrl, integrations); + + const res = await reader.readUrl(readUrl); + await fs.ensureDir(path.dirname(outputPath)); + const buffer = await res.buffer(); + await fs.outputFile(outputPath, buffer.toString()); + } +} + +function isFetchUrlAbsolute(fetchUrl: string) { let fetchUrlIsAbsolute = false; try { // eslint-disable-next-line no-new @@ -43,35 +90,28 @@ export async function fetchContents(options: { } catch { /* ignored */ } + return fetchUrlIsAbsolute; +} - // We handle both file locations and url ones - if (!fetchUrlIsAbsolute && baseUrl?.startsWith('file://')) { - const basePath = baseUrl.slice('file://'.length); - const srcDir = resolveSafeChildPath(path.dirname(basePath), fetchUrl); - await fs.copy(srcDir, outputPath); - } else { - let readUrl; - - if (fetchUrlIsAbsolute) { - readUrl = fetchUrl; - } else if (baseUrl) { - const integration = integrations.byUrl(baseUrl); - if (!integration) { - throw new InputError(`No integration found for location ${baseUrl}`); - } - - readUrl = integration.resolveUrl({ - url: fetchUrl, - base: baseUrl, - }); - } else { - throw new InputError( - `Failed to fetch, template location could not be determined and the fetch URL is relative, ${fetchUrl}`, - ); +function getReadUrl( + fetchUrl: string, + baseUrl: string | undefined, + integrations: ScmIntegrations, +) { + if (isFetchUrlAbsolute(fetchUrl)) { + return fetchUrl; + } else if (baseUrl) { + const integration = integrations.byUrl(baseUrl); + if (!integration) { + throw new InputError(`No integration found for location ${baseUrl}`); } - const res = await reader.readTree(readUrl); - await fs.ensureDir(outputPath); - await res.dir({ targetDir: outputPath }); + return integration.resolveUrl({ + url: fetchUrl, + base: baseUrl, + }); } + throw new InputError( + `Failed to fetch, template location could not be determined and the fetch URL is relative, ${fetchUrl}`, + ); } diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/index.ts index c9a16c274e..14a40f53c3 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/index.ts @@ -15,5 +15,6 @@ */ export { createFetchPlainAction } from './plain'; +export { createFetchPlainFileAction } from './plainFile'; export { createFetchTemplateAction } from './template'; export { fetchContents } from './helpers'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.test.ts new file mode 100644 index 0000000000..5d9e99fc7d --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.test.ts @@ -0,0 +1,85 @@ +/* + * 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. + */ + +jest.mock('./helpers'); + +import os from 'os'; +import { resolve as resolvePath } from 'path'; +import { getVoidLogger, UrlReader } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { createFetchPlainFileAction } from './plainFile'; +import { PassThrough } from 'stream'; +import { fetchFile } from './helpers'; + +describe('fetch:plain:file', () => { + const integrations = ScmIntegrations.fromConfig( + new ConfigReader({ + integrations: { + github: [{ host: 'github.com', token: 'token' }], + }, + }), + ); + const reader: UrlReader = { + readUrl: jest.fn(), + readTree: jest.fn(), + search: jest.fn(), + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + const action = createFetchPlainFileAction({ integrations, reader }); + const mockContext = { + workspacePath: os.tmpdir(), + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + it('should disallow a target path outside working directory', async () => { + await expect( + action.handler({ + ...mockContext, + input: { + url: 'https://github.com/backstage/community/tree/main/backstage-community-sessions/assets/Backstage%20Community%20Sessions.png', + targetPath: '/foobar', + }, + }), + ).rejects.toThrow( + /Relative path is not allowed to refer to a directory outside its parent/, + ); + }); + + it('should fetch plain', async () => { + await action.handler({ + ...mockContext, + input: { + url: 'https://github.com/backstage/community/tree/main/backstage-community-sessions/assets/Backstage%20Community%20Sessions.png', + targetPath: 'lol', + }, + }); + expect(fetchFile).toHaveBeenCalledWith( + expect.objectContaining({ + outputPath: resolvePath(mockContext.workspacePath, 'lol'), + fetchUrl: + 'https://github.com/backstage/community/tree/main/backstage-community-sessions/assets/Backstage%20Community%20Sessions.png', + }), + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts new file mode 100644 index 0000000000..7b33ad93b4 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts @@ -0,0 +1,75 @@ +/* + * 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 { UrlReader, resolveSafeChildPath } from '@backstage/backend-common'; +import { ScmIntegrations } from '@backstage/integration'; +import { fetchFile } from './helpers'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; + +/** + * Downloads content and places it in the workspace, or optionally + * in a subdirectory specified by the 'targetPath' input option. + * @public + */ +export function createFetchPlainFileAction(options: { + reader: UrlReader; + integrations: ScmIntegrations; +}) { + const { reader, integrations } = options; + + return createTemplateAction<{ url: string; targetPath: string }>({ + id: 'fetch:plain:file', + description: 'Downloads single file and places it in the workspace.', + schema: { + input: { + type: 'object', + required: ['url', 'targetPath'], + properties: { + url: { + title: 'Fetch URL', + description: + 'Relative path or absolute URL pointing to the single file to fetch.', + type: 'string', + }, + targetPath: { + title: 'Target Path', + description: + 'Target path within the working directory to download the file as.', + type: 'string', + }, + }, + }, + }, + supportsDryRun: true, + async handler(ctx) { + ctx.logger.info('Fetching plain content from remote URL'); + + // Finally move the template result into the task workspace + const outputPath = resolveSafeChildPath( + ctx.workspacePath, + ctx.input.targetPath, + ); + + await fetchFile({ + reader, + integrations, + baseUrl: ctx.templateInfo?.baseUrl, + fetchUrl: ctx.input.url, + outputPath, + }); + }, + }); +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts index bb27410402..06e056cda3 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts @@ -127,7 +127,7 @@ export const createPublishGitlabMergeRequestAction = (options: { title: 'Gitlab Project path', type: 'string', }, - mergeRequestURL: { + mergeRequestUrl: { title: 'MergeRequest(MR) URL', type: 'string', description: 'Link to the merge request in GitLab', diff --git a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts index 1929e3b8ac..d9302f4d74 100644 --- a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts @@ -25,7 +25,7 @@ import { SerializedFile, serializeDirectoryContents, } from '../../lib/files'; -import { TemplateFilter, TemplateGlobal } from '../../lib/templating'; +import { TemplateFilter, TemplateGlobal } from '../../lib'; import { TemplateActionRegistry } from '../actions'; import { NunjucksWorkflowRunner } from '../tasks/NunjucksWorkflowRunner'; import { DecoratedActionsRegistry } from './DecoratedActionsRegistry'; @@ -94,6 +94,8 @@ export function createDryRunner(options: TemplateTesterCreateOptions) { try { await deserializeDirectoryContents(contentsPath, input.directoryContents); + const abortSignal = new AbortController().signal; + const result = await workflowRunner.execute({ spec: { ...input.spec, @@ -117,6 +119,7 @@ export function createDryRunner(options: TemplateTesterCreateOptions) { done: false, isDryRun: true, getWorkspaceName: async () => `dry-run-${dryRunId}`, + cancelSignal: abortSignal, async emitLog(message: string, logMetadata?: JsonObject) { if (logMetadata?.stepId === dryRunId) { return; @@ -128,7 +131,7 @@ export function createDryRunner(options: TemplateTesterCreateOptions) { }, }); }, - async complete() { + complete: async () => { throw new Error('Not implemented'); }, }); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts new file mode 100644 index 0000000000..4c0eb94c82 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts @@ -0,0 +1,191 @@ +/* + * 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 { DatabaseManager } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { DatabaseTaskStore } from './DatabaseTaskStore'; +import { TaskSpec } from '@backstage/plugin-scaffolder-common'; +import { ConflictError } from '@backstage/errors'; + +const createStore = async () => { + const manager = DatabaseManager.fromConfig( + new ConfigReader({ + backend: { + database: { + client: 'better-sqlite3', + connection: ':memory:', + }, + }, + }), + ).forPlugin('scaffolder'); + const store = await DatabaseTaskStore.create({ + database: manager, + }); + return { store, manager }; +}; + +describe('DatabaseTaskStore', () => { + it('should create the database store and run migration', async () => { + const { store, manager } = await createStore(); + expect(store).toBeDefined(); + + const client = await manager.getClient(); + expect(client.schema.hasTable('tasks')).toBeTruthy(); + expect(client.schema.hasTable('task_events')).toBeTruthy(); + }); + + it('should list all created tasks', async () => { + const { store } = await createStore(); + await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + + const { tasks } = await store.list({}); + expect(tasks.length).toBe(1); + expect(tasks[0].createdBy).toBe('me'); + expect(tasks[0].status).toBe('open'); + expect(tasks[0].id).toBeDefined(); + }); + + it('should list filtered created tasks by createdBy', async () => { + const { store } = await createStore(); + + await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + + await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'him', + }); + + const { tasks } = await store.list({ createdBy: 'him' }); + expect(tasks.length).toBe(1); + expect(tasks[0].createdBy).toBe('him'); + expect(tasks[0].status).toBe('open'); + expect(tasks[0].id).toBeDefined(); + }); + + it('should sent an event to start cancelling the task', async () => { + const { store } = await createStore(); + + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + const task = await store.getTask(taskId); + expect(task.status).toBe('open'); + + await store.cancelTask({ + taskId, + body: { + message: `Step 2 has been cancelled.`, + stepId: 2, + status: 'cancelled', + }, + }); + + const { events } = await store.listEvents({ taskId }); + const event = events[0]; + expect(event.taskId).toBe(taskId); + expect(event.body.status).toBe('cancelled'); + }); + + it('should emit a log event', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + await store.emitLogEvent({ + taskId, + body: { + message: 'Step #2 failed', + stepId: 2, + status: 'failed', + }, + }); + const { events } = await store.listEvents({ taskId }); + const event = events[0]; + expect(event.taskId).toBe(taskId); + expect(event.body.status).toBe('failed'); + expect(event.type).toBe('log'); + }); + + it('should complete the task', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + const task = await store.getTask(taskId); + expect(task.status).toBe('open'); + + const message = `This task was marked as stale as it exceeded its timeout`; + await store.completeTask({ + taskId, + status: 'cancelled', + eventBody: { message }, + }); + + const taskAfterCompletion = await store.getTask(taskId); + expect(taskAfterCompletion.status).toBe('cancelled'); + }); + + it('should claim a new task', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + const task = await store.getTask(taskId); + expect(task.status).toBe('open'); + await store.claimTask(); + + const claimedTask = await store.getTask(taskId); + expect(claimedTask.status).toBe('processing'); + }); + + it('should shutdown the running task', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + const task = await store.getTask(taskId); + expect(task.status).toBe('open'); + await store.claimTask(); + await store.shutdownTask({ taskId }); + + const claimedTask = await store.getTask(taskId); + expect(claimedTask.status).toBe('failed'); + }); + + it('should be not possible to shutdown not running task', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + const task = await store.getTask(taskId); + expect(task.status).toBe('open'); + await expect(async () => { + await store.shutdownTask({ taskId }); + }).rejects.toThrow(ConflictError); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 879b457544..f3cb9b645e 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -220,7 +220,7 @@ export class DatabaseTaskStore implements TaskStore { .update({ status: 'processing', last_heartbeat_at: this.db.fn.now(), - // remove the secrets when moving moving to processing state. + // remove the secrets when moving to processing state. secrets: null, }); @@ -287,13 +287,14 @@ export class DatabaseTaskStore implements TaskStore { const { taskId, status, eventBody } = options; let oldStatus: string; - if (status === 'failed' || status === 'completed') { + if (['failed', 'completed', 'cancelled'].includes(status)) { oldStatus = 'processing'; } else { throw new Error( `Invalid status update of run '${taskId}' to status '${status}'`, ); } + await this.db.transaction(async tx => { const [task] = await tx('tasks') .where({ @@ -302,6 +303,40 @@ export class DatabaseTaskStore implements TaskStore { .limit(1) .select(); + const updateTask = async (criteria: { + id: string; + status?: TaskStatus; + }) => { + const updateCount = await tx('tasks') + .where(criteria) + .update({ + status, + }); + + if (updateCount !== 1) { + throw new ConflictError( + `Failed to update status to '${status}' for taskId ${taskId}`, + ); + } + + await tx('task_events').insert({ + task_id: taskId, + event_type: 'completion', + body: JSON.stringify(eventBody), + }); + }; + + if (status === 'cancelled') { + await updateTask({ + id: taskId, + }); + return; + } + + if (task.status === 'cancelled') { + return; + } + if (!task) { throw new Error(`No task with taskId ${taskId} found`); } @@ -311,25 +346,10 @@ export class DatabaseTaskStore implements TaskStore { `as it is currently '${task.status}', expected '${oldStatus}'`, ); } - const updateCount = await tx('tasks') - .where({ - id: taskId, - status: oldStatus, - }) - .update({ - status, - }); - if (updateCount !== 1) { - throw new ConflictError( - `Failed to update status to '${status}' for taskId ${taskId}`, - ); - } - - await tx('task_events').insert({ - task_id: taskId, - event_type: 'completion', - body: JSON.stringify(eventBody), + await updateTask({ + id: taskId, + status: oldStatus, }); }); } @@ -419,4 +439,16 @@ export class DatabaseTaskStore implements TaskStore { }, }); } + + async cancelTask( + options: TaskStoreEmitOptions<{ message: string } & JsonObject>, + ): Promise { + const { taskId, body } = options; + const serializedBody = JSON.stringify(body); + await this.db('task_events').insert({ + task_id: taskId, + event_type: 'cancelled', + body: serializedBody, + }); + } } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 0d2246ed36..3b6ec54249 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -70,6 +70,7 @@ describe('DefaultWorkflowRunner', () => { complete: async () => {}, done: false, emitLog: async () => {}, + cancelSignal: new AbortController().signal, getWorkspaceName: () => Promise.resolve('test-workspace'), }); @@ -166,7 +167,7 @@ describe('DefaultWorkflowRunner', () => { }); await expect(runner.execute(task)).rejects.toThrow( - /Invalid input passed to action jest-validated-action, instance requires property \"foo\"/, + /Invalid input passed to action jest-validated-action, instance requires property "foo"/, ); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 88abe05cad..629c730d48 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -15,7 +15,12 @@ */ import { ScmIntegrations } from '@backstage/integration'; -import { TaskContext, WorkflowResponse, WorkflowRunner } from './types'; +import { + TaskContext, + TaskTrackType, + WorkflowResponse, + WorkflowRunner, +} from './types'; import * as winston from 'winston'; import fs from 'fs-extra'; import path from 'path'; @@ -99,6 +104,7 @@ const createStepLogger = ({ export class NunjucksWorkflowRunner implements WorkflowRunner { constructor(private readonly options: NunjucksWorkflowRunnerOptions) {} + private readonly tracker = scaffoldingTracker(); private isSingleTemplateString(input: string) { @@ -180,6 +186,138 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { }); } + async executeStep( + task: TaskContext, + step: TaskStep, + context: TemplateContext, + renderTemplate: (template: string, values: unknown) => string, + taskTrack: TaskTrackType, + workspacePath: string, + ) { + const stepTrack = await this.tracker.stepStart(task, step); + + if (task.cancelSignal.aborted) { + throw new Error(`Step ${step.name} has been cancelled.`); + } + + try { + if (step.if) { + const ifResult = await this.render(step.if, context, renderTemplate); + if (!isTruthy(ifResult)) { + await stepTrack.skipFalsy(); + return; + } + } + + const action: TemplateAction = + this.options.actionRegistry.get(step.action); + const { taskLogger, streamLogger } = createStepLogger({ task, step }); + + if (task.isDryRun) { + const redactedSecrets = Object.fromEntries( + Object.entries(task.secrets ?? {}).map(secret => [ + secret[0], + '[REDACTED]', + ]), + ); + const debugInput = + (step.input && + this.render( + step.input, + { + ...context, + secrets: redactedSecrets, + }, + renderTemplate, + )) ?? + {}; + taskLogger.info( + `Running ${ + action.id + } in dry-run mode with inputs (secrets redacted): ${JSON.stringify( + debugInput, + undefined, + 2, + )}`, + ); + if (!action.supportsDryRun) { + await taskTrack.skipDryRun(step, action); + const outputSchema = action.schema?.output; + if (outputSchema) { + context.steps[step.id] = { + output: generateExampleOutput(outputSchema) as { + [name in string]: JsonValue; + }, + }; + } else { + context.steps[step.id] = { output: {} }; + } + return; + } + } + + // Secrets are only passed when templating the input to actions for security reasons + const input = + (step.input && + this.render( + step.input, + { ...context, secrets: task.secrets ?? {} }, + renderTemplate, + )) ?? + {}; + + if (action.schema?.input) { + const validateResult = validateJsonSchema(input, action.schema.input); + if (!validateResult.valid) { + const errors = validateResult.errors.join(', '); + throw new InputError( + `Invalid input passed to action ${action.id}, ${errors}`, + ); + } + } + + const tmpDirs = new Array(); + const stepOutput: { [outputName: string]: JsonValue } = {}; + + await action.handler({ + input, + secrets: task.secrets ?? {}, + logger: taskLogger, + logStream: streamLogger, + workspacePath, + createTemporaryDirectory: async () => { + const tmpDir = await fs.mkdtemp(`${workspacePath}_step-${step.id}-`); + tmpDirs.push(tmpDir); + return tmpDir; + }, + output(name: string, value: JsonValue) { + stepOutput[name] = value; + }, + templateInfo: task.spec.templateInfo, + user: task.spec.user, + isDryRun: task.isDryRun, + signal: task.cancelSignal, + }); + + // Remove all temporary directories that were created when executing the action + for (const tmpDir of tmpDirs) { + await fs.remove(tmpDir); + } + + context.steps[step.id] = { output: stepOutput }; + + if (task.cancelSignal.aborted) { + throw new Error(`Step ${step.name} has been cancelled.`); + } + + await stepTrack.markSuccessful(); + } catch (err) { + await taskTrack.markFailed(step, err); + await stepTrack.markFailed(); + throw err; + } + } + async execute(task: TaskContext): Promise { if (!isValidTaskSpec(task.spec)) { throw new InputError( @@ -191,7 +329,12 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { await task.getWorkspaceName(), ); - const { integrations } = this.options; + const { + additionalTemplateFilters, + additionalTemplateGlobals, + integrations, + } = this.options; + const renderTemplate = await SecureTemplater.loadRenderer({ // TODO(blam): let's work out how we can deprecate this. // We shouldn't really need to be exposing these now we can deal with @@ -200,8 +343,8 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { parseRepoUrl(url: string) { return parseRepoUrl(url, integrations); }, - additionalTemplateFilters: this.options.additionalTemplateFilters, - additionalTemplateGlobals: this.options.additionalTemplateGlobals, + additionalTemplateFilters, + additionalTemplateGlobals, }); try { @@ -215,126 +358,14 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { }; for (const step of task.spec.steps) { - const stepTrack = await this.tracker.stepStart(task, step); - try { - if (step.if) { - const ifResult = await this.render( - step.if, - context, - renderTemplate, - ); - if (!isTruthy(ifResult)) { - await stepTrack.skipFalsy(); - continue; - } - } - - const action = this.options.actionRegistry.get(step.action); - const { taskLogger, streamLogger } = createStepLogger({ task, step }); - - if (task.isDryRun) { - const redactedSecrets = Object.fromEntries( - Object.entries(task.secrets ?? {}).map(secret => [ - secret[0], - '[REDACTED]', - ]), - ); - const debugInput = - (step.input && - this.render( - step.input, - { - ...context, - secrets: redactedSecrets, - }, - renderTemplate, - )) ?? - {}; - taskLogger.info( - `Running ${ - action.id - } in dry-run mode with inputs (secrets redacted): ${JSON.stringify( - debugInput, - undefined, - 2, - )}`, - ); - if (!action.supportsDryRun) { - await taskTrack.skipDryRun(step, action); - const outputSchema = action.schema?.output; - if (outputSchema) { - context.steps[step.id] = { - output: generateExampleOutput(outputSchema) as { - [name in string]: JsonValue; - }, - }; - } else { - context.steps[step.id] = { output: {} }; - } - continue; - } - } - - // Secrets are only passed when templating the input to actions for security reasons - const input = - (step.input && - this.render( - step.input, - { ...context, secrets: task.secrets ?? {} }, - renderTemplate, - )) ?? - {}; - - if (action.schema?.input) { - const validateResult = validateJsonSchema( - input, - action.schema.input, - ); - if (!validateResult.valid) { - const errors = validateResult.errors.join(', '); - throw new InputError( - `Invalid input passed to action ${action.id}, ${errors}`, - ); - } - } - - const tmpDirs = new Array(); - const stepOutput: { [outputName: string]: JsonValue } = {}; - - await action.handler({ - input, - secrets: task.secrets ?? {}, - logger: taskLogger, - logStream: streamLogger, - workspacePath, - createTemporaryDirectory: async () => { - const tmpDir = await fs.mkdtemp( - `${workspacePath}_step-${step.id}-`, - ); - tmpDirs.push(tmpDir); - return tmpDir; - }, - output(name: string, value: JsonValue) { - stepOutput[name] = value; - }, - templateInfo: task.spec.templateInfo, - user: task.spec.user, - isDryRun: task.isDryRun, - }); - - // Remove all temporary directories that were created when executing the action - for (const tmpDir of tmpDirs) { - await fs.remove(tmpDir); - } - - context.steps[step.id] = { output: stepOutput }; - - await stepTrack.markSuccessful(); - } catch (err) { - await taskTrack.markFailed(step, err); - await stepTrack.markFailed(); - throw err; - } + await this.executeStep( + task, + step, + context, + renderTemplate, + taskTrack, + workspacePath, + ); } const output = this.render(task.spec.output, context, renderTemplate); @@ -380,7 +411,10 @@ function scaffoldingTracker() { template, }); - async function skipDryRun(step: TaskStep, action: TemplateAction) { + async function skipDryRun( + step: TaskStep, + action: TemplateAction, + ) { task.emitLog(`Skipping because ${action.id} does not support dry-run`, { stepId: step.id, status: 'skipped', @@ -409,8 +443,22 @@ function scaffoldingTracker() { taskTimer({ result: 'failed' }); } + async function markCancelled(step: TaskStep) { + await task.emitLog(`Step ${step.id} has been cancelled.`, { + stepId: step.id, + status: 'cancelled', + }); + taskCount.inc({ + template, + user, + result: 'cancelled', + }); + taskTimer({ result: 'cancelled' }); + } + return { skipDryRun, + markCancelled, markSuccessful, markFailed, }; @@ -441,6 +489,15 @@ function scaffoldingTracker() { stepTimer({ result: 'ok' }); } + async function markCancelled() { + stepCount.inc({ + template, + step: step.name, + result: 'cancelled', + }); + stepTimer({ result: 'cancelled' }); + } + async function markFailed() { stepCount.inc({ template, @@ -459,8 +516,9 @@ function scaffoldingTracker() { } return { - markSuccessful, + markCancelled, markFailed, + markSuccessful, skipFalsy, }; } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index d01351d8ae..fc5a724e47 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -39,8 +39,13 @@ export class TaskManager implements TaskContext { private heartbeatTimeoutId?: ReturnType; - static create(task: CurrentClaimedTask, storage: TaskStore, logger: Logger) { - const agent = new TaskManager(task, storage, logger); + static create( + task: CurrentClaimedTask, + storage: TaskStore, + abortSignal: AbortSignal, + logger: Logger, + ) { + const agent = new TaskManager(task, storage, abortSignal, logger); agent.startTimeout(); return agent; } @@ -49,6 +54,7 @@ export class TaskManager implements TaskContext { private constructor( private readonly task: CurrentClaimedTask, private readonly storage: TaskStore, + private readonly signal: AbortSignal, private readonly logger: Logger, ) {} @@ -56,6 +62,10 @@ export class TaskManager implements TaskContext { return this.task.spec; } + get cancelSignal() { + return this.signal; + } + get secrets() { return this.task.secrets; } @@ -165,6 +175,33 @@ export class StorageTaskBroker implements TaskBroker { private deferredDispatch = defer(); + private async registerCancellable( + taskId: string, + abortController: AbortController, + ) { + let shouldUnsubscribe = false; + const subscription = this.event$({ taskId, after: undefined }).subscribe({ + error: _ => { + subscription.unsubscribe(); + }, + next: ({ events }) => { + for (const event of events) { + if (event.type === 'cancelled') { + abortController.abort(); + shouldUnsubscribe = true; + } + + if (event.type === 'completion') { + shouldUnsubscribe = true; + } + } + if (shouldUnsubscribe) { + subscription.unsubscribe(); + } + }, + }); + } + /** * {@inheritdoc TaskBroker.claim} */ @@ -172,6 +209,8 @@ export class StorageTaskBroker implements TaskBroker { for (;;) { const pendingTask = await this.storage.claimTask(); if (pendingTask) { + const abortController = new AbortController(); + await this.registerCancellable(pendingTask.id, abortController); return TaskManager.create( { taskId: pendingTask.id, @@ -180,6 +219,7 @@ export class StorageTaskBroker implements TaskBroker { createdBy: pendingTask.createdBy, }, this.storage, + abortController.signal, this.logger, ); } @@ -271,4 +311,24 @@ export class StorageTaskBroker implements TaskBroker { this.deferredDispatch.resolve(); this.deferredDispatch = defer(); } + + async cancel(taskId: string) { + const { events } = await this.storage.listEvents({ taskId }); + const currentStepId = + events.length > 0 + ? events + .filter(({ body }) => body?.stepId) + .reduce((prev, curr) => (prev.id > curr.id ? prev : curr)).body + .stepId + : 0; + + await this.storage.cancelTask?.({ + taskId, + body: { + message: `Step ${currentStepId} has been cancelled.`, + stepId: currentStepId, + status: 'cancelled', + }, + }); + } } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts index d39671cb67..e886b31369 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts @@ -15,7 +15,7 @@ */ import os from 'os'; -import { getVoidLogger, DatabaseManager } from '@backstage/backend-common'; +import { DatabaseManager, getVoidLogger } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { DatabaseTaskStore } from './DatabaseTaskStore'; import { StorageTaskBroker } from './StorageTaskBroker'; @@ -23,7 +23,14 @@ import { TaskWorker, TaskWorkerOptions } from './TaskWorker'; import { ScmIntegrations } from '@backstage/integration'; import { TemplateActionRegistry } from '../actions'; import { NunjucksWorkflowRunner } from './NunjucksWorkflowRunner'; -import { TaskBroker, TaskContext, WorkflowRunner } from './types'; +import { + SerializedTaskEvent, + TaskBroker, + TaskContext, + WorkflowRunner, +} from './types'; +import ObservableImpl from 'zen-observable'; +import waitForExpect from 'wait-for-expect'; jest.mock('./NunjucksWorkflowRunner'); const MockedNunjucksWorkflowRunner = @@ -198,6 +205,67 @@ describe('Concurrent TaskWorker', () => { }); }); +describe('Cancellable TaskWorker', () => { + let storage: DatabaseTaskStore; + const integrations: ScmIntegrations = {} as ScmIntegrations; + const actionRegistry: TemplateActionRegistry = {} as TemplateActionRegistry; + const workingDirectory = os.tmpdir(); + + let myTask: TaskContext | undefined = undefined; + + const workflowRunner: NunjucksWorkflowRunner = { + execute: (task: TaskContext) => { + myTask = task; + }, + } as unknown as NunjucksWorkflowRunner; + + beforeAll(async () => { + storage = await createStore(); + }); + + beforeEach(() => { + jest.resetAllMocks(); + MockedNunjucksWorkflowRunner.mockImplementation(() => workflowRunner); + }); + + const logger = getVoidLogger(); + + it('should be able to cancel the running task', async () => { + const taskBroker = new StorageTaskBroker(storage, logger); + const taskWorker = await TaskWorker.create({ + logger, + workingDirectory, + integrations, + taskBroker, + actionRegistry, + }); + + const steps = [...Array(10)].map(n => ({ + id: `test${n}`, + name: `test${n}`, + action: 'not-found-action', + })); + + const { taskId } = await taskBroker.dispatch({ + spec: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps, + output: { + result: '{{ steps.test.output.testOutput }}', + }, + parameters: {}, + }, + }); + + await taskWorker.start(); + await taskBroker.cancel(taskId); + + await waitForExpect(() => { + expect(myTask?.cancelSignal.aborted).toBeTruthy(); + }); + }); +}); + describe('TaskWorker internals', () => { const TaskWorkerConstructor = TaskWorker as unknown as { new (options: TaskWorkerOptions): TaskWorker; @@ -219,10 +287,24 @@ describe('TaskWorker internals', () => { }, }; + const subscribers = new Set< + ZenObservable.SubscriptionObserver<{ events: SerializedTaskEvent[] }> + >(); + let claimedTaskCount = 0; const taskWorker = new TaskWorkerConstructor({ runners: { workflowRunner }, taskBroker: { + event$() { + return new ObservableImpl<{ events: SerializedTaskEvent[] }>( + subscriber => { + subscribers.add(subscriber); + return () => { + subscribers.delete(subscriber); + }; + }, + ); + }, async claim() { claimedTaskCount++; return { @@ -233,7 +315,7 @@ describe('TaskWorker internals', () => { async complete(_result, _metadata) {}, } as TaskContext; }, - } as TaskBroker, + } as unknown as TaskBroker, concurrentTasksLimit: 2, }); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index 82829665a3..5723e7136f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -21,10 +21,7 @@ import { Logger } from 'winston'; import { TemplateActionRegistry } from '../actions'; import { ScmIntegrations } from '@backstage/integration'; import { assertError } from '@backstage/errors'; -import { - TemplateFilter, - TemplateGlobal, -} from '../../lib/templating/SecureTemplater'; +import { TemplateFilter, TemplateGlobal } from '../../lib'; /** * TaskWorkerOptions diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index 5a91802f3e..112276b9dd 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -15,8 +15,9 @@ */ import { JsonValue, JsonObject, Observable } from '@backstage/types'; -import { TaskSpec } from '@backstage/plugin-scaffolder-common'; +import { TaskSpec, TaskStep } from '@backstage/plugin-scaffolder-common'; import { TaskSecrets } from '@backstage/plugin-scaffolder-node'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; /** * The status of each step of the Task @@ -24,11 +25,11 @@ import { TaskSecrets } from '@backstage/plugin-scaffolder-node'; * @public */ export type TaskStatus = - | 'open' - | 'processing' - | 'failed' | 'cancelled' - | 'completed'; + | 'completed' + | 'failed' + | 'open' + | 'processing'; /** * The state of a completed task. @@ -57,7 +58,7 @@ export type SerializedTask = { * * @public */ -export type TaskEventType = 'completion' | 'log'; +export type TaskEventType = 'completion' | 'log' | 'cancelled'; /** * SerializedTaskEvent @@ -99,13 +100,17 @@ export type TaskBrokerDispatchOptions = { * @public */ export interface TaskContext { + cancelSignal: AbortSignal; spec: TaskSpec; secrets?: TaskSecrets; createdBy?: string; done: boolean; isDryRun?: boolean; - emitLog(message: string, logMetadata?: JsonObject): Promise; + complete(result: TaskCompletionState, metadata?: JsonObject): Promise; + + emitLog(message: string, logMetadata?: JsonObject): Promise; + getWorkspaceName(): Promise; } @@ -115,16 +120,23 @@ export interface TaskContext { * @public */ export interface TaskBroker { + cancel?(taskId: string): Promise; + claim(): Promise; + dispatch( options: TaskBrokerDispatchOptions, ): Promise; + vacuumTasks(options: { timeoutS: number }): Promise; + event$(options: { taskId: string; after: number | undefined; }): Observable<{ events: SerializedTaskEvent[] }>; + get(taskId: string): Promise; + list?(options?: { createdBy?: string }): Promise<{ tasks: SerializedTask[] }>; } @@ -181,30 +193,51 @@ export type TaskStoreCreateTaskResult = { * @public */ export interface TaskStore { + cancelTask?(options: TaskStoreEmitOptions): Promise; + createTask( options: TaskStoreCreateTaskOptions, ): Promise; + getTask(taskId: string): Promise; + claimTask(): Promise; + completeTask(options: { taskId: string; status: TaskStatus; eventBody: JsonObject; }): Promise; + heartbeatTask(taskId: string): Promise; + listStaleTasks(options: { timeoutS: number }): Promise<{ tasks: { taskId: string }[]; }>; + list?(options: { createdBy?: string }): Promise<{ tasks: SerializedTask[] }>; emitLogEvent(options: TaskStoreEmitOptions): Promise; + listEvents( options: TaskStoreListEventsOptions, ): Promise<{ events: SerializedTaskEvent[] }>; + shutdownTask?(options: TaskStoreShutDownTaskOptions): Promise; } export type WorkflowResponse = { output: { [key: string]: JsonValue } }; + export interface WorkflowRunner { execute(task: TaskContext): Promise; } + +export type TaskTrackType = { + markCancelled: (step: TaskStep) => Promise; + markFailed: (step: TaskStep, err: Error) => Promise; + markSuccessful: () => Promise; + skipDryRun: ( + step: TaskStep, + action: TemplateAction, + ) => Promise; +}; diff --git a/plugins/scaffolder-backend/src/service/conditionExports.ts b/plugins/scaffolder-backend/src/service/conditionExports.ts new file mode 100644 index 0000000000..0c502c6075 --- /dev/null +++ b/plugins/scaffolder-backend/src/service/conditionExports.ts @@ -0,0 +1,67 @@ +/* + * 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 { RESOURCE_TYPE_SCAFFOLDER_TEMPLATE } from '@backstage/plugin-scaffolder-common/alpha'; +import { createConditionExports } from '@backstage/plugin-permission-node'; +import { scaffolderTemplateRules } from './rules'; + +const { conditions, createConditionalDecision } = createConditionExports({ + pluginId: 'scaffolder', + resourceType: RESOURCE_TYPE_SCAFFOLDER_TEMPLATE, + rules: scaffolderTemplateRules, +}); + +/** + * These conditions are used when creating conditional decisions for scaffolder + * templates that are returned by authorization policies. + * + * @alpha + */ +export const scaffolderConditions = conditions; + +/** + * `createScaffolderConditionalDecision` can be used when authoring policies to + * create conditional decisions. It requires a permission of type + * `ResourcePermission<'scaffolder-template'>` to be passed as the first parameter. + * It's recommended that you use the provided `isResourcePermission` and + * `isPermission` helper methods to narrow the type of the permission passed to + * the handle method as shown below. + * + * ``` + * // MyAuthorizationPolicy.ts + * ... + * import { createScaffolderPolicyDecision } from '@backstage/plugin-scaffolder-backend'; + * import { RESOURCE_TYPE_SCAFFOLDER_TEMPLATE } from '@backstage/plugin-scaffolder-common'; + * + * class MyAuthorizationPolicy implements PermissionPolicy { + * async handle(request, user) { + * ... + * + * if (isResourcePermission(request.permission, RESOURCE_TYPE_SCAFFOLDER_TEMPLATE)) { + * return createScaffolderConditionalDecision( + * request.permission, + * { anyOf: [...insert conditions here...] } + * ); + * } + * + * ... + * } + * + * ``` + * + * @alpha + */ +export const createScaffolderConditionalDecision = createConditionalDecision; diff --git a/plugins/scaffolder-backend/src/service/helpers.ts b/plugins/scaffolder-backend/src/service/helpers.ts index 3412fec2d3..97d4ab93aa 100644 --- a/plugins/scaffolder-backend/src/service/helpers.ts +++ b/plugins/scaffolder-backend/src/service/helpers.ts @@ -107,3 +107,7 @@ export async function findTemplate(options: { return template as TemplateEntityV1beta3; } + +export type TemplateTransform = ( + template: TemplateEntityV1beta3, +) => TemplateEntityV1beta3; diff --git a/plugins/scaffolder-backend/src/service/index.ts b/plugins/scaffolder-backend/src/service/index.ts new file mode 100644 index 0000000000..dc5508d47f --- /dev/null +++ b/plugins/scaffolder-backend/src/service/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './conditionExports'; diff --git a/plugins/scaffolder-backend/src/service/router.test.ts b/plugins/scaffolder-backend/src/service/router.test.ts index 5e3c1c7278..4f5ed0fe22 100644 --- a/plugins/scaffolder-backend/src/service/router.test.ts +++ b/plugins/scaffolder-backend/src/service/router.test.ts @@ -44,6 +44,10 @@ import { IdentityApiGetIdentityRequest, BackstageIdentityResponse, } from '@backstage/plugin-auth-node'; +import { + AuthorizeResult, + PermissionEvaluator, +} from '@backstage/plugin-permission-common'; const mockAccess = jest.fn(); @@ -85,8 +89,12 @@ describe('createRouter', () => { let loggerSpy: jest.SpyInstance; let taskBroker: TaskBroker; const catalogClient = { getEntityByRef: jest.fn() } as unknown as CatalogApi; + const permissionApi = { + authorize: jest.fn(), + authorizeConditional: jest.fn(), + } as unknown as PermissionEvaluator; - const mockTemplate: TemplateEntityV1beta3 = { + const getMockTemplate = (): TemplateEntityV1beta3 => ({ apiVersion: 'scaffolder.backstage.io/v1beta3', kind: 'Template', metadata: { @@ -101,19 +109,54 @@ describe('createRouter', () => { spec: { owner: 'web@example.com', type: 'website', - steps: [], - parameters: { - type: 'object', - required: ['required'], - properties: { - required: { - type: 'string', - description: 'Required parameter', + steps: [ + { + id: 'step-one', + name: 'First log', + action: 'debug:log', + input: { + message: 'hello', }, }, - }, + { + id: 'step-two', + name: 'Second log', + action: 'debug:log', + input: { + message: 'world', + }, + 'backstage:permissions': { + tags: ['steps-tag'], + }, + }, + ], + parameters: [ + { + type: 'object', + required: ['requiredParameter1'], + properties: { + requiredParameter1: { + type: 'string', + description: 'Required parameter 1', + }, + }, + }, + { + type: 'object', + required: ['requiredParameter2'], + 'backstage:permissions': { + tags: ['parameters-tag'], + }, + properties: { + requiredParameter2: { + type: 'string', + description: 'Required parameter 2', + }, + }, + }, + ], }, - }; + }); const mockUser: UserEntity = { apiVersion: 'backstage.io/v1alpha1', @@ -152,6 +195,7 @@ describe('createRouter', () => { catalogClient, reader: mockUrlReader, taskBroker, + permissionApi, }); app = express().use(router); @@ -160,15 +204,27 @@ describe('createRouter', () => { .mockImplementation(async ref => { const { kind } = parseEntityRef(ref); - if (kind === 'template') { - return mockTemplate; + if (kind.toLocaleLowerCase() === 'template') { + return getMockTemplate(); } - if (kind === 'user') { + if (kind.toLocaleLowerCase() === 'user') { return mockUser; } + throw new Error(`no mock found for kind: ${kind}`); }); + + jest + .spyOn(permissionApi, 'authorizeConditional') + .mockImplementation(async () => [ + { + result: AuthorizeResult.ALLOW, + }, + { + result: AuthorizeResult.ALLOW, + }, + ]); }); afterEach(() => { @@ -216,12 +272,13 @@ describe('createRouter', () => { name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); - expect(response.body.id).toBe('a-random-id'); expect(response.status).toEqual(201); + expect(response.body.id).toBe('a-random-id'); }); it('should call the broker with a correct spec', async () => { @@ -229,6 +286,7 @@ describe('createRouter', () => { taskBroker.dispatch as jest.Mocked['dispatch']; const mockToken = 'blob.eyJzdWIiOiJ1c2VyOmRlZmF1bHQvZ3Vlc3QiLCJuYW1lIjoiSm9obiBEb2UifQ.blob'; + const mockTemplate = getMockTemplate(); await request(app) .post('/v2/tasks') @@ -239,7 +297,8 @@ describe('createRouter', () => { name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); expect(broker).toHaveBeenCalledWith( @@ -258,7 +317,8 @@ describe('createRouter', () => { })), output: mockTemplate.spec.output ?? {}, parameters: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, user: { entity: mockUser, @@ -284,6 +344,7 @@ describe('createRouter', () => { const broker = taskBroker.dispatch as jest.Mocked['dispatch']; const mockToken = 'blob.eyJzdWIiOiIiLCJuYW1lIjoiSm9obiBEb2UifQ.blob'; + const mockTemplate = getMockTemplate(); await request(app) .post('/v2/tasks') @@ -294,7 +355,8 @@ describe('createRouter', () => { name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); expect(broker).toHaveBeenCalledWith( @@ -313,7 +375,8 @@ describe('createRouter', () => { })), output: mockTemplate.spec.output ?? {}, parameters: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, user: { entity: undefined, @@ -347,7 +410,8 @@ describe('createRouter', () => { name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); @@ -370,7 +434,8 @@ describe('createRouter', () => { name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); @@ -393,7 +458,8 @@ describe('createRouter', () => { name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); @@ -713,6 +779,7 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ }); }); }); + describe('providing an identity api', () => { beforeEach(async () => { const logger = getVoidLogger(); @@ -752,6 +819,7 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ reader: mockUrlReader, taskBroker, identity: { getIdentity }, + permissionApi, }); app = express().use(router); @@ -760,15 +828,26 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ .mockImplementation(async ref => { const { kind } = parseEntityRef(ref); - if (kind === 'template') { - return mockTemplate; + if (kind.toLocaleLowerCase() === 'template') { + return getMockTemplate(); } - if (kind === 'user') { + if (kind.toLocaleLowerCase() === 'user') { return mockUser; } throw new Error(`no mock found for kind: ${kind}`); }); + + jest + .spyOn(permissionApi, 'authorizeConditional') + .mockImplementation(async () => [ + { + result: AuthorizeResult.ALLOW, + }, + { + result: AuthorizeResult.ALLOW, + }, + ]); }); afterEach(() => { @@ -784,6 +863,125 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ }); }); + describe('GET /v2/templates/:namespace/:kind/:name/parameter-schema', () => { + it('returns the parameter schema', async () => { + const response = await request(app) + .get( + '/v2/templates/default/Template/create-react-app-template/parameter-schema', + ) + .send(); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + title: 'Create React App Template', + description: 'Create a new CRA website project', + steps: [ + { + title: 'Please enter the following information', + schema: { + required: ['requiredParameter1'], + type: 'object', + properties: { + requiredParameter1: { + description: 'Required parameter 1', + type: 'string', + }, + }, + }, + }, + { + title: 'Please enter the following information', + schema: { + type: 'object', + required: ['requiredParameter2'], + 'backstage:permissions': { + tags: ['parameters-tag'], + }, + properties: { + requiredParameter2: { + type: 'string', + description: 'Required parameter 2', + }, + }, + }, + }, + ], + }); + }); + + it('filters parameters that the user is not authorized to see', async () => { + jest + .spyOn(permissionApi, 'authorizeConditional') + .mockImplementationOnce(async () => [ + { + result: AuthorizeResult.DENY, + }, + { + result: AuthorizeResult.ALLOW, + }, + ]); + const response = await request(app) + .get( + '/v2/templates/default/Template/create-react-app-template/parameter-schema', + ) + .send(); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + title: 'Create React App Template', + description: 'Create a new CRA website project', + steps: [], + }); + }); + + it('filters parameters that the user is not authorized to see in case of conditional decision', async () => { + jest + .spyOn(permissionApi, 'authorizeConditional') + .mockImplementationOnce(async () => [ + { + conditions: { + resourceType: 'scaffolder-template', + rule: 'HAS_TAG', + params: { tag: 'parameters-tag' }, + }, + pluginId: 'scaffolder', + resourceType: 'scaffolder-template', + result: AuthorizeResult.CONDITIONAL, + }, + { + result: AuthorizeResult.ALLOW, + }, + ]); + const response = await request(app) + .get( + '/v2/templates/default/Template/create-react-app-template/parameter-schema', + ) + .send(); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + title: 'Create React App Template', + description: 'Create a new CRA website project', + steps: [ + { + title: 'Please enter the following information', + schema: { + type: 'object', + required: ['requiredParameter2'], + 'backstage:permissions': { + tags: ['parameters-tag'], + }, + properties: { + requiredParameter2: { + type: 'string', + description: 'Required parameter 2', + }, + }, + }, + }, + ], + }); + }); + }); + describe('POST /v2/tasks', () => { it('rejects template values which do not match the template schema definition', async () => { const response = await request(app) @@ -801,6 +999,150 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ expect(response.status).toEqual(400); }); + it('filters steps that the user is not authorized to see', async () => { + jest + .spyOn(permissionApi, 'authorizeConditional') + .mockImplementation(async () => [ + { + result: AuthorizeResult.ALLOW, + }, + { + result: AuthorizeResult.DENY, + }, + ]); + + const broker = + taskBroker.dispatch as jest.Mocked['dispatch']; + const mockTemplate = getMockTemplate(); + + await request(app) + .post('/v2/tasks') + .send({ + templateRef: stringifyEntityRef({ + kind: 'template', + name: 'create-react-app-template', + }), + values: { + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', + }, + }); + expect(broker).toHaveBeenCalledWith( + expect.objectContaining({ + createdBy: 'user:default/guest', + secrets: { + backstageToken: 'token', + }, + + spec: { + apiVersion: mockTemplate.apiVersion, + steps: [], + output: mockTemplate.spec.output ?? {}, + parameters: { + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', + }, + user: { + entity: mockUser, + ref: 'user:default/guest', + }, + templateInfo: { + entityRef: stringifyEntityRef({ + kind: 'Template', + namespace: 'Default', + name: mockTemplate.metadata?.name, + }), + baseUrl: 'https://dev.azure.com', + entity: { + metadata: mockTemplate.metadata, + }, + }, + }, + }), + ); + }); + + it('filters steps that the user is not authorized to see in case of conditional decision', async () => { + jest + .spyOn(permissionApi, 'authorizeConditional') + .mockImplementation(async () => [ + { + result: AuthorizeResult.ALLOW, + }, + { + conditions: { + resourceType: 'scaffolder-template', + rule: 'HAS_TAG', + params: { tag: 'steps-tag' }, + }, + pluginId: 'scaffolder', + resourceType: 'scaffolder-template', + result: AuthorizeResult.CONDITIONAL, + }, + ]); + + const broker = + taskBroker.dispatch as jest.Mocked['dispatch']; + const mockTemplate = getMockTemplate(); + await request(app) + .post('/v2/tasks') + .send({ + templateRef: stringifyEntityRef({ + kind: 'template', + name: 'create-react-app-template', + }), + values: { + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', + }, + }); + expect(broker).toHaveBeenCalledWith( + expect.objectContaining({ + createdBy: 'user:default/guest', + secrets: { + backstageToken: 'token', + }, + + spec: { + apiVersion: mockTemplate.apiVersion, + steps: [ + { + id: 'step-two', + name: 'Second log', + action: 'debug:log', + input: { + message: 'world', + }, + 'backstage:permissions': { + tags: ['steps-tag'], + }, + }, + ], + output: mockTemplate.spec.output ?? {}, + parameters: { + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', + }, + user: { + entity: mockUser, + ref: 'user:default/guest', + }, + templateInfo: { + entityRef: stringifyEntityRef({ + kind: 'Template', + namespace: 'Default', + name: mockTemplate.metadata?.name, + }), + baseUrl: 'https://dev.azure.com', + entity: { + metadata: mockTemplate.metadata, + }, + }, + }, + }), + ); + }); + it('return the template id', async () => { const broker = taskBroker.dispatch as jest.Mocked['dispatch']; @@ -816,7 +1158,8 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); @@ -827,6 +1170,7 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ it('should call the broker with a correct spec', async () => { const broker = taskBroker.dispatch as jest.Mocked['dispatch']; + const mockTemplate = getMockTemplate(); await request(app) .post('/v2/tasks') @@ -836,7 +1180,8 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); expect(broker).toHaveBeenCalledWith( @@ -855,7 +1200,8 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ })), output: mockTemplate.spec.output ?? {}, parameters: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, user: { entity: mockUser, @@ -898,7 +1244,8 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); expect(response.status).not.toEqual(201); @@ -930,7 +1277,8 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); @@ -953,7 +1301,8 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); @@ -973,7 +1322,8 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ name: 'create-react-app-template', }), values: { - required: 'required-value', + requiredParameter1: 'required-value-1', + requiredParameter2: 'required-value-2', }, }); diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index dfccc4dc43..1f2d390f9f 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -18,6 +18,7 @@ import { PluginDatabaseManager, UrlReader } from '@backstage/backend-common'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { CatalogApi } from '@backstage/catalog-client'; import { + CompoundEntityRef, Entity, parseEntityRef, stringifyEntityRef, @@ -31,7 +32,15 @@ import { TaskSpec, TemplateEntityV1beta3, templateEntityV1beta3Validator, + TemplateParametersV1beta3, + TemplateEntityStepV1beta3, } from '@backstage/plugin-scaffolder-common'; +import { + RESOURCE_TYPE_SCAFFOLDER_TEMPLATE, + scaffolderPermissions, + templateParameterReadPermission, + templateStepReadPermission, +} from '@backstage/plugin-scaffolder-common/alpha'; import express from 'express'; import Router from 'express-promise-router'; import { validate } from 'jsonschema'; @@ -53,6 +62,29 @@ import { IdentityApiGetIdentityRequest, } from '@backstage/plugin-auth-node'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { + PermissionEvaluator, + PermissionRuleParams, +} from '@backstage/plugin-permission-common'; +import { + createConditionAuthorizer, + createPermissionIntegrationRouter, + PermissionRule, +} from '@backstage/plugin-permission-node'; +import { scaffolderTemplateRules } from './rules'; + +/** + * + * @public + */ +export type TemplatePermissionRuleInput< + TParams extends PermissionRuleParams = PermissionRuleParams, +> = PermissionRule< + TemplateEntityStepV1beta3 | TemplateParametersV1beta3, + {}, + typeof RESOURCE_TYPE_SCAFFOLDER_TEMPLATE, + TParams +>; /** * RouterOptions @@ -80,6 +112,8 @@ export interface RouterOptions { taskBroker?: TaskBroker; additionalTemplateFilters?: Record; additionalTemplateGlobals?: Record; + permissionApi?: PermissionEvaluator; + permissionRules?: TemplatePermissionRuleInput[]; identity?: IdentityApi; } @@ -174,6 +208,8 @@ export async function createRouter( scheduler, additionalTemplateFilters, additionalTemplateGlobals, + permissionApi, + permissionRules, } = options; const logger = parentLogger.child({ plugin: 'scaffolder' }); @@ -249,41 +285,46 @@ export async function createRouter( additionalTemplateGlobals, }); + const templateRules: TemplatePermissionRuleInput[] = Object.values( + scaffolderTemplateRules, + ); + + if (permissionRules) { + templateRules.push(...permissionRules); + } + + const isAuthorized = createConditionAuthorizer(Object.values(templateRules)); + + const permissionIntegrationRouter = createPermissionIntegrationRouter({ + resourceType: RESOURCE_TYPE_SCAFFOLDER_TEMPLATE, + permissions: scaffolderPermissions, + rules: templateRules, + }); + + router.use(permissionIntegrationRouter); + router .get( '/v2/templates/:namespace/:kind/:name/parameter-schema', async (req, res) => { - const { namespace, kind, name } = req.params; - const userIdentity = await identity.getIdentity({ request: req, }); const token = userIdentity?.token; - const template = await findTemplate({ - catalogApi: catalogClient, - entityRef: { kind, namespace, name }, - token, + const template = await authorizeTemplate(req.params, token); + + const parameters = [template.spec.parameters ?? []].flat(); + res.json({ + title: template.metadata.title ?? template.metadata.name, + description: template.metadata.description, + 'ui:options': template.metadata['ui:options'], + steps: parameters.map(schema => ({ + title: schema.title ?? 'Please enter the following information', + description: schema.description, + schema, + })), }); - if (isSupportedTemplate(template)) { - const parameters = [template.spec.parameters ?? []].flat(); - res.json({ - title: template.metadata.title ?? template.metadata.name, - description: template.metadata.description, - 'ui:options': template.metadata['ui:options'], - steps: parameters.map(schema => ({ - title: schema.title ?? 'Please enter the following information', - description: schema.description, - schema, - })), - }); - } else { - throw new InputError( - `Unsupported apiVersion field in schema entity, ${ - (template as Entity).apiVersion - }`, - ); - } }, ) .get('/v2/actions', async (_req, res) => { @@ -321,22 +362,14 @@ export async function createRouter( const values = req.body.values; - const template = await findTemplate({ - catalogApi: catalogClient, - entityRef: { kind, namespace, name }, + const template = await authorizeTemplate( + { kind, namespace, name }, token, - }); - - if (!isSupportedTemplate(template)) { - throw new InputError( - `Unsupported apiVersion field in schema entity, ${ - (template as Entity).apiVersion - }`, - ); - } + ); for (const parameters of [template.spec.parameters ?? []].flat()) { const result = validate(values, parameters); + if (!result.valid) { res.status(400).json({ errors: result.errors }); return; @@ -414,6 +447,11 @@ export async function createRouter( delete task.secrets; res.status(200).json(task); }) + .post('/v2/tasks/:taskId/cancel', async (req, res) => { + const { taskId } = req.params; + await taskBroker.cancel?.(taskId); + res.status(200).json({ status: 'cancelled' }); + }) .get('/v2/tasks/:taskId/eventstream', async (req, res) => { const { taskId } = req.params; const after = @@ -562,5 +600,56 @@ export async function createRouter( app.set('logger', logger); app.use('/', router); + async function authorizeTemplate( + entityRef: CompoundEntityRef, + token: string | undefined, + ) { + const template = await findTemplate({ + catalogApi: catalogClient, + entityRef, + token, + }); + + if (!isSupportedTemplate(template)) { + throw new InputError( + `Unsupported apiVersion field in schema entity, ${ + (template as Entity).apiVersion + }`, + ); + } + + if (!permissionApi) { + return template; + } + + const [parameterDecision, stepDecision] = + await permissionApi.authorizeConditional( + [ + { permission: templateParameterReadPermission }, + { permission: templateStepReadPermission }, + ], + { token }, + ); + + // Authorize parameters + if (Array.isArray(template.spec.parameters)) { + template.spec.parameters = template.spec.parameters.filter(step => + isAuthorized(parameterDecision, step), + ); + } else if ( + template.spec.parameters && + !isAuthorized(parameterDecision, template.spec.parameters) + ) { + template.spec.parameters = undefined; + } + + // Authorize steps + template.spec.steps = template.spec.steps.filter(step => + isAuthorized(stepDecision, step), + ); + + return template; + } + return app; } diff --git a/plugins/scaffolder-backend/src/service/rules.test.ts b/plugins/scaffolder-backend/src/service/rules.test.ts new file mode 100644 index 0000000000..7d8e0eb445 --- /dev/null +++ b/plugins/scaffolder-backend/src/service/rules.test.ts @@ -0,0 +1,81 @@ +/* + * 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 { hasTag } from './rules'; + +describe('hasTag', () => { + describe('apply', () => { + it('returns false when the tag is not present', () => { + expect( + hasTag.apply( + { + 'backstage:permissions': { + tags: ['foo', 'bar'], + }, + }, + { + tag: 'baz', + }, + ), + ).toEqual(false); + }); + + it('returns false when backstage:permissions is missing', () => { + expect( + hasTag.apply( + {}, + { + tag: 'baz', + }, + ), + ).toEqual(false); + }); + + it('returns false when tags is an empty array', () => { + expect( + hasTag.apply( + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + 'backstage:permissions': { + tags: [], + }, + }, + }, + { + tag: 'baz', + }, + ), + ).toEqual(false); + }); + + it('returns true when the tag is present', () => { + expect( + hasTag.apply( + { + 'backstage:permissions': { + tags: ['foo', 'bar'], + }, + }, + { + tag: 'bar', + }, + ), + ).toEqual(true); + }); + }); +}); diff --git a/plugins/scaffolder-backend/src/service/rules.ts b/plugins/scaffolder-backend/src/service/rules.ts new file mode 100644 index 0000000000..d94f7dd4f4 --- /dev/null +++ b/plugins/scaffolder-backend/src/service/rules.ts @@ -0,0 +1,45 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { makeCreatePermissionRule } from '@backstage/plugin-permission-node'; +import { + TemplateEntityStepV1beta3, + TemplateParametersV1beta3, +} from '@backstage/plugin-scaffolder-common'; +import { RESOURCE_TYPE_SCAFFOLDER_TEMPLATE } from '@backstage/plugin-scaffolder-common/alpha'; + +import { z } from 'zod'; + +export const createScaffolderPermissionRule = makeCreatePermissionRule< + TemplateEntityStepV1beta3 | TemplateParametersV1beta3, + {}, + typeof RESOURCE_TYPE_SCAFFOLDER_TEMPLATE +>(); + +export const hasTag = createScaffolderPermissionRule({ + name: 'HAS_TAG', + resourceType: RESOURCE_TYPE_SCAFFOLDER_TEMPLATE, + description: `Match parameters or steps with the given tag`, + paramsSchema: z.object({ + tag: z.string().describe('Name of the tag to match on'), + }), + apply: (resource, { tag }) => { + return resource['backstage:permissions']?.tags?.includes(tag) ?? false; + }, + toQuery: () => ({}), +}); + +export const scaffolderTemplateRules = { hasTag }; diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 8b50ec85a9..83e32d4d30 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-scaffolder-common +## 1.2.7-next.0 + +### Patch Changes + +- 48da4c46e45: Export `typeguard` for `isTemplateEntityV1beta3` +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## 1.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + ## 1.2.6-next.1 ### Patch Changes diff --git a/plugins/scaffolder-common/alpha-api-report.md b/plugins/scaffolder-common/alpha-api-report.md new file mode 100644 index 0000000000..e89999ad85 --- /dev/null +++ b/plugins/scaffolder-common/alpha-api-report.md @@ -0,0 +1,21 @@ +## API Report File for "@backstage/plugin-scaffolder-common" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ResourcePermission } from '@backstage/plugin-permission-common'; + +// @alpha +export const RESOURCE_TYPE_SCAFFOLDER_TEMPLATE = 'scaffolder-template'; + +// @alpha +export const scaffolderPermissions: ResourcePermission<'scaffolder-template'>[]; + +// @alpha +export const templateParameterReadPermission: ResourcePermission<'scaffolder-template'>; + +// @alpha +export const templateStepReadPermission: ResourcePermission<'scaffolder-template'>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/scaffolder-common/api-report.md b/plugins/scaffolder-common/api-report.md index 8864c0d76d..7c40780b57 100644 --- a/plugins/scaffolder-common/api-report.md +++ b/plugins/scaffolder-common/api-report.md @@ -10,6 +10,11 @@ import type { JsonValue } from '@backstage/types'; import { KindValidator } from '@backstage/catalog-model'; import type { UserEntity } from '@backstage/catalog-model'; +// @public +export const isTemplateEntityV1beta3: ( + entity: Entity, +) => entity is TemplateEntityV1beta3; + // @public export type TaskSpec = TaskSpecV1beta3; @@ -37,20 +42,30 @@ export interface TaskStep { name: string; } +// @public +export interface TemplateEntityStepV1beta3 extends JsonObject { + // (undocumented) + 'backstage:permissions'?: TemplatePermissionsV1beta3; + // (undocumented) + action: string; + // (undocumented) + id?: string; + // (undocumented) + if?: string | boolean; + // (undocumented) + input?: JsonObject; + // (undocumented) + name?: string; +} + // @public export interface TemplateEntityV1beta3 extends Entity { apiVersion: 'scaffolder.backstage.io/v1beta3'; kind: 'Template'; spec: { type: string; - parameters?: JsonObject | JsonObject[]; - steps: Array<{ - id?: string; - name?: string; - action: string; - input?: JsonObject; - if?: string | boolean; - }>; + parameters?: TemplateParametersV1beta3 | TemplateParametersV1beta3[]; + steps: Array; output?: { [name: string]: string; }; @@ -69,4 +84,16 @@ export type TemplateInfo = { metadata: EntityMeta; }; }; + +// @public +export interface TemplateParametersV1beta3 extends JsonObject { + // (undocumented) + 'backstage:permissions'?: TemplatePermissionsV1beta3; +} + +// @public +export interface TemplatePermissionsV1beta3 extends JsonObject { + // (undocumented) + tags?: string[]; +} ``` diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index a64185d681..41c1b28fc1 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-common", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", - "version": "1.2.6-next.1", + "version": "1.2.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -11,6 +11,21 @@ "module": "dist/index.esm.js", "types": "dist/index.d.ts" }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, "backstage": { "role": "common-library" }, @@ -39,6 +54,7 @@ }, "dependencies": { "@backstage/catalog-model": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", "@backstage/types": "workspace:^" }, "devDependencies": { diff --git a/plugins/scaffolder-common/src/Template.v1beta3.schema.json b/plugins/scaffolder-common/src/Template.v1beta3.schema.json index e45bfb788d..beb0ca5e31 100644 --- a/plugins/scaffolder-common/src/Template.v1beta3.schema.json +++ b/plugins/scaffolder-common/src/Template.v1beta3.schema.json @@ -16,6 +16,9 @@ "owner": "artist-relations-team", "parameters": { "required": ["name", "description", "repoUrl"], + "backstage:permissions": { + "tags": ["one", "two"] + }, "properties": { "name": { "title": "Name", @@ -41,6 +44,9 @@ "action": "fetch:plain", "parameters": { "url": "./template" + }, + "backstage:permissions": { + "tags": ["one", "two"] } }, { @@ -92,14 +98,42 @@ "oneOf": [ { "type": "object", - "description": "The JSONSchema describing the inputs for the template." + "description": "The JSONSchema describing the inputs for the template.", + "properties": { + "backstage:permissions": { + "type": "object", + "description": "Object used for authorizing the parameter", + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } }, { "type": "array", "description": "A list of separate forms to collect parameters.", "items": { "type": "object", - "description": "The JSONSchema describing the inputs for the template." + "description": "The JSONSchema describing the inputs for the template.", + "properties": { + "backstage:permissions": { + "type": "object", + "description": "Object used for authorizing the parameter", + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } } } ] @@ -131,6 +165,18 @@ "if": { "type": ["string", "boolean"], "description": "A templated condition that skips the step when evaluated to false. If the condition is true or not defined, the step is executed. The condition is true, if the input is not `false`, `undefined`, `null`, `\"\"`, `0`, or `[]`." + }, + "backstage:permissions": { + "type": "object", + "description": "Object used for authorizing the step", + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + } } } } diff --git a/plugins/scaffolder-common/src/TemplateEntityV1beta3.test.ts b/plugins/scaffolder-common/src/TemplateEntityV1beta3.test.ts index ab5900ab32..432292548e 100644 --- a/plugins/scaffolder-common/src/TemplateEntityV1beta3.test.ts +++ b/plugins/scaffolder-common/src/TemplateEntityV1beta3.test.ts @@ -15,7 +15,10 @@ */ import { entityKindSchemaValidator } from '@backstage/catalog-model'; -import type { TemplateEntityV1beta3 } from './TemplateEntityV1beta3'; +import type { + TemplateEntityV1beta3, + TemplateParametersV1beta3, +} from './TemplateEntityV1beta3'; import schema from './Template.v1beta3.schema.json'; const validator = entityKindSchemaValidator(schema); @@ -35,6 +38,7 @@ describe('templateEntityV1beta3Validator', () => { owner: 'team-b', parameters: { required: ['owner'], + 'backstage:permissions': { tags: ['one', 'two'] }, properties: { owner: { type: 'string', @@ -52,6 +56,9 @@ describe('templateEntityV1beta3Validator', () => { url: './template', }, if: '${{ parameters.owner }}', + 'backstage:permissions': { + tags: ['one', 'two'], + }, }, ], output: { @@ -154,4 +161,24 @@ describe('templateEntityV1beta3Validator', () => { (entity as any).spec.steps[0].if = 5; expect(() => validator(entity)).toThrow(/if/); }); + + it('rejects parameters with wrong backstage:permissions', async () => { + (entity.spec.parameters as TemplateParametersV1beta3)[ + 'backstage:permissions' + ]!.tags = true as unknown as []; + expect(() => validator(entity)).toThrow(/must be array/); + + (entity.spec.parameters as TemplateParametersV1beta3)[ + 'backstage:permissions' + ] = true as {}; + expect(() => validator(entity)).toThrow(/must be object/); + }); + + it('rejects steps with wrong backstage:permissions', async () => { + entity.spec.steps[0]['backstage:permissions']!.tags = true as unknown as []; + expect(() => validator(entity)).toThrow(/must be array/); + + entity.spec.steps[0]['backstage:permissions'] = true as {}; + expect(() => validator(entity)).toThrow(/must be object/); + }); }); diff --git a/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts b/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts index 8ded484ee2..ebabb5cad4 100644 --- a/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts +++ b/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts @@ -50,18 +50,12 @@ export interface TemplateEntityV1beta3 extends Entity { * to collect user input and validate it against that schema. This can then be used in the `steps` part below to template * variables passed from the user into each action in the template. */ - parameters?: JsonObject | JsonObject[]; + parameters?: TemplateParametersV1beta3 | TemplateParametersV1beta3[]; /** * A list of steps to be executed in sequence which are defined by the template. These steps are a list of the underlying * javascript action and some optional input parameters that may or may not have been collected from the end user. */ - steps: Array<{ - id?: string; - name?: string; - action: string; - input?: JsonObject; - if?: string | boolean; - }>; + steps: Array; /** * The output is an object where template authors can pull out information from template actions and return them in a known standard way. */ @@ -73,6 +67,38 @@ export interface TemplateEntityV1beta3 extends Entity { }; } +/** + * Step that is part of a Template Entity. + * + * @public + */ +export interface TemplateEntityStepV1beta3 extends JsonObject { + id?: string; + name?: string; + action: string; + input?: JsonObject; + if?: string | boolean; + 'backstage:permissions'?: TemplatePermissionsV1beta3; +} + +/** + * Parameter that is part of a Template Entity. + * + * @public + */ +export interface TemplateParametersV1beta3 extends JsonObject { + 'backstage:permissions'?: TemplatePermissionsV1beta3; +} + +/** + * Access control properties for parts of a template. + * + * @public + */ +export interface TemplatePermissionsV1beta3 extends JsonObject { + tags?: string[]; +} + const validator = entityKindSchemaValidator(schema); /** @@ -86,3 +112,13 @@ export const templateEntityV1beta3Validator: KindValidator = { return validator(data) === data; }, }; + +/** + * Typeguard for filtering entities and ensuring v1beta3 entities + * @public + */ +export const isTemplateEntityV1beta3 = ( + entity: Entity, +): entity is TemplateEntityV1beta3 => + entity.apiVersion === 'scaffolder.backstage.io/v1beta3' && + entity.kind === 'Template'; diff --git a/plugins/scaffolder-common/src/alpha.ts b/plugins/scaffolder-common/src/alpha.ts new file mode 100644 index 0000000000..9a8c021d15 --- /dev/null +++ b/plugins/scaffolder-common/src/alpha.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './permissions'; diff --git a/plugins/scaffolder-common/src/index.ts b/plugins/scaffolder-common/src/index.ts index 521e678ab6..fd34fe6f41 100644 --- a/plugins/scaffolder-common/src/index.ts +++ b/plugins/scaffolder-common/src/index.ts @@ -21,5 +21,14 @@ */ export * from './TaskSpec'; -export { templateEntityV1beta3Validator } from './TemplateEntityV1beta3'; -export type { TemplateEntityV1beta3 } from './TemplateEntityV1beta3'; + +export { + templateEntityV1beta3Validator, + isTemplateEntityV1beta3, +} from './TemplateEntityV1beta3'; +export type { + TemplateEntityV1beta3, + TemplateEntityStepV1beta3, + TemplateParametersV1beta3, + TemplatePermissionsV1beta3, +} from './TemplateEntityV1beta3'; diff --git a/plugins/scaffolder-common/src/permissions.ts b/plugins/scaffolder-common/src/permissions.ts new file mode 100644 index 0000000000..858430eaf3 --- /dev/null +++ b/plugins/scaffolder-common/src/permissions.ts @@ -0,0 +1,69 @@ +/* + * 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 { createPermission } from '@backstage/plugin-permission-common'; + +/** + * Permission resource type which corresponds to a scaffolder templates. + * + * @alpha + */ +export const RESOURCE_TYPE_SCAFFOLDER_TEMPLATE = 'scaffolder-template'; + +/** + * This permission is used to authorize actions that involve reading + * one or more parameters from a template. + * + * If this permission is not authorized, it will appear that the + * parameter does not exist in the template — both in the frontend + * and in API responses. + * + * @alpha + */ +export const templateParameterReadPermission = createPermission({ + name: 'scaffolder.template.parameter.read', + attributes: { + action: 'read', + }, + resourceType: RESOURCE_TYPE_SCAFFOLDER_TEMPLATE, +}); + +/** + * This permission is used to authorize actions that involve reading + * one or more steps from a template. + * + * If this permission is not authorized, it will appear that the + * step does not exist in the template — both in the frontend + * and in API responses. Steps will also not be executed. + * + * @alpha + */ +export const templateStepReadPermission = createPermission({ + name: 'scaffolder.template.step.read', + attributes: { + action: 'read', + }, + resourceType: RESOURCE_TYPE_SCAFFOLDER_TEMPLATE, +}); + +/** + * List of all the scaffolder permissions + * @alpha + */ +export const scaffolderPermissions = [ + templateParameterReadPermission, + templateStepReadPermission, +]; diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index 37b9613524..aa73af9a1f 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-scaffolder-node +## 0.1.2-next.0 + +### Patch Changes + +- e27ddc36dad: Added a possibility to cancel the running task (executing of a scaffolder template) +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.0 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.6 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index 89b7171ef9..d5b9b73767 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -30,6 +30,7 @@ export type ActionContext = { entity?: UserEntity; ref?: string; }; + signal?: AbortSignal; }; // @public diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 8978c155bf..d63fddc0b5 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-node", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", - "version": "0.1.1-next.2", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -30,8 +30,8 @@ "@backstage/types": "workspace:^", "jsonschema": "^1.2.6", "winston": "^3.2.1", - "zod": "~3.18.0", - "zod-to-json-schema": "~3.18.0" + "zod": "^3.21.4", + "zod-to-json-schema": "^3.20.4" }, "devDependencies": { "@backstage/cli": "workspace:^" diff --git a/plugins/scaffolder-node/src/actions/types.ts b/plugins/scaffolder-node/src/actions/types.ts index cce149adbe..8827aaf98c 100644 --- a/plugins/scaffolder-node/src/actions/types.ts +++ b/plugins/scaffolder-node/src/actions/types.ts @@ -60,6 +60,11 @@ export type ActionContext = { */ ref?: string; }; + + /** + * Implement the signal to make your custom step abortable https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal + */ + signal?: AbortSignal; }; /** @public */ diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 25385e4816..5993000724 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-scaffolder-react +## 1.3.0-next.0 + +### Minor Changes + +- 259d3407b9b: Move `CategoryPicker` from `scaffolder` into `scaffolder-react` + Move `ContextMenu` into `scaffolder-react` and rename it to `ScaffolderPageContextMenu` +- 2cfd03d7376: To offer better customization options, `ScaffolderPageContextMenu` takes callbacks as props instead of booleans +- 48da4c46e45: `scaffolder/next`: Export the `TemplateGroupFilter` and `TemplateGroups` and make an extensible component + +### Patch Changes + +- e27ddc36dad: Added a possibility to cancel the running task (executing of a scaffolder template) +- 7a6b16cc506: `scaffolder/next`: Bump `@rjsf/*` deps to 5.3.1 +- f84fc7fd040: Updated dependency `@rjsf/validator-ajv8` to `5.3.0`. +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.2.0 + +### Minor Changes + +- 8f4d13f21cf: Move `useTaskStream`, `TaskBorder`, `TaskLogStream` and `TaskSteps` into `scaffolder-react`. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- c8d78b9ae9d: fix bug with `hasErrors` returning false when dealing with empty objects +- 9b8c374ace5: Remove timer for skipped steps in Scaffolder Next's TaskSteps +- 44941fc97eb: scaffolder/next: Move the `uiSchema` to its own property in the validation `context` to align with component development and access of `ui:options` +- d9893263ba9: scaffolder/next: Fix for steps without properties +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- cc418d652a7: scaffolder/next: Added the ability to get the fields definition in the schema in the validation function +- d4100d0ec42: Fix alignment bug for owners on `TemplateCard` +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-scaffolder-common@1.2.6 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/scaffolder-react/alpha-api-report.md b/plugins/scaffolder-react/alpha-api-report.md index 35029cb796..319e3963f0 100644 --- a/plugins/scaffolder-react/alpha-api-report.md +++ b/plugins/scaffolder-react/alpha-api-report.md @@ -132,6 +132,18 @@ export type ReviewStateProps = { formState: JsonObject; }; +// @alpha (undocumented) +export function ScaffolderPageContextMenu( + props: ScaffolderPageContextMenuProps, +): JSX.Element | null; + +// @alpha (undocumented) +export type ScaffolderPageContextMenuProps = { + onEditorClicked?: () => void; + onActionsClicked?: () => void; + onTasksClicked?: () => void; +}; + // @alpha export const Stepper: (stepperProps: StepperProps) => JSX.Element; @@ -190,9 +202,18 @@ export interface TemplateCardProps { template: TemplateEntityV1beta3; } +// @alpha +export const TemplateCategoryPicker: () => JSX.Element | null; + // @alpha export const TemplateGroup: (props: TemplateGroupProps) => JSX.Element; +// @alpha (undocumented) +export type TemplateGroupFilter = { + title?: React_2.ReactNode; + filter: (entity: TemplateEntityV1beta3) => boolean; +}; + // @alpha export interface TemplateGroupProps { // (undocumented) @@ -214,6 +235,29 @@ export interface TemplateGroupProps { title: React_2.ReactNode; } +// @alpha (undocumented) +export const TemplateGroups: (props: TemplateGroupsProps) => JSX.Element | null; + +// @alpha (undocumented) +export interface TemplateGroupsProps { + // (undocumented) + additionalLinksForEntity?: (template: TemplateEntityV1beta3) => { + icon: IconComponent; + text: string; + url: string; + }[]; + // (undocumented) + groups: TemplateGroupFilter[]; + // (undocumented) + onTemplateSelected?: (template: TemplateEntityV1beta3) => void; + // (undocumented) + TemplateCardComponent?: React_2.ComponentType<{ + template: TemplateEntityV1beta3; + }>; + // (undocumented) + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; +} + // @alpha export const useFormDataFromQuery: ( initialState?: Record, diff --git a/plugins/scaffolder-react/api-report.md b/plugins/scaffolder-react/api-report.md index 0fbc8d0eed..da8309d5ec 100644 --- a/plugins/scaffolder-react/api-report.md +++ b/plugins/scaffolder-react/api-report.md @@ -113,7 +113,7 @@ export type ListActionsResponse = Array; // @public export type LogEvent = { - type: 'log' | 'completion'; + type: 'log' | 'completion' | 'cancelled'; body: { message: string; stepId?: string; @@ -126,6 +126,7 @@ export type LogEvent = { // @public export interface ScaffolderApi { + cancelTask(taskId: string): Promise; // (undocumented) dryRun?(options: ScaffolderDryRunOptions): Promise; // (undocumented) @@ -266,10 +267,11 @@ export type ScaffolderTaskOutput = { // @public export type ScaffolderTaskStatus = + | 'cancelled' + | 'completed' + | 'failed' | 'open' | 'processing' - | 'failed' - | 'completed' | 'skipped'; // @public @@ -287,6 +289,7 @@ export const SecretsContextProvider: ( // @public export type TaskStream = { + cancelled: boolean; loading: boolean; error?: Error; stepLogs: { diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 4e0cb590e4..db0b30c758 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-react", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", - "version": "1.2.0-next.2", + "version": "1.3.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -57,14 +57,14 @@ "@backstage/version-bridge": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^20.0.0", "@rjsf/core": "^3.2.1", - "@rjsf/core-v5": "npm:@rjsf/core@5.1.0", + "@rjsf/core-v5": "npm:@rjsf/core@5.3.1", "@rjsf/material-ui": "^3.2.1", - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.1.0", - "@rjsf/utils": "5.1.0", - "@rjsf/validator-ajv8": "5.1.0", + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.3.1", + "@rjsf/utils": "5.3.1", + "@rjsf/validator-ajv8": "5.3.1", "@types/json-schema": "^7.0.9", "classnames": "^2.2.6", "humanize-duration": "^3.25.1", @@ -77,8 +77,8 @@ "react-use": "^17.2.4", "use-immer": "^0.8.0", "zen-observable": "^0.10.0", - "zod": "~3.18.0", - "zod-to-json-schema": "~3.18.0" + "zod": "^3.21.4", + "zod-to-json-schema": "^3.20.4" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0", diff --git a/plugins/scaffolder-react/src/api/types.ts b/plugins/scaffolder-react/src/api/types.ts index 0a517e7bff..b39555c14f 100644 --- a/plugins/scaffolder-react/src/api/types.ts +++ b/plugins/scaffolder-react/src/api/types.ts @@ -24,10 +24,11 @@ import { TemplateParameterSchema } from '../types'; * @public */ export type ScaffolderTaskStatus = + | 'cancelled' + | 'completed' + | 'failed' | 'open' | 'processing' - | 'failed' - | 'completed' | 'skipped'; /** @@ -96,7 +97,7 @@ export type ScaffolderTaskOutput = { * @public */ export type LogEvent = { - type: 'log' | 'completion'; + type: 'log' | 'completion' | 'cancelled'; body: { message: string; stepId?: string; @@ -196,6 +197,13 @@ export interface ScaffolderApi { getTask(taskId: string): Promise; + /** + * Sends a signal to a task broker to cancel the running task by taskId. + * + * @param taskId - the id of the task + */ + cancelTask(taskId: string): Promise; + listTasks?(options: { filterByOwnership: 'owned' | 'all'; }): Promise<{ tasks: ScaffolderTask[] }>; diff --git a/plugins/scaffolder-react/src/hooks/useEventStream.ts b/plugins/scaffolder-react/src/hooks/useEventStream.ts index d8c9cf4c1f..ec49911471 100644 --- a/plugins/scaffolder-react/src/hooks/useEventStream.ts +++ b/plugins/scaffolder-react/src/hooks/useEventStream.ts @@ -44,6 +44,7 @@ export type ScaffolderStep = { * @public */ export type TaskStream = { + cancelled: boolean; loading: boolean; error?: Error; stepLogs: { [stepId in string]: string[] }; @@ -66,6 +67,7 @@ type ReducerLogEntry = { type ReducerAction = | { type: 'INIT'; data: ScaffolderTask } + | { type: 'CANCELLED' } | { type: 'LOGS'; data: ReducerLogEntry[] } | { type: 'COMPLETED'; data: ReducerLogEntry } | { type: 'ERROR'; data: Error }; @@ -111,7 +113,7 @@ function reducer(draft: TaskStream, action: ReducerAction) { } if ( - ['cancelled', 'failed', 'completed'].includes(currentStep.status) + ['cancelled', 'completed', 'failed'].includes(currentStep.status) ) { currentStep.endedAt = entry.createdAt; } @@ -131,6 +133,11 @@ function reducer(draft: TaskStream, action: ReducerAction) { return; } + case 'CANCELLED': { + draft.cancelled = true; + return; + } + case 'ERROR': { draft.error = action.data; draft.loading = false; @@ -151,6 +158,7 @@ function reducer(draft: TaskStream, action: ReducerAction) { export const useTaskEventStream = (taskId: string): TaskStream => { const scaffolderApi = useApi(scaffolderApiRef); const [state, dispatch] = useImmerReducer(reducer, { + cancelled: false, loading: true, completed: false, stepLogs: {} as { [stepId in string]: string[] }, @@ -196,6 +204,9 @@ export const useTaskEventStream = (taskId: string): TaskStream => { switch (event.type) { case 'log': return collectedLogEvents.push(event); + case 'cancelled': + dispatch({ type: 'CANCELLED' }); + return undefined; case 'completion': emitLogs(); dispatch({ type: 'COMPLETED', data: event }); diff --git a/plugins/scaffolder/src/next/TemplateListPage/ContextMenu.tsx b/plugins/scaffolder-react/src/next/components/ScaffolderPageContextMenu/ScaffolderPageContextMenu.tsx similarity index 74% rename from plugins/scaffolder/src/next/TemplateListPage/ContextMenu.tsx rename to plugins/scaffolder-react/src/next/components/ScaffolderPageContextMenu/ScaffolderPageContextMenu.tsx index d78b8a62c4..fc3c0249a0 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/ContextMenu.tsx +++ b/plugins/scaffolder-react/src/next/components/ScaffolderPageContextMenu/ScaffolderPageContextMenu.tsx @@ -14,7 +14,6 @@ * limitations under the License. */ -import { useRouteRef } from '@backstage/core-plugin-api'; import { BackstageTheme } from '@backstage/theme'; import IconButton from '@material-ui/core/IconButton'; import ListItemIcon from '@material-ui/core/ListItemIcon'; @@ -28,12 +27,6 @@ import Edit from '@material-ui/icons/Edit'; import List from '@material-ui/icons/List'; import MoreVert from '@material-ui/icons/MoreVert'; import React, { useState } from 'react'; -import { useNavigate } from 'react-router-dom'; -import { - nextActionsRouteRef, - nextEditRouteRef, - nextScaffolderListTaskRouteRef, -} from '../routes'; const useStyles = makeStyles((theme: BackstageTheme) => ({ button: { @@ -41,26 +34,26 @@ const useStyles = makeStyles((theme: BackstageTheme) => ({ }, })); +/** + * @alpha + */ export type ScaffolderPageContextMenuProps = { - editor?: boolean; - actions?: boolean; - tasks?: boolean; + onEditorClicked?: () => void; + onActionsClicked?: () => void; + onTasksClicked?: () => void; }; -export function ContextMenu(props: ScaffolderPageContextMenuProps) { +/** + * @alpha + */ +export function ScaffolderPageContextMenu( + props: ScaffolderPageContextMenuProps, +) { + const { onEditorClicked, onActionsClicked, onTasksClicked } = props; const classes = useStyles(); const [anchorEl, setAnchorEl] = useState(); - const editLink = useRouteRef(nextEditRouteRef); - const actionsLink = useRouteRef(nextActionsRouteRef); - const tasksLink = useRouteRef(nextScaffolderListTaskRouteRef); - const navigate = useNavigate(); - - const showEditor = props.editor !== false; - const showActions = props.actions !== false; - const showTasks = props.tasks !== false; - - if (!showEditor && !showActions) { + if (!onEditorClicked && !onActionsClicked) { return null; } @@ -93,24 +86,24 @@ export function ContextMenu(props: ScaffolderPageContextMenuProps) { transformOrigin={{ vertical: 'top', horizontal: 'right' }} > - {showEditor && ( - navigate(editLink())}> + {onEditorClicked && ( + )} - {showActions && ( - navigate(actionsLink())}> + {onActionsClicked && ( + )} - {showTasks && ( - navigate(tasksLink())}> + {onTasksClicked && ( + diff --git a/plugins/scaffolder-react/src/next/components/ScaffolderPageContextMenu/index.ts b/plugins/scaffolder-react/src/next/components/ScaffolderPageContextMenu/index.ts new file mode 100644 index 0000000000..ae6774a1e6 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/ScaffolderPageContextMenu/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { + ScaffolderPageContextMenu, + type ScaffolderPageContextMenuProps, +} from './ScaffolderPageContextMenu'; diff --git a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx index 0945843961..cbc87c2d53 100644 --- a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx +++ b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx @@ -61,4 +61,55 @@ describe('TaskSteps', () => { expect(getByText(step.name)).toBeInTheDocument(); } }); + it('should only show timer for in progress, failed, and completed steps', async () => { + const steps = [ + { + id: '1', + name: 'Fail', + status: 'failed' as ScaffolderTaskStatus, + + startedAt: Date.now().toLocaleString(), + endedAt: Date.now().toLocaleString(), + action: 'action1', + }, + { + id: '2', + name: 'Process', + status: 'processing' as ScaffolderTaskStatus, + startedAt: Date.now().toLocaleString(), + action: 'action2', + }, + { + id: '3', + name: 'Complete', + status: 'completed' as ScaffolderTaskStatus, + startedAt: Date.now().toLocaleString(), + endedAt: Date.now().toLocaleString(), + action: 'action3', + }, + { + id: '4', + name: 'Skip', + status: 'skipped' as ScaffolderTaskStatus, + startedAt: Date.now().toLocaleString(), + action: 'action4', + }, + { + id: '5', + name: 'Not Started', + status: 'open' as ScaffolderTaskStatus, + action: 'action5', + }, + ]; + + const screen = await renderInTestApp(); + const stepLabels = await screen.findAllByTestId('step-label'); + expect(stepLabels.length).toBe(steps.length); + for (let i = 0; i < steps.length; i++) { + expect(stepLabels[i].textContent?.startsWith(steps[i].name)).toBe(true); + expect(stepLabels[i].textContent?.endsWith('seconds')).toBe( + steps[i].status !== 'skipped' && !!steps[i].startedAt, + ); + } + }); }); diff --git a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx index 632500f07e..d783351eca 100644 --- a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx +++ b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx @@ -78,9 +78,10 @@ export const TaskSteps = (props: TaskStepsProps) => { {step.name} - + {!isSkipped && } diff --git a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx index af44085151..2a0a34823d 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx @@ -142,20 +142,22 @@ export const TemplateCard = (props: TemplateCardProps) => { - {props.additionalLinks?.map(({ icon, text, url }) => ( - + {props.additionalLinks?.map(({ icon, text, url }, index) => ( + ))} - {template.metadata.links?.map(({ url, icon, title }) => ( - - - - ))} + {template.metadata.links?.map( + ({ url, icon, title }, index) => ( + + + + ), + )} diff --git a/plugins/scaffolder/src/next/TemplateListPage/CategoryPicker.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/TemplateCategoryPicker.test.tsx similarity index 93% rename from plugins/scaffolder/src/next/TemplateListPage/CategoryPicker.test.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/TemplateCategoryPicker.test.tsx index f02ca51354..ce6e342809 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/CategoryPicker.test.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/TemplateCategoryPicker.test.tsx @@ -16,7 +16,7 @@ import React from 'react'; import { useEntityTypeFilter } from '@backstage/plugin-catalog-react'; -import { CategoryPicker } from './CategoryPicker'; +import { TemplateCategoryPicker } from './TemplateCategoryPicker'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { alertApiRef } from '@backstage/core-plugin-api'; import { fireEvent } from '@testing-library/react'; @@ -25,7 +25,7 @@ jest.mock('@backstage/plugin-catalog-react', () => ({ useEntityTypeFilter: jest.fn(), })); -describe('CategoryPicker', () => { +describe('TemplateCategoryPicker', () => { const mockAlertApi = { post: jest.fn() }; beforeEach(() => { @@ -39,7 +39,7 @@ describe('CategoryPicker', () => { await renderInTestApp( - + , ); @@ -56,7 +56,7 @@ describe('CategoryPicker', () => { const { findByTestId } = await renderInTestApp( - + , ); @@ -70,7 +70,7 @@ describe('CategoryPicker', () => { const { queryByText } = await renderInTestApp( - + , ); @@ -86,7 +86,7 @@ describe('CategoryPicker', () => { const { getByRole } = await renderInTestApp( - + , ); @@ -108,7 +108,7 @@ describe('CategoryPicker', () => { const { getByRole } = await renderInTestApp( - + , ); @@ -139,7 +139,7 @@ describe('CategoryPicker', () => { const { getByRole } = await renderInTestApp( - + , ); diff --git a/plugins/scaffolder/src/next/TemplateListPage/CategoryPicker.tsx b/plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/TemplateCategoryPicker.tsx similarity index 97% rename from plugins/scaffolder/src/next/TemplateListPage/CategoryPicker.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/TemplateCategoryPicker.tsx index 483751f2e2..028ce3a701 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/CategoryPicker.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/TemplateCategoryPicker.tsx @@ -37,8 +37,9 @@ const checkedIcon = ; /** * The Category Picker that is rendered on the left side for picking * categories and filtering the template list. + * @alpha */ -export const CategoryPicker = () => { +export const TemplateCategoryPicker = () => { const alertApi = useApi(alertApiRef); const { error, loading, availableTypes, selectedTypes, setSelectedTypes } = useEntityTypeFilter(); diff --git a/plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/index.ts b/plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/index.ts new file mode 100644 index 0000000000..cf41f3f7f9 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { TemplateCategoryPicker } from './TemplateCategoryPicker'; diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.test.tsx similarity index 83% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx rename to plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.test.tsx index 6fe2d6beb9..c03af41f99 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.test.tsx @@ -28,7 +28,6 @@ import { TemplateGroups } from './TemplateGroups'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { errorApiRef } from '@backstage/core-plugin-api'; import { TemplateGroup } from '@backstage/plugin-scaffolder-react/alpha'; -import { nextRouteRef } from '../routes'; describe('TemplateGroups', () => { beforeEach(() => jest.clearAllMocks()); @@ -40,11 +39,6 @@ describe('TemplateGroups', () => { , - { - mountedRoutes: { - '/next': nextRouteRef, - }, - }, ); expect(await findByTestId('progress')).toBeInTheDocument(); @@ -62,11 +56,6 @@ describe('TemplateGroups', () => { , - { - mountedRoutes: { - '/next': nextRouteRef, - }, - }, ); expect(errorApi.post).toHaveBeenCalledWith(mockError); @@ -83,11 +72,6 @@ describe('TemplateGroups', () => { , - { - mountedRoutes: { - '/next': nextRouteRef, - }, - }, ); expect(await findByText(/No templates found/)).toBeInTheDocument(); @@ -104,11 +88,6 @@ describe('TemplateGroups', () => { , - { - mountedRoutes: { - '/next': nextRouteRef, - }, - }, ); expect(await findByText(/No templates found/)).toBeInTheDocument(); @@ -144,11 +123,6 @@ describe('TemplateGroups', () => { true }]} /> , - { - mountedRoutes: { - '/next': nextRouteRef, - }, - }, ); expect(TemplateGroup).toHaveBeenCalledWith( @@ -193,11 +167,6 @@ describe('TemplateGroups', () => { groups={[{ title: 'all', filter: e => e.metadata.name === 't1' }]} /> , - { - mountedRoutes: { - '/next': nextRouteRef, - }, - }, ); expect(TemplateGroup).toHaveBeenCalledWith( @@ -207,4 +176,47 @@ describe('TemplateGroups', () => { {}, ); }); + + it('should filter out templates based on filter condition', async () => { + const mockEntities = [ + { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { + name: 't1', + }, + spec: {}, + }, + { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { + name: 't2', + }, + spec: {}, + }, + ]; + + (useEntityList as jest.Mock).mockReturnValue({ + entities: mockEntities, + loading: false, + error: null, + }); + + await renderInTestApp( + + true }]} + templateFilter={e => e.metadata.name === 't1'} + /> + , + ); + + expect(TemplateGroup).toHaveBeenCalledWith( + expect.objectContaining({ + templates: [expect.objectContaining({ template: mockEntities[1] })], + }), + {}, + ); + }); }); diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx similarity index 60% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx rename to plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx index 590ef802bd..50be7a4bdf 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx @@ -15,55 +15,54 @@ */ import React, { useCallback } from 'react'; -import { - Entity, - parseEntityRef, - stringifyEntityRef, -} from '@backstage/catalog-model'; import { useEntityList } from '@backstage/plugin-catalog-react'; -import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { Progress, Link, DocsIcon } from '@backstage/core-components'; -import { Typography } from '@material-ui/core'; import { - errorApiRef, - useApi, - useApp, - useRouteRef, -} from '@backstage/core-plugin-api'; + isTemplateEntityV1beta3, + TemplateEntityV1beta3, +} from '@backstage/plugin-scaffolder-common'; +import { Progress, Link } from '@backstage/core-components'; +import { Typography } from '@material-ui/core'; +import { errorApiRef, IconComponent, useApi } from '@backstage/core-plugin-api'; import { TemplateGroup } from '@backstage/plugin-scaffolder-react/alpha'; -import { viewTechDocRouteRef } from '../../routes'; -import { nextSelectedTemplateRouteRef } from '../routes'; -import { useNavigate } from 'react-router-dom'; /** * @alpha */ export type TemplateGroupFilter = { title?: React.ReactNode; - filter: (entity: Entity) => boolean; + filter: (entity: TemplateEntityV1beta3) => boolean; }; +/** + * @alpha + */ export interface TemplateGroupsProps { groups: TemplateGroupFilter[]; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; TemplateCardComponent?: React.ComponentType<{ template: TemplateEntityV1beta3; }>; + onTemplateSelected?: (template: TemplateEntityV1beta3) => void; + additionalLinksForEntity?: (template: TemplateEntityV1beta3) => { + icon: IconComponent; + text: string; + url: string; + }[]; } +/** + * @alpha + */ export const TemplateGroups = (props: TemplateGroupsProps) => { const { loading, error, entities } = useEntityList(); - const { groups, TemplateCardComponent } = props; + const { groups, templateFilter, TemplateCardComponent, onTemplateSelected } = + props; const errorApi = useApi(errorApiRef); - const app = useApp(); - const viewTechDocsLink = useRouteRef(viewTechDocRouteRef); - const templateRoute = useRouteRef(nextSelectedTemplateRouteRef); - const navigate = useNavigate(); const onSelected = useCallback( (template: TemplateEntityV1beta3) => { - const { namespace, name } = parseEntityRef(stringifyEntityRef(template)); - navigate(templateRoute({ namespace, templateName: name })); + onTemplateSelected?.(template); }, - [navigate, templateRoute], + [onTemplateSelected], ); if (loading) { @@ -91,22 +90,12 @@ export const TemplateGroups = (props: TemplateGroupsProps) => { <> {groups.map(({ title, filter }, index) => { const templates = entities - .filter((e): e is TemplateEntityV1beta3 => filter(e)) + .filter(isTemplateEntityV1beta3) + .filter(e => (templateFilter ? !templateFilter(e) : true)) + .filter(filter) .map(template => { - const { kind, namespace, name } = parseEntityRef( - stringifyEntityRef(template), - ); const additionalLinks = - template.metadata.annotations?.['backstage.io/techdocs-ref'] && - viewTechDocsLink - ? [ - { - icon: app.getSystemIcon('docs') ?? DocsIcon, - text: 'View TechDocs', - url: viewTechDocsLink({ kind, namespace, name }), - }, - ] - : []; + props.additionalLinksForEntity?.(template) ?? []; return { template, diff --git a/plugins/scaffolder-react/src/next/components/TemplateGroups/index.ts b/plugins/scaffolder-react/src/next/components/TemplateGroups/index.ts new file mode 100644 index 0000000000..765883916c --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './TemplateGroups'; diff --git a/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx index 03604881d2..81c5a697e0 100644 --- a/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx +++ b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx @@ -24,10 +24,10 @@ import { act, fireEvent } from '@testing-library/react'; import React from 'react'; import { Workflow } from './Workflow'; import { analyticsApiRef } from '@backstage/core-plugin-api'; -import { ScaffolderApi } from '../../../api/types'; -import { scaffolderApiRef } from '../../../api/ref'; +import { ScaffolderApi, scaffolderApiRef } from '../../../api'; const scaffolderApiMock: jest.Mocked = { + cancelTask: jest.fn(), scaffold: jest.fn(), getTemplateParameterSchema: jest.fn(), getIntegrationsList: jest.fn(), diff --git a/plugins/scaffolder-react/src/next/components/index.ts b/plugins/scaffolder-react/src/next/components/index.ts index 083d88927e..5bfa5ccdc8 100644 --- a/plugins/scaffolder-react/src/next/components/index.ts +++ b/plugins/scaffolder-react/src/next/components/index.ts @@ -17,8 +17,11 @@ export * from './Stepper'; export * from './TemplateCard'; export * from './ReviewState'; export * from './TemplateGroup'; +export * from './TemplateGroups'; export * from './Workflow'; export * from './TemplateOutputs'; export * from './Form'; export * from './TaskSteps'; export * from './TaskLogStream'; +export * from './TemplateCategoryPicker'; +export * from './ScaffolderPageContextMenu'; diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index d3c377154e..22741c6a14 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,84 @@ # @backstage/plugin-scaffolder +## 1.13.0-next.0 + +### Minor Changes + +- cdab34fd9a2: scaffolder/next: removing the `routeRefs` and exporting the originals on `scaffolderPlugin.routes.x` instead +- e5ad1bd61ec: Allow `TemplateListPage` and `TemplateWizardPage` to be passed in as props +- 92cf86a4b5d: Added a `templateFilter` prop to the `` component to allow for filtering of templates through a function. +- 259d3407b9b: Move `CategoryPicker` from `scaffolder` into `scaffolder-react` + Move `ContextMenu` into `scaffolder-react` and rename it to `ScaffolderPageContextMenu` + +### Patch Changes + +- e27ddc36dad: Added a possibility to cancel the running task (executing of a scaffolder template) +- 57c1b4752fa: Allow use of `{ exists: true }` value inside filters to filter entities that has that key. + + this example will filter all entities that has the annotation `someAnnotation` set to any value. + + ```yaml + ui:options: + catalogFilter: + kind: Group + metadata.annotations.someAnnotation: { exists: true } + ``` + +- 7a6b16cc506: `scaffolder/next`: Bump `@rjsf/*` deps to 5.3.1 +- f84fc7fd040: Updated dependency `@rjsf/validator-ajv8` to `5.3.0`. +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.3.0-next.0 + - @backstage/plugin-scaffolder-common@1.2.7-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.12 + +## 1.12.0 + +### Minor Changes + +- 0d61fcca9c3: Update `EntityPicker` to use the fully qualified entity ref instead of the humanized version. +- 8f4d13f21cf: Move `useTaskStream`, `TaskBorder`, `TaskLogStream` and `TaskSteps` into `scaffolder-react`. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- be3cddaab5f: Getting credentials in the RepoUrlPicker now also works for targets without owner (e.g. Bitbucket Server). +- cb8ec97cdeb: Change black & white colors to be theme aware +- eb877bad736: Create an "Other Templates" group when groups are given to scaffolder/next. +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 0aae4596296: Fix the scaffolder validator for arrays when the item is a field in the object +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-scaffolder-react@1.2.0 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-scaffolder-common@1.2.6 + ## 1.12.0-next.2 ### Minor Changes diff --git a/plugins/scaffolder/alpha-api-report.md b/plugins/scaffolder/alpha-api-report.md index bf37acafc3..6ceacdc008 100644 --- a/plugins/scaffolder/alpha-api-report.md +++ b/plugins/scaffolder/alpha-api-report.md @@ -5,16 +5,15 @@ ```ts /// -import { Entity } from '@backstage/catalog-model'; import { FormProps as FormProps_2 } from '@backstage/plugin-scaffolder-react/alpha'; import type { FormProps as FormProps_3 } from '@rjsf/core-v5'; -import { PathParams } from '@backstage/core-plugin-api'; +import { LayoutOptions } from '@backstage/plugin-scaffolder-react'; +import { NextFieldExtensionOptions } from '@backstage/plugin-scaffolder-react/alpha'; import { PropsWithChildren } from 'react'; import { default as React_2 } from 'react'; -import { RouteRef } from '@backstage/core-plugin-api'; import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; -import { SubRouteRef } from '@backstage/core-plugin-api'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; +import { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react/alpha'; // @alpha @deprecated export type FormProps = Pick< @@ -22,9 +21,6 @@ export type FormProps = Pick< 'transformErrors' | 'noHtml5Validate' >; -// @alpha (undocumented) -export const nextRouteRef: RouteRef; - // @alpha export type NextRouterProps = { components?: { @@ -35,8 +31,11 @@ export type NextRouterProps = { TemplateOutputsComponent?: React_2.ComponentType<{ output?: ScaffolderTaskOutput; }>; + TemplateListPageComponent?: React_2.ComponentType; + TemplateWizardPageComponent?: React_2.ComponentType; }; groups?: TemplateGroupFilter[]; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; FormProps?: FormProps_2; contextMenu?: { editor?: boolean; @@ -51,19 +50,24 @@ export const NextScaffolderPage: ( ) => JSX.Element; // @alpha (undocumented) -export const nextScaffolderTaskRouteRef: SubRouteRef< - PathParams<'/tasks/:taskId'> ->; +export type TemplateListPageProps = { + TemplateCardComponent?: React_2.ComponentType<{ + template: TemplateEntityV1beta3; + }>; + groups?: TemplateGroupFilter[]; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; + contextMenu?: { + editor?: boolean; + actions?: boolean; + tasks?: boolean; + }; +}; // @alpha (undocumented) -export const nextSelectedTemplateRouteRef: SubRouteRef< - PathParams<'/templates/:namespace/:templateName'> ->; - -// @alpha (undocumented) -export type TemplateGroupFilter = { - title?: React_2.ReactNode; - filter: (entity: Entity) => boolean; +export type TemplateWizardPageProps = { + customFieldExtensions: NextFieldExtensionOptions[]; + layouts?: LayoutOptions[]; + FormProps?: FormProps_2; }; // (No @packageDocumentation comment for this package) diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 6b8d6d345f..3495522310 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -75,13 +75,27 @@ export const EntityNamePickerFieldExtension: FieldExtensionComponent_2< export const EntityPickerFieldExtension: FieldExtensionComponent_2< string, { - defaultKind?: string | undefined; - defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; + defaultKind?: string | undefined; allowArbitraryValues?: boolean | undefined; + defaultNamespace?: string | false | undefined; catalogFilter?: - | Record - | Record[] + | Record< + string, + | string + | string[] + | { + exists?: boolean | undefined; + } + > + | Record< + string, + | string + | string[] + | { + exists?: boolean | undefined; + } + >[] | undefined; } >; @@ -90,13 +104,27 @@ export const EntityPickerFieldExtension: FieldExtensionComponent_2< export const EntityPickerFieldSchema: FieldSchema< string, { - defaultKind?: string | undefined; - defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; + defaultKind?: string | undefined; allowArbitraryValues?: boolean | undefined; + defaultNamespace?: string | false | undefined; catalogFilter?: - | Record - | Record[] + | Record< + string, + | string + | string[] + | { + exists?: boolean | undefined; + } + > + | Record< + string, + | string + | string[] + | { + exists?: boolean | undefined; + } + >[] | undefined; } >; @@ -109,8 +137,8 @@ export type EntityPickerUiOptions = export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2< string[], { - showCounts?: boolean | undefined; kinds?: string[] | undefined; + showCounts?: boolean | undefined; helperText?: string | undefined; } >; @@ -119,8 +147,8 @@ export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2< export const EntityTagsPickerFieldSchema: FieldSchema< string[], { - showCounts?: boolean | undefined; kinds?: string[] | undefined; + showCounts?: boolean | undefined; helperText?: string | undefined; } >; @@ -182,10 +210,10 @@ export function makeFieldSchemaFromZod< export const OwnedEntityPickerFieldExtension: FieldExtensionComponent_2< string, { - defaultKind?: string | undefined; - defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; + defaultKind?: string | undefined; allowArbitraryValues?: boolean | undefined; + defaultNamespace?: string | false | undefined; } >; @@ -193,10 +221,10 @@ export const OwnedEntityPickerFieldExtension: FieldExtensionComponent_2< export const OwnedEntityPickerFieldSchema: FieldSchema< string, { - defaultKind?: string | undefined; - defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; + defaultKind?: string | undefined; allowArbitraryValues?: boolean | undefined; + defaultNamespace?: string | false | undefined; } >; @@ -208,12 +236,26 @@ export type OwnedEntityPickerUiOptions = export const OwnerPickerFieldExtension: FieldExtensionComponent_2< string, { - defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; allowArbitraryValues?: boolean | undefined; + defaultNamespace?: string | false | undefined; catalogFilter?: - | Record - | Record[] + | Record< + string, + | string + | string[] + | { + exists?: boolean | undefined; + } + > + | Record< + string, + | string + | string[] + | { + exists?: boolean | undefined; + } + >[] | undefined; } >; @@ -222,12 +264,26 @@ export const OwnerPickerFieldExtension: FieldExtensionComponent_2< export const OwnerPickerFieldSchema: FieldSchema< string, { - defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; allowArbitraryValues?: boolean | undefined; + defaultNamespace?: string | false | undefined; catalogFilter?: - | Record - | Record[] + | Record< + string, + | string + | string[] + | { + exists?: boolean | undefined; + } + > + | Record< + string, + | string + | string[] + | { + exists?: boolean | undefined; + } + >[] | undefined; } >; @@ -255,16 +311,16 @@ export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2< allowedRepos?: string[] | undefined; requestUserCredentials?: | { + secretsKey: string; additionalScopes?: | { - azure?: string[] | undefined; + gerrit?: string[] | undefined; github?: string[] | undefined; gitlab?: string[] | undefined; bitbucket?: string[] | undefined; - gerrit?: string[] | undefined; + azure?: string[] | undefined; } | undefined; - secretsKey: string; } | undefined; } @@ -281,16 +337,16 @@ export const RepoUrlPickerFieldSchema: FieldSchema< allowedRepos?: string[] | undefined; requestUserCredentials?: | { + secretsKey: string; additionalScopes?: | { - azure?: string[] | undefined; + gerrit?: string[] | undefined; github?: string[] | undefined; gitlab?: string[] | undefined; bitbucket?: string[] | undefined; - gerrit?: string[] | undefined; + azure?: string[] | undefined; } | undefined; - secretsKey: string; } | undefined; } @@ -332,6 +388,7 @@ export type RouterProps = { title?: React_2.ReactNode; filter: (entity: Entity) => boolean; }>; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; defaultPreviewTemplate?: string; headerOptions?: { pageTitleOverride?: string; @@ -360,6 +417,8 @@ export class ScaffolderClient implements ScaffolderApi_2 { useLongPollingLogs?: boolean; }); // (undocumented) + cancelTask(taskId: string): Promise; + // (undocumented) dryRun( options: ScaffolderDryRunOptions_2, ): Promise; @@ -423,6 +482,9 @@ export const scaffolderPlugin: BackstagePlugin< PathParams<'/templates/:namespace/:templateName'> >; ongoingTask: SubRouteRef>; + actions: SubRouteRef; + listTasks: SubRouteRef; + edit: SubRouteRef; }, { registerComponent: ExternalRouteRef; diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 7d939a3d1e..de51720aa0 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder", "description": "The Backstage plugin that helps you create new things", - "version": "1.12.0-next.2", + "version": "1.13.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -65,12 +65,12 @@ "@codemirror/view": "^6.0.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^20.0.0", "@rjsf/core": "^3.2.1", "@rjsf/material-ui": "^3.2.1", - "@rjsf/utils": "5.1.0", - "@rjsf/validator-ajv8": "5.1.0", + "@rjsf/utils": "5.3.1", + "@rjsf/validator-ajv8": "5.3.1", "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", "git-url-parse": "^13.0.0", @@ -84,8 +84,8 @@ "react-use": "^17.2.4", "yaml": "^2.0.0", "zen-observable": "^0.10.0", - "zod": "~3.18.0", - "zod-to-json-schema": "~3.18.0" + "zod": "^3.21.4", + "zod-to-json-schema": "^3.20.4" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0", diff --git a/plugins/scaffolder/src/alpha.ts b/plugins/scaffolder/src/alpha.ts index a460b0d7cc..d2bd762190 100644 --- a/plugins/scaffolder/src/alpha.ts +++ b/plugins/scaffolder/src/alpha.ts @@ -16,10 +16,8 @@ export { NextScaffolderPage } from './plugin'; export { - nextRouteRef, - nextScaffolderTaskRouteRef, - nextSelectedTemplateRouteRef, - type TemplateGroupFilter, type NextRouterProps, type FormProps, + type TemplateListPageProps, + type TemplateWizardPageProps, } from './next'; diff --git a/plugins/scaffolder/src/api.ts b/plugins/scaffolder/src/api.ts index 15bd1925b3..7a3f6c14bb 100644 --- a/plugins/scaffolder/src/api.ts +++ b/plugins/scaffolder/src/api.ts @@ -229,24 +229,22 @@ export class ScaffolderClient implements ScaffolderApi { const url = `${baseUrl}/v2/tasks/${encodeURIComponent( taskId, )}/eventstream`; + + const processEvent = (event: any) => { + if (event.data) { + try { + subscriber.next(JSON.parse(event.data)); + } catch (ex) { + subscriber.error(ex); + } + } + }; + const eventSource = new EventSource(url, { withCredentials: true }); - eventSource.addEventListener('log', (event: any) => { - if (event.data) { - try { - subscriber.next(JSON.parse(event.data)); - } catch (ex) { - subscriber.error(ex); - } - } - }); + eventSource.addEventListener('log', processEvent); + eventSource.addEventListener('cancelled', processEvent); eventSource.addEventListener('completion', (event: any) => { - if (event.data) { - try { - subscriber.next(JSON.parse(event.data)); - } catch (ex) { - subscriber.error(ex); - } - } + processEvent(event); eventSource.close(); subscriber.complete(); }); @@ -310,4 +308,19 @@ export class ScaffolderClient implements ScaffolderApi { return await response.json(); } + + async cancelTask(taskId: string): Promise { + const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder'); + const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/cancel`; + + const response = await this.fetchApi.fetch(url, { + method: 'POST', + }); + + if (!response.ok) { + throw await ResponseError.fromResponse(response); + } + + return await response.json(); + } } diff --git a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx index 552d0cea6a..90f6f9b393 100644 --- a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx +++ b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx @@ -25,6 +25,7 @@ import { rootRouteRef } from '../../routes'; const scaffolderApiMock: jest.Mocked = { scaffold: jest.fn(), + cancelTask: jest.fn(), getTemplateParameterSchema: jest.fn(), getIntegrationsList: jest.fn(), getTask: jest.fn(), diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx index ccc2bd283b..05d5cc9f0a 100644 --- a/plugins/scaffolder/src/components/Router.tsx +++ b/plugins/scaffolder/src/components/Router.tsx @@ -58,6 +58,7 @@ export type RouterProps = { title?: React.ReactNode; filter: (entity: Entity) => boolean; }>; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; defaultPreviewTemplate?: string; headerOptions?: { pageTitleOverride?: string; @@ -81,7 +82,12 @@ export type RouterProps = { * @public */ export const Router = (props: RouterProps) => { - const { groups, components = {}, defaultPreviewTemplate } = props; + const { + groups, + templateFilter, + components = {}, + defaultPreviewTemplate, + } = props; const { ReviewStepComponent, TemplateCardComponent, TaskPageComponent } = components; @@ -126,6 +132,7 @@ export const Router = (props: RouterProps) => { element={ boolean; + filter: (entity: TemplateEntityV1beta3) => boolean; }>; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; contextMenu?: { editor?: boolean; actions?: boolean; @@ -64,13 +64,14 @@ export type ScaffolderPageProps = { export const ScaffolderPageContents = ({ TemplateCardComponent, groups, + templateFilter, contextMenu, headerOptions, }: ScaffolderPageProps) => { const registerComponentLink = useRouteRef(registerComponentRouteRef); const otherTemplatesGroup = { title: groups ? 'Other Templates' : 'Templates', - filter: (entity: Entity) => { + filter: (entity: TemplateEntityV1beta3) => { const filtered = (groups ?? []).map(group => group.filter(entity)); return !filtered.some(result => result === true); }, @@ -123,11 +124,13 @@ export const ScaffolderPageContents = ({ key={index} TemplateCardComponent={TemplateCardComponent} group={group} + templateFilter={templateFilter} /> ))} @@ -140,6 +143,7 @@ export const ScaffolderPageContents = ({ export const ScaffolderPage = ({ TemplateCardComponent, groups, + templateFilter, contextMenu, headerOptions, }: ScaffolderPageProps) => ( @@ -147,6 +151,7 @@ export const ScaffolderPage = ({ diff --git a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx index f78d48e686..78cdc5d935 100644 --- a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx +++ b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx @@ -19,11 +19,15 @@ import { Content, ErrorPage, Header, - Page, LogViewer, + Page, Progress, } from '@backstage/core-components'; -import { useRouteRef, useRouteRefParams } from '@backstage/core-plugin-api'; +import { + useApi, + useRouteRef, + useRouteRefParams, +} from '@backstage/core-plugin-api'; import { BackstageTheme } from '@backstage/theme'; import { Button, @@ -59,6 +63,7 @@ import { scaffolderTaskRouteRef, selectedTemplateRouteRef, } from '../../routes'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; // typings are wrong for this library, so fallback to not parsing types. const humanizeDuration = require('humanize-duration'); @@ -188,9 +193,10 @@ export const TaskStatusStepper = memo( nonLinear > {steps.map((step, index) => { + const isCancelled = step.status === 'cancelled'; + const isActive = step.status === 'processing'; const isCompleted = step.status === 'completed'; const isFailed = step.status === 'failed'; - const isActive = step.status === 'processing'; const isSkipped = step.status === 'skipped'; return ( @@ -199,7 +205,7 @@ export const TaskStatusStepper = memo( { const { loadingText } = props; - const classes = useStyles(); const navigate = useNavigate(); const rootPath = useRouteRef(rootRouteRef); + const scaffolderApi = useApi(scaffolderApiRef); const templateRoute = useRouteRef(selectedTemplateRouteRef); const [userSelectedStepId, setUserSelectedStepId] = useState< string | undefined >(undefined); + const [clickedToCancel, setClickedToCancel] = useState(false); const [lastActiveStepId, setLastActiveStepId] = useState( undefined, ); const { taskId } = useRouteRefParams(scaffolderTaskRouteRef); const taskStream = useTaskEventStream(taskId); const completed = taskStream.completed; + const taskCancelled = taskStream.cancelled; const steps = useMemo( () => taskStream.task?.spec.steps.map(step => ({ @@ -295,9 +302,7 @@ export const TaskPage = (props: TaskPageProps) => { }, [taskStream.stepLogs, currentStepId, loadingText]); const taskNotFound = - taskStream.completed === true && - taskStream.loading === false && - !taskStream.task; + taskStream.completed && !taskStream.loading && !taskStream.task; const { output } = taskStream; @@ -320,6 +325,11 @@ export const TaskPage = (props: TaskPageProps) => { ); }; + const handleCancel = async () => { + setClickedToCancel(true); + await scaffolderApi.cancelTask(taskId); + }; + return (
{ > Start Over + diff --git a/plugins/scaffolder/src/components/TemplateList/TemplateList.test.tsx b/plugins/scaffolder/src/components/TemplateList/TemplateList.test.tsx new file mode 100644 index 0000000000..2ea417ad68 --- /dev/null +++ b/plugins/scaffolder/src/components/TemplateList/TemplateList.test.tsx @@ -0,0 +1,83 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { screen } from '@testing-library/react'; +import React from 'react'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { TemplateList } from './TemplateList'; +import { rootRouteRef } from '../../routes'; +import { + ScmIntegrationsApi, + scmIntegrationsApiRef, +} from '@backstage/integration-react'; +import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; + +jest.mock('@backstage/plugin-catalog-react', () => ({ + useEntityList: jest.fn().mockReturnValue({ + loading: false, + entities: [ + { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { + name: 't1', + }, + spec: {}, + }, + { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { + name: 't2', + }, + spec: {}, + }, + ], + }), + getEntityRelations: jest.fn().mockImplementation(() => []), + getEntitySourceLocation: jest.fn().mockImplementation(() => ({})), +})); + +describe('TemplateList', () => { + const mockIntegrationsApi: Partial = { + byHost: () => ({ type: 'github' }), + }; + + it('should filter out templates based on provided filter condition', async () => { + const TemplateCardComponent = ({ + template, + }: { + template: TemplateEntityV1beta3; + }) => ( +
{template.metadata.name}
+ ); + + await renderInTestApp( + +
+ e.metadata.name === 't1'} + TemplateCardComponent={TemplateCardComponent} + /> +
+
, + { mountedRoutes: { '/': rootRouteRef } }, + ); + + expect(() => screen.getByTestId('t1')).toThrow(); + expect(screen.getByTestId('t2')).toBeDefined(); + }); +}); diff --git a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx index 90d1c8cceb..9a88050d74 100644 --- a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx +++ b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx @@ -16,7 +16,10 @@ import React, { ComponentType } from 'react'; import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; -import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; +import { + isTemplateEntityV1beta3, + TemplateEntityV1beta3, +} from '@backstage/plugin-scaffolder-common'; import { Content, ContentHeader, @@ -38,8 +41,9 @@ export type TemplateListProps = { | undefined; group?: { title?: React.ReactNode; - filter: (entity: Entity) => boolean; + filter: (entity: TemplateEntityV1beta3) => boolean; }; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; }; /** @@ -48,12 +52,14 @@ export type TemplateListProps = { export const TemplateList = ({ TemplateCardComponent, group, + templateFilter, }: TemplateListProps) => { const { loading, error, entities } = useEntityList(); const Card = TemplateCardComponent || TemplateCard; - const maybeFilteredEntities = group - ? entities.filter(e => group.filter(e)) - : entities; + const templateEntities = entities.filter(isTemplateEntityV1beta3); + const maybeFilteredEntities = ( + group ? templateEntities.filter(group.filter) : templateEntities + ).filter(e => (templateFilter ? !templateFilter(e) : true)); const titleComponent: React.ReactNode = (() => { if (group && group.title) { diff --git a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx index b4358146fd..344929fa43 100644 --- a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx +++ b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx @@ -47,6 +47,7 @@ jest.mock('react-router-dom', () => { }); const scaffolderApiMock: jest.Mocked = { + cancelTask: jest.fn(), scaffold: jest.fn(), getTemplateParameterSchema: jest.fn(), getIntegrationsList: jest.fn(), @@ -338,10 +339,7 @@ describe('TemplatePage', () => { it('should display a section or property based on a feature flag', async () => { featureFlagsApiMock.isActive.mockImplementation(flag => { - if (flag === 'experimental-feature') { - return true; - } - return false; + return flag === 'experimental-feature'; }); scaffolderApiMock.getTemplateParameterSchema.mockResolvedValue( schemaMockValue, diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx index 3cc45e6412..937ff7d07a 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { EntityFilterQuery } from '@backstage/catalog-client'; +import { CATALOG_FILTER_EXISTS } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; import { CatalogApi, catalogApiRef } from '@backstage/plugin-catalog-react'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; @@ -22,6 +22,7 @@ import { FieldProps } from '@rjsf/core'; import { fireEvent } from '@testing-library/react'; import React from 'react'; import { EntityPicker } from './EntityPicker'; +import { EntityPickerProps } from './schema'; const makeEntity = (kind: string, namespace: string, name: string): Entity => ({ apiVersion: 'backstage.io/v1beta1', @@ -34,15 +35,7 @@ describe('', () => { const onChange = jest.fn(); const schema = {}; const required = false; - let uiSchema: { - 'ui:options': { - allowedKinds?: string[]; - defaultKind?: string; - allowArbitraryValues?: boolean; - defaultNamespace?: string | false; - catalogFilter?: EntityFilterQuery; - }; - }; + let uiSchema: EntityPickerProps['uiSchema']; const rawErrors: string[] = []; const formData = undefined; @@ -192,6 +185,59 @@ describe('', () => { ], }); }); + it('allow single top level filter', async () => { + uiSchema = { + 'ui:options': { + catalogFilter: { + kind: ['Group'], + 'metadata.name': 'test-entity', + }, + }, + }; + + catalogApi.getEntities.mockResolvedValue({ items: entities }); + + await renderInTestApp( + + + , + ); + + expect(catalogApi.getEntities).toHaveBeenCalledWith({ + filter: { + kind: ['Group'], + 'metadata.name': 'test-entity', + }, + }); + }); + + it('search for entitities containing an specific key', async () => { + const uiSchemaWithBoolean = { + 'ui:options': { + catalogFilter: [ + { + kind: ['User'], + 'metadata.annotation.some/anotation': { exists: true }, + }, + ], + }, + }; + + await renderInTestApp( + + + , + ); + + expect(catalogApi.getEntities).toHaveBeenCalledWith({ + filter: [ + { + kind: ['User'], + 'metadata.annotation.some/anotation': CATALOG_FILTER_EXISTS, + }, + ], + }); + }); }); describe('catalogFilter should take precedence over allowedKinds', () => { diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx index 48d6453ab9..aeb4a52f77 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx @@ -13,7 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { type EntityFilterQuery } from '@backstage/catalog-client'; +import { + type EntityFilterQuery, + CATALOG_FILTER_EXISTS, +} from '@backstage/catalog-client'; import { Entity, parseEntityRef, @@ -31,7 +34,12 @@ import Autocomplete, { } from '@material-ui/lab/Autocomplete'; import React, { useCallback, useEffect } from 'react'; import useAsync from 'react-use/lib/useAsync'; -import { EntityPickerProps } from './schema'; +import { + EntityPickerFilterQueryValue, + EntityPickerProps, + EntityPickerUiOptions, + EntityPickerFilterQuery, +} from './schema'; export { EntityPickerSchema } from './schema'; @@ -51,12 +59,7 @@ export const EntityPicker = (props: EntityPickerProps) => { formData, idSchema, } = props; - const allowedKinds = uiSchema['ui:options']?.allowedKinds; - - const catalogFilter: EntityFilterQuery | undefined = - uiSchema['ui:options']?.catalogFilter || - (allowedKinds && { kind: allowedKinds }); - + const catalogFilter = buildCatalogFilter(uiSchema); const defaultKind = uiSchema['ui:options']?.defaultKind; const defaultNamespace = uiSchema['ui:options']?.defaultNamespace || undefined; @@ -167,3 +170,71 @@ export const EntityPicker = (props: EntityPickerProps) => { ); }; + +/** + * Converts a especial `{exists: true}` value to the `CATALOG_FILTER_EXISTS` symbol. + * + * @param value - The value to convert. + * @returns The converted value. + */ +function convertOpsValues( + value: Exclude>, +): string | symbol { + if (typeof value === 'object' && value.exists) { + return CATALOG_FILTER_EXISTS; + } + return value?.toString(); +} + +/** + * Converts schema filters to entity filter query, replacing `{exists:true}` values + * with the constant `CATALOG_FILTER_EXISTS`. + * + * @param schemaFilters - An object containing schema filters with keys as filter names + * and values as filter values. + * @returns An object with the same keys as the input object, but with `{exists:true}` values + * transformed to `CATALOG_FILTER_EXISTS` symbol. + */ +function convertSchemaFiltersToQuery( + schemaFilters: EntityPickerFilterQuery, +): Exclude> { + const query: EntityFilterQuery = {}; + + for (const [key, value] of Object.entries(schemaFilters)) { + if (Array.isArray(value)) { + query[key] = value; + } else { + query[key] = convertOpsValues(value); + } + } + + return query; +} + +/** + * Builds an `EntityFilterQuery` based on the `uiSchema` passed in. + * If `catalogFilter` is specified in the `uiSchema`, it is converted to a `EntityFilterQuery`. + * If `allowedKinds` is specified in the `uiSchema` will support the legacy `allowedKinds` option. + * + * @param uiSchema The `uiSchema` of an `EntityPicker` component. + * @returns An `EntityFilterQuery` based on the `uiSchema`, or `undefined` if `catalogFilter` is not specified in the `uiSchema`. + */ +function buildCatalogFilter( + uiSchema: EntityPickerProps['uiSchema'], +): EntityFilterQuery | undefined { + const allowedKinds = uiSchema['ui:options']?.allowedKinds; + + const catalogFilter: EntityPickerUiOptions['catalogFilter'] | undefined = + uiSchema['ui:options']?.catalogFilter || + (allowedKinds && { kind: allowedKinds }); + + if (!catalogFilter) { + return undefined; + } + + if (Array.isArray(catalogFilter)) { + return catalogFilter.map(convertSchemaFiltersToQuery); + } + + return convertSchemaFiltersToQuery(catalogFilter); +} diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts index f83dfbf817..eb1bba364b 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts @@ -20,7 +20,10 @@ import { makeFieldSchemaFromZod } from '../utils'; * @public */ export const entityQueryFilterExpressionSchema = z.record( - z.string().or(z.array(z.string())), + z + .string() + .or(z.object({ exists: z.boolean().optional() })) + .or(z.array(z.string())), ); /** @@ -74,3 +77,10 @@ export type EntityPickerUiOptions = export type EntityPickerProps = typeof EntityPickerFieldSchema.type; export const EntityPickerSchema = EntityPickerFieldSchema.schema; + +export type EntityPickerFilterQuery = z.TypeOf< + typeof entityQueryFilterExpressionSchema +>; + +export type EntityPickerFilterQueryValue = + EntityPickerFilterQuery[keyof EntityPickerFilterQuery]; diff --git a/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx b/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx index d4c771a9f8..985dd98903 100644 --- a/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx @@ -23,15 +23,21 @@ import { MenuList, Popover, } from '@material-ui/core'; +import { useAsync } from '@react-hookz/web'; +import Cancel from '@material-ui/icons/Cancel'; import Retry from '@material-ui/icons/Repeat'; import Toc from '@material-ui/icons/Toc'; import MoreVert from '@material-ui/icons/MoreVert'; import React, { useState } from 'react'; +import { useApi } from '@backstage/core-plugin-api'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; type ContextMenuProps = { + cancelEnabled?: boolean; logsVisible?: boolean; - onToggleLogs?: (state: boolean) => void; onStartOver?: () => void; + onToggleLogs?: (state: boolean) => void; + taskId?: string; }; const useStyles = makeStyles((theme: BackstageTheme) => ({ @@ -41,10 +47,18 @@ const useStyles = makeStyles((theme: BackstageTheme) => ({ })); export const ContextMenu = (props: ContextMenuProps) => { - const { logsVisible, onToggleLogs, onStartOver } = props; + const { cancelEnabled, logsVisible, onStartOver, onToggleLogs, taskId } = + props; const classes = useStyles(); + const scaffolderApi = useApi(scaffolderApiRef); const [anchorEl, setAnchorEl] = useState(); + const [{ status: cancelStatus }, { execute: cancel }] = useAsync(async () => { + if (taskId) { + await scaffolderApi.cancelTask(taskId); + } + }); + return ( <> { + + + + + + diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx new file mode 100644 index 0000000000..c31322a9eb --- /dev/null +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx @@ -0,0 +1,84 @@ +/* + * 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 { OngoingTask } from './OngoingTask'; +import React from 'react'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; +import { act, fireEvent, waitFor } from '@testing-library/react'; +import { rootRouteRef } from '../../routes'; + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useParams: () => ({ taskId: 'my-task' }), +})); + +jest.mock('@backstage/plugin-scaffolder-react', () => ({ + ...jest.requireActual('@backstage/plugin-scaffolder-react'), + useTaskEventStream: () => ({ + cancelled: false, + loading: true, + stepLogs: {}, + completed: false, + steps: {}, + task: { + spec: { + steps: [], + templateInfo: { entity: { metadata: { name: 'my-template' } } }, + }, + }, + }), +})); + +describe('OngoingTask', () => { + const mockScaffolderApi = { + cancelTask: jest.fn(), + getTask: jest.fn().mockImplementation(async () => {}), + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should trigger cancel api on "Cancel" click in context menu', async () => { + const cancelOptionLabel = 'Cancel'; + const rendered = await renderInTestApp( + + + , + { mountedRoutes: { '/': rootRouteRef } }, + ); + const { getByText, getByTestId } = rendered; + + await act(async () => { + fireEvent.click(getByTestId('menu-button')); + }); + expect(getByTestId('cancel-task')).not.toHaveClass('Mui-disabled'); + + await act(async () => { + fireEvent.click(getByText(cancelOptionLabel)); + }); + + expect(mockScaffolderApi.cancelTask).toHaveBeenCalled(); + await act(async () => { + fireEvent.click(getByTestId('menu-button')); + }); + + await waitFor(() => { + expect(getByTestId('cancel-task')).toHaveClass('Mui-disabled'); + }); + }); +}); diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx index fc1c1a7413..f8026cf073 100644 --- a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useEffect, useMemo, useState, useCallback } from 'react'; -import { Page, Header, Content, ErrorPanel } from '@backstage/core-components'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { Content, ErrorPanel, Header, Page } from '@backstage/core-components'; import { useNavigate, useParams } from 'react-router-dom'; import { Box, makeStyles, Paper } from '@material-ui/core'; import { ScaffolderTaskOutput, useTaskEventStream, } from '@backstage/plugin-scaffolder-react'; -import { nextSelectedTemplateRouteRef } from '../routes'; +import { selectedTemplateRouteRef } from '../../routes'; import { useRouteRef } from '@backstage/core-plugin-api'; import qs from 'qs'; import { ContextMenu } from './ContextMenu'; @@ -45,7 +45,7 @@ export const OngoingTask = (props: { }) => { // todo(blam): check that task Id actually exists, and that it's valid. otherwise redirect to something more useful. const { taskId } = useParams(); - const templateRouteRef = useRouteRef(nextSelectedTemplateRouteRef); + const templateRouteRef = useRouteRef(selectedTemplateRouteRef); const navigate = useNavigate(); const taskStream = useTaskEventStream(taskId!); const classes = useStyles(); @@ -105,6 +105,8 @@ export const OngoingTask = (props: { const templateName = taskStream.task?.spec.templateInfo?.entity?.metadata.name; + const cancelEnabled = !(taskStream.cancelled || taskStream.completed); + return (
diff --git a/plugins/scaffolder/src/next/Router/Router.test.tsx b/plugins/scaffolder/src/next/Router/Router.test.tsx index 9565572a2f..3d52dd0dd0 100644 --- a/plugins/scaffolder/src/next/Router/Router.test.tsx +++ b/plugins/scaffolder/src/next/Router/Router.test.tsx @@ -47,6 +47,21 @@ describe('Router', () => { expect(TemplateListPage).toHaveBeenCalled(); }); + + it('should render user-provided TemplateListPage', async () => { + const { getByText } = await renderInTestApp( + <>foobar, + }} + />, + { + routeEntries: ['/'], + }, + ); + expect(getByText('foobar')).toBeInTheDocument(); + expect(TemplateListPage).not.toHaveBeenCalled(); + }); }); describe('/templates/:templateName', () => { @@ -58,6 +73,21 @@ describe('Router', () => { expect(TemplateWizardPage).toHaveBeenCalled(); }); + it('should render user-provided TemplateWizardPage', async () => { + const { getByText } = await renderInTestApp( + <>foobar, + }} + />, + { + routeEntries: ['/templates/default/foo'], + }, + ); + expect(getByText('foobar')).toBeInTheDocument(); + expect(TemplateWizardPage).not.toHaveBeenCalled(); + }); + it('should pass through the FormProps property', async () => { const transformErrorsMock = jest.fn(); diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index 5e199cae9b..9c50d0d979 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -15,11 +15,15 @@ */ import React, { PropsWithChildren } from 'react'; import { Routes, Route, useOutlet } from 'react-router-dom'; -import { TemplateListPage } from '../TemplateListPage'; -import { TemplateWizardPage } from '../TemplateWizardPage'; +import { TemplateListPage, TemplateListPageProps } from '../TemplateListPage'; +import { + TemplateWizardPage, + TemplateWizardPageProps, +} from '../TemplateWizardPage'; import { NextFieldExtensionOptions, FormProps, + TemplateGroupFilter, } from '@backstage/plugin-scaffolder-react/alpha'; import { ScaffolderTaskOutput, @@ -29,16 +33,15 @@ import { } from '@backstage/plugin-scaffolder-react'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { TemplateGroupFilter } from '../TemplateListPage/TemplateGroups'; import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default'; import { - nextActionsRouteRef, - nextEditRouteRef, - nextScaffolderListTaskRouteRef, - nextScaffolderTaskRouteRef, - nextSelectedTemplateRouteRef, -} from '../routes'; + actionsRouteRef, + editRouteRef, + scaffolderListTaskRouteRef, + scaffolderTaskRouteRef, + selectedTemplateRouteRef, +} from '../../routes'; import { ErrorPage } from '@backstage/core-components'; import { OngoingTask } from '../OngoingTask'; import { ActionsPage } from '../../components/ActionsPage'; @@ -59,8 +62,11 @@ export type NextRouterProps = { TemplateOutputsComponent?: React.ComponentType<{ output?: ScaffolderTaskOutput; }>; + TemplateListPageComponent?: React.ComponentType; + TemplateWizardPageComponent?: React.ComponentType; }; groups?: TemplateGroupFilter[]; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; // todo(blam): rename this to formProps FormProps?: FormProps; contextMenu?: { @@ -84,6 +90,8 @@ export const Router = (props: PropsWithChildren) => { TemplateCardComponent, TemplateOutputsComponent, TaskPageComponent = OngoingTask, + TemplateListPageComponent = TemplateListPage, + TemplateWizardPageComponent = TemplateWizardPage, } = {}, } = props; const outlet = useOutlet() || props.children; @@ -107,18 +115,19 @@ export const Router = (props: PropsWithChildren) => { } /> - ) => { } /> ) => { } /> ) => { } /> - } /> + } /> } /> { @@ -63,7 +63,7 @@ describe('TemplateListPage', () => { > , - { mountedRoutes: { '/': nextRouteRef } }, + { mountedRoutes: { '/': rootRouteRef } }, ); expect(getByPlaceholderText('Search')).toBeInTheDocument(); @@ -85,7 +85,7 @@ describe('TemplateListPage', () => { > , - { mountedRoutes: { '/': nextRouteRef } }, + { mountedRoutes: { '/': rootRouteRef } }, ); expect(getByRole('menuitem', { name: /All/ })).toBeInTheDocument(); @@ -108,7 +108,7 @@ describe('TemplateListPage', () => { > , - { mountedRoutes: { '/': nextRouteRef } }, + { mountedRoutes: { '/': rootRouteRef } }, ); expect(getByText('Categories')).toBeInTheDocument(); @@ -135,4 +135,54 @@ describe('TemplateListPage', () => { expect(getByText('Tags')).toBeInTheDocument(); }); + + describe('scaffolder page context menu', () => { + it('should render if context menu props are not set to false', async () => { + const { queryByTestId } = await renderInTestApp( + + + , + { mountedRoutes: { '/': rootRouteRef } }, + ); + expect(queryByTestId('menu-button')).toBeInTheDocument(); + }); + + it('should not render if context menu props are set to false', async () => { + const { queryByTestId } = await renderInTestApp( + + + , + { mountedRoutes: { '/': rootRouteRef } }, + ); + expect(queryByTestId('menu-button')).not.toBeInTheDocument(); + }); + }); }); diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx index bddc15a61b..863d3009e1 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx @@ -14,12 +14,15 @@ * limitations under the License. */ -import React from 'react'; +import React, { useCallback } from 'react'; +import { useNavigate } from 'react-router-dom'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; +import { useApp, useRouteRef } from '@backstage/core-plugin-api'; import { Content, ContentHeader, + DocsIcon, Header, Page, SupportButton, @@ -32,18 +35,33 @@ import { CatalogFilterLayout, UserListPicker, } from '@backstage/plugin-catalog-react'; -import { CategoryPicker } from './CategoryPicker'; -import { RegisterExistingButton } from './RegisterExistingButton'; -import { useRouteRef } from '@backstage/core-plugin-api'; -import { TemplateGroupFilter, TemplateGroups } from './TemplateGroups'; -import { registerComponentRouteRef } from '../../routes'; -import { ContextMenu } from './ContextMenu'; +import { + ScaffolderPageContextMenu, + TemplateCategoryPicker, + TemplateGroupFilter, + TemplateGroups, +} from '@backstage/plugin-scaffolder-react/alpha'; +import { RegisterExistingButton } from './RegisterExistingButton'; +import { + actionsRouteRef, + editRouteRef, + registerComponentRouteRef, + scaffolderListTaskRouteRef, + selectedTemplateRouteRef, + viewTechDocRouteRef, +} from '../../routes'; +import { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model'; + +/** + * @alpha + */ export type TemplateListPageProps = { TemplateCardComponent?: React.ComponentType<{ template: TemplateEntityV1beta3; }>; groups?: TemplateGroupFilter[]; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; contextMenu?: { editor?: boolean; actions?: boolean; @@ -66,14 +84,71 @@ const createGroupsWithOther = ( }, ]; +/** + * @alpha + */ export const TemplateListPage = (props: TemplateListPageProps) => { const registerComponentLink = useRouteRef(registerComponentRouteRef); - const { TemplateCardComponent, groups: givenGroups = [] } = props; + const { + TemplateCardComponent, + groups: givenGroups = [], + templateFilter, + } = props; + const navigate = useNavigate(); + const editorLink = useRouteRef(editRouteRef); + const actionsLink = useRouteRef(actionsRouteRef); + const tasksLink = useRouteRef(scaffolderListTaskRouteRef); + const viewTechDocsLink = useRouteRef(viewTechDocRouteRef); + const templateRoute = useRouteRef(selectedTemplateRouteRef); + const app = useApp(); const groups = givenGroups.length ? createGroupsWithOther(givenGroups) : [defaultGroup]; + const scaffolderPageContextMenuProps = { + onEditorClicked: + props?.contextMenu?.editor !== false + ? () => navigate(editorLink()) + : undefined, + onActionsClicked: + props?.contextMenu?.actions !== false + ? () => navigate(actionsLink()) + : undefined, + onTasksClicked: + props?.contextMenu?.tasks !== false + ? () => navigate(tasksLink()) + : undefined, + }; + + const additionalLinksForEntity = useCallback( + (template: TemplateEntityV1beta3) => { + const { kind, namespace, name } = parseEntityRef( + stringifyEntityRef(template), + ); + return template.metadata.annotations?.['backstage.io/techdocs-ref'] && + viewTechDocsLink + ? [ + { + icon: app.getSystemIcon('docs') ?? DocsIcon, + text: 'View TechDocs', + url: viewTechDocsLink({ kind, namespace, name }), + }, + ] + : []; + }, + [app, viewTechDocsLink], + ); + + const onTemplateSelected = useCallback( + (template: TemplateEntityV1beta3) => { + const { namespace, name } = parseEntityRef(stringifyEntityRef(template)); + + navigate(templateRoute({ namespace, templateName: name })); + }, + [navigate, templateRoute], + ); + return ( @@ -82,7 +157,7 @@ export const TemplateListPage = (props: TemplateListPageProps) => { title="Create a new component" subtitle="Create new software components using standard templates in your organization" > - +
@@ -105,13 +180,16 @@ export const TemplateListPage = (props: TemplateListPageProps) => { initialFilter="all" availableFilters={['all', 'starred']} /> - + diff --git a/plugins/scaffolder/src/next/TemplateListPage/index.ts b/plugins/scaffolder/src/next/TemplateListPage/index.ts index 0436cfeeeb..c404a9352a 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/index.ts +++ b/plugins/scaffolder/src/next/TemplateListPage/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ export { TemplateListPage } from './TemplateListPage'; -export type { TemplateGroupFilter } from './TemplateGroups'; +export type { TemplateListPageProps } from './TemplateListPage'; diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx index c4f9c75ceb..26a9dd946c 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx @@ -29,7 +29,6 @@ import { } from '@backstage/plugin-scaffolder-react'; import { TemplateWizardPage } from './TemplateWizardPage'; import { rootRouteRef } from '../../routes'; -import { nextRouteRef } from '../routes'; jest.mock('react-router-dom', () => { return { @@ -41,6 +40,7 @@ jest.mock('react-router-dom', () => { }); const scaffolderApiMock: jest.Mocked = { + cancelTask: jest.fn(), scaffold: jest.fn(), getTemplateParameterSchema: jest.fn(), getIntegrationsList: jest.fn(), @@ -83,8 +83,7 @@ describe('TemplateWizardPage', () => { , { mountedRoutes: { - '/create': nextRouteRef, - '/create-legacy': rootRouteRef, + '/create': rootRouteRef, }, }, ); diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx index 4825715fcb..a7133ae8c7 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx @@ -34,12 +34,16 @@ import { } from '@backstage/plugin-scaffolder-react/alpha'; import { JsonValue } from '@backstage/types'; import { Header, Page } from '@backstage/core-components'; -import { - nextRouteRef, - nextScaffolderTaskRouteRef, - nextSelectedTemplateRouteRef, -} from '../routes'; +import { + rootRouteRef, + scaffolderTaskRouteRef, + selectedTemplateRouteRef, +} from '../../routes'; + +/** + * @alpha + */ export type TemplateWizardPageProps = { customFieldExtensions: NextFieldExtensionOptions[]; layouts?: LayoutOptions[]; @@ -47,13 +51,13 @@ export type TemplateWizardPageProps = { }; export const TemplateWizardPage = (props: TemplateWizardPageProps) => { - const rootRef = useRouteRef(nextRouteRef); - const taskRoute = useRouteRef(nextScaffolderTaskRouteRef); + const rootRef = useRouteRef(rootRouteRef); + const taskRoute = useRouteRef(scaffolderTaskRouteRef); const { secrets } = useTemplateSecrets(); const scaffolderApi = useApi(scaffolderApiRef); const navigate = useNavigate(); const { templateName, namespace } = useRouteRefParams( - nextSelectedTemplateRouteRef, + selectedTemplateRouteRef, ); const templateRef = stringifyEntityRef({ diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/index.ts b/plugins/scaffolder/src/next/TemplateWizardPage/index.ts index 146a7a9afc..991b754ec9 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/index.ts +++ b/plugins/scaffolder/src/next/TemplateWizardPage/index.ts @@ -14,3 +14,4 @@ * limitations under the License. */ export { TemplateWizardPage } from './TemplateWizardPage'; +export type { TemplateWizardPageProps } from './TemplateWizardPage'; diff --git a/plugins/scaffolder/src/next/index.ts b/plugins/scaffolder/src/next/index.ts index 1ca9096459..6cef3eaa03 100644 --- a/plugins/scaffolder/src/next/index.ts +++ b/plugins/scaffolder/src/next/index.ts @@ -17,4 +17,3 @@ export * from './Router'; export * from './TemplateListPage'; export * from './TemplateWizardPage'; export * from './types'; -export * from './routes'; diff --git a/plugins/scaffolder/src/next/routes.ts b/plugins/scaffolder/src/next/routes.ts deleted file mode 100644 index 12fad4210a..0000000000 --- a/plugins/scaffolder/src/next/routes.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2022 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api'; - -/** @alpha */ -export const nextRouteRef = createRouteRef({ - id: 'scaffolder/next', -}); - -/** @alpha */ -export const nextSelectedTemplateRouteRef = createSubRouteRef({ - id: 'scaffolder/next/selected-template', - parent: nextRouteRef, - path: '/templates/:namespace/:templateName', -}); - -/** @alpha */ -export const nextScaffolderTaskRouteRef = createSubRouteRef({ - id: 'scaffolder/next/task', - parent: nextRouteRef, - path: '/tasks/:taskId', -}); - -/** @alpha */ -export const nextScaffolderListTaskRouteRef = createSubRouteRef({ - id: 'scaffolder/next/list-tasks', - parent: nextRouteRef, - path: '/tasks', -}); - -/** @alpha */ -export const nextActionsRouteRef = createSubRouteRef({ - id: 'scaffolder/next/actions', - parent: nextRouteRef, - path: '/actions', -}); - -/** @alpha */ -export const nextEditRouteRef = createSubRouteRef({ - id: 'scaffolder/next/edit', - parent: nextRouteRef, - path: '/edit', -}); diff --git a/plugins/scaffolder/src/plugin.tsx b/plugins/scaffolder/src/plugin.tsx index f6801c6371..dfe87a3780 100644 --- a/plugins/scaffolder/src/plugin.tsx +++ b/plugins/scaffolder/src/plugin.tsx @@ -60,8 +60,10 @@ import { viewTechDocRouteRef, selectedTemplateRouteRef, scaffolderTaskRouteRef, + scaffolderListTaskRouteRef, + actionsRouteRef, + editRouteRef, } from './routes'; -import { nextRouteRef } from './next'; /** * The main plugin export for the scaffolder. @@ -91,6 +93,9 @@ export const scaffolderPlugin = createPlugin({ root: rootRouteRef, selectedTemplate: selectedTemplateRouteRef, ongoingTask: scaffolderTaskRouteRef, + actions: actionsRouteRef, + listTasks: scaffolderListTaskRouteRef, + edit: editRouteRef, }, externalRoutes: { registerComponent: registerComponentRouteRef, @@ -199,6 +204,6 @@ export const NextScaffolderPage = scaffolderPlugin.provide( createRoutableExtension({ name: 'NextScaffolderPage', component: () => import('./next/Router').then(m => m.Router), - mountPoint: nextRouteRef, + mountPoint: rootRouteRef, }), ); diff --git a/plugins/search-backend-module-catalog/.eslintrc.js b/plugins/search-backend-module-catalog/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/search-backend-module-catalog/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/search-backend-module-catalog/README.md b/plugins/search-backend-module-catalog/README.md new file mode 100644 index 0000000000..b5960e2789 --- /dev/null +++ b/plugins/search-backend-module-catalog/README.md @@ -0,0 +1,41 @@ +# search-backend-module-catalog + +> DISCLAIMER: The new backend system is in alpha, and so are the search backend module support for the new backend system. We don't recommend you to migrate your backend installations to the new system yet. But if you want to experiment, you can find getting started guides below. + +This package exports catalog backend modules responsible for extending search. + +## Example + +### Use default schedule + +```tsx +// packages/backend-next/src/index.ts +import { createBackend } from '@backstage/backend-defaults'; +import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; +import { searchModuleCatalogCollator } from '@backstage/plugin-search-backend-module-catalog/alpha'; + +const backend = createBackend(); +backend.add(searchPlugin()); +backend.add(searchModuleCatalogCollator()); +backend.start(); +``` + +### Use custom schedule + +```tsx +// packages/backend-next/src/index.ts +import { createBackend } from '@backstage/backend-defaults'; +import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; +import { searchModuleCatalogCollator } from '@backstage/plugin-search-backend-module-catalog/alpha'; + +const schedule = { + frequency: { minutes: 10 }, + timeout: { minutes: 15 }, + initialDelay: { seconds: 3 }, +}; + +const backend = createBackend(); +backend.add(searchPlugin()); +backend.add(searchModuleCatalogCollator({ schedule })); +backend.start(); +``` diff --git a/plugins/search-backend-module-catalog/alpha-api-report.md b/plugins/search-backend-module-catalog/alpha-api-report.md new file mode 100644 index 0000000000..70fae9ef93 --- /dev/null +++ b/plugins/search-backend-module-catalog/alpha-api-report.md @@ -0,0 +1,24 @@ +## 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'; +import { DefaultCatalogCollatorFactoryOptions } from '@backstage/plugin-search-backend-module-catalog'; +import { TaskScheduleDefinition } from '@backstage/backend-tasks'; + +// @alpha +export const searchModuleCatalogCollator: ( + options?: SearchModuleCatalogCollatorOptions | undefined, +) => BackendFeature; + +// @alpha +export type SearchModuleCatalogCollatorOptions = Omit< + DefaultCatalogCollatorFactoryOptions, + 'discovery' | 'tokenManager' +> & { + schedule?: TaskScheduleDefinition; +}; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/search-backend-module-catalog/api-report.md b/plugins/search-backend-module-catalog/api-report.md new file mode 100644 index 0000000000..b773860fe8 --- /dev/null +++ b/plugins/search-backend-module-catalog/api-report.md @@ -0,0 +1,52 @@ +## 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 { CatalogApi } from '@backstage/catalog-client'; +import { CatalogEntityDocument } from '@backstage/plugin-catalog-common'; +import { Config } from '@backstage/config'; +import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; +import { Entity } from '@backstage/catalog-model'; +import { GetEntitiesRequest } from '@backstage/catalog-client'; +import { Permission } from '@backstage/plugin-permission-common'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { Readable } from 'stream'; +import { TokenManager } from '@backstage/backend-common'; + +// @public (undocumented) +export type CatalogCollatorEntityTransformer = ( + entity: Entity, +) => Omit; + +// @public (undocumented) +export const defaultCatalogCollatorEntityTransformer: CatalogCollatorEntityTransformer; + +// @public (undocumented) +export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { + // (undocumented) + static fromConfig( + _config: Config, + options: DefaultCatalogCollatorFactoryOptions, + ): DefaultCatalogCollatorFactory; + // (undocumented) + getCollator(): Promise; + // (undocumented) + readonly type = 'software-catalog'; + // (undocumented) + readonly visibilityPermission: Permission; +} + +// @public (undocumented) +export type DefaultCatalogCollatorFactoryOptions = { + discovery: PluginEndpointDiscovery; + tokenManager: TokenManager; + locationTemplate?: string; + filter?: GetEntitiesRequest['filter']; + batchSize?: number; + catalogClient?: CatalogApi; + entityTransformer?: CatalogCollatorEntityTransformer; +}; +``` diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json new file mode 100644 index 0000000000..4c323ae7fd --- /dev/null +++ b/plugins/search-backend-module-catalog/package.json @@ -0,0 +1,59 @@ +{ + "name": "@backstage/plugin-search-backend-module-catalog", + "description": "A module for the search backend that exports catalog modules", + "version": "0.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, + "backstage": { + "role": "backend-plugin-module" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "clean": "backstage-cli package clean" + }, + "dependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/backend-tasks": "workspace:^", + "@backstage/catalog-client": "workspace:^", + "@backstage/catalog-model": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", + "@backstage/plugin-search-backend-node": "workspace:^", + "@backstage/plugin-search-common": "workspace:^" + }, + "devDependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/backend-test-utils": "workspace:^", + "@backstage/cli": "workspace:^", + "msw": "^1.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/search-backend-module-catalog/src/alpha.test.ts b/plugins/search-backend-module-catalog/src/alpha.test.ts new file mode 100644 index 0000000000..8a3082c6aa --- /dev/null +++ b/plugins/search-backend-module-catalog/src/alpha.test.ts @@ -0,0 +1,46 @@ +/* + * 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 { startTestBackend } from '@backstage/backend-test-utils'; +import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; +import { searchModuleCatalogCollator } from './alpha'; + +describe('searchModuleCatalogCollator', () => { + const schedule = { + frequency: { minutes: 10 }, + timeout: { minutes: 15 }, + initialDelay: { seconds: 3 }, + }; + + it('should register the catalog collator to the search index registry extension point with factory and schedule', async () => { + const extensionPointMock = { + addCollator: jest.fn(), + }; + + await startTestBackend({ + extensionPoints: [ + [searchIndexRegistryExtensionPoint, extensionPointMock], + ], + features: [searchModuleCatalogCollator({ schedule })], + }); + + expect(extensionPointMock.addCollator).toHaveBeenCalledTimes(1); + expect(extensionPointMock.addCollator).toHaveBeenCalledWith({ + factory: expect.objectContaining({ type: 'software-catalog' }), + schedule: expect.objectContaining({ run: expect.any(Function) }), + }); + }); +}); diff --git a/plugins/search-backend-module-catalog/src/alpha.ts b/plugins/search-backend-module-catalog/src/alpha.ts new file mode 100644 index 0000000000..c633dc71b2 --- /dev/null +++ b/plugins/search-backend-module-catalog/src/alpha.ts @@ -0,0 +1,89 @@ +/* + * 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. + */ + +/** + * @packageDocumentation + * A module for the search backend that exports Catalog modules. + */ + +import { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { TaskScheduleDefinition } from '@backstage/backend-tasks'; +import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; + +import { + DefaultCatalogCollatorFactory, + DefaultCatalogCollatorFactoryOptions, +} from '@backstage/plugin-search-backend-module-catalog'; + +/** + * @alpha + * Options for {@link searchModuleCatalogCollator}. + */ +export type SearchModuleCatalogCollatorOptions = Omit< + DefaultCatalogCollatorFactoryOptions, + 'discovery' | 'tokenManager' +> & { + schedule?: TaskScheduleDefinition; +}; + +/** + * @alpha + * Search backend module for the Catalog index. + */ +export const searchModuleCatalogCollator = createBackendModule( + (options?: SearchModuleCatalogCollatorOptions) => ({ + moduleId: 'catalogCollator', + pluginId: 'search', + register(env) { + env.registerInit({ + deps: { + config: coreServices.config, + discovery: coreServices.discovery, + tokenManager: coreServices.tokenManager, + scheduler: coreServices.scheduler, + indexRegistry: searchIndexRegistryExtensionPoint, + }, + async init({ + config, + discovery, + tokenManager, + scheduler, + indexRegistry, + }) { + const defaultSchedule = { + frequency: { minutes: 10 }, + timeout: { minutes: 15 }, + initialDelay: { seconds: 3 }, + }; + + indexRegistry.addCollator({ + schedule: scheduler.createScheduledTaskRunner( + options?.schedule ?? defaultSchedule, + ), + factory: DefaultCatalogCollatorFactory.fromConfig(config, { + ...options, + discovery, + tokenManager, + }), + }); + }, + }); + }, + }), +); diff --git a/plugins/catalog-backend/src/search/CatalogCollatorEntityTransformer.ts b/plugins/search-backend-module-catalog/src/collators/CatalogCollatorEntityTransformer.ts similarity index 100% rename from plugins/catalog-backend/src/search/CatalogCollatorEntityTransformer.ts rename to plugins/search-backend-module-catalog/src/collators/CatalogCollatorEntityTransformer.ts diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.test.ts b/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.test.ts similarity index 100% rename from plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.test.ts rename to plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.test.ts diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.ts b/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts similarity index 100% rename from plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.ts rename to plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts diff --git a/plugins/catalog-backend/src/search/defaultCatalogCollatorEntityTransformer.test.ts b/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.test.ts similarity index 100% rename from plugins/catalog-backend/src/search/defaultCatalogCollatorEntityTransformer.test.ts rename to plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.test.ts diff --git a/plugins/catalog-backend/src/search/defaultCatalogCollatorEntityTransformer.ts b/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.ts similarity index 100% rename from plugins/catalog-backend/src/search/defaultCatalogCollatorEntityTransformer.ts rename to plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.ts diff --git a/plugins/search-backend-module-catalog/src/collators/index.ts b/plugins/search-backend-module-catalog/src/collators/index.ts new file mode 100644 index 0000000000..5876e71a02 --- /dev/null +++ b/plugins/search-backend-module-catalog/src/collators/index.ts @@ -0,0 +1,21 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { 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 new file mode 100644 index 0000000000..7998562311 --- /dev/null +++ b/plugins/search-backend-module-catalog/src/index.ts @@ -0,0 +1,22 @@ +/* + * 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. + */ + +/** + * @packageDocumentation + * A module for the search backend that exports Catalog modules. + */ + +export * from './collators'; diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index 8576e6602c..a7ef318ec1 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.5-next.0 + - @backstage/plugin-search-common@1.2.2 + +## 1.1.4 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + ## 1.1.4-next.2 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/alpha-api-report.md b/plugins/search-backend-module-elasticsearch/alpha-api-report.md new file mode 100644 index 0000000000..91007c20de --- /dev/null +++ b/plugins/search-backend-module-elasticsearch/alpha-api-report.md @@ -0,0 +1,22 @@ +## API Report File for "@backstage/plugin-search-backend-module-elasticsearch" + +> 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'; +import { ElasticSearchCustomIndexTemplate } from '@backstage/plugin-search-backend-module-elasticsearch'; +import { ElasticSearchQueryTranslator } from '@backstage/plugin-search-backend-module-elasticsearch'; + +// @alpha +export const searchModuleElasticsearchEngine: ( + options?: SearchModuleElasticsearchEngineOptions | undefined, +) => BackendFeature; + +// @alpha +export type SearchModuleElasticsearchEngineOptions = { + translator?: ElasticSearchQueryTranslator; + indexTemplate?: ElasticSearchCustomIndexTemplate; +}; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 6520571ec6..285ab4e2fe 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,14 +1,27 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", "description": "A module for the search backend that implements search using ElasticSearch", - "version": "1.1.4-next.2", + "version": "1.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", "publishConfig": { - "access": "public", - "main": "dist/index.cjs.js", - "types": "dist/index.d.ts" + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } }, "backstage": { "role": "backend-plugin-module" @@ -23,6 +36,8 @@ "clean": "backstage-cli package clean" }, "dependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-search-common": "workspace:^", diff --git a/plugins/search-backend-module-elasticsearch/src/alpha.ts b/plugins/search-backend-module-elasticsearch/src/alpha.ts new file mode 100644 index 0000000000..538124f004 --- /dev/null +++ b/plugins/search-backend-module-elasticsearch/src/alpha.ts @@ -0,0 +1,74 @@ +/* + * 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 { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { searchEngineRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; + +import { + ElasticSearchCustomIndexTemplate, + ElasticSearchQueryTranslator, + ElasticSearchSearchEngine, +} from '@backstage/plugin-search-backend-module-elasticsearch'; + +/** + * @alpha + * Options for {@link searchModuleElasticsearchEngine}. + */ +export type SearchModuleElasticsearchEngineOptions = { + translator?: ElasticSearchQueryTranslator; + indexTemplate?: ElasticSearchCustomIndexTemplate; +}; + +/** + * @alpha + * Search backend module for the Elasticsearch engine. + */ +export const searchModuleElasticsearchEngine = createBackendModule( + (options?: SearchModuleElasticsearchEngineOptions) => ({ + moduleId: 'elasticsearchEngine', + pluginId: 'search', + register(env) { + env.registerInit({ + deps: { + searchEngineRegistry: searchEngineRegistryExtensionPoint, + logger: coreServices.logger, + config: coreServices.config, + }, + async init({ searchEngineRegistry, logger, config }) { + const searchEngine = await ElasticSearchSearchEngine.fromConfig({ + logger: loggerToWinstonLogger(logger), + config: config, + }); + + // set custom translator if available + if (options?.translator) { + searchEngine.setTranslator(options.translator); + } + + // set custom index template if available + if (options?.indexTemplate) { + searchEngine.setIndexTemplate(options.indexTemplate); + } + + searchEngineRegistry.setSearchEngine(searchEngine); + }, + }); + }, + }), +); diff --git a/plugins/search-backend-module-explore/.eslintrc.js b/plugins/search-backend-module-explore/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/search-backend-module-explore/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/search-backend-module-explore/README.md b/plugins/search-backend-module-explore/README.md new file mode 100644 index 0000000000..a87f2d78f9 --- /dev/null +++ b/plugins/search-backend-module-explore/README.md @@ -0,0 +1,41 @@ +# search-backend-module-explore + +> DISCLAIMER: The new backend system is in alpha, and so are the search backend module support for the new backend system. We don't recommend you to migrate your backend installations to the new system yet. But if you want to experiment, you can find getting started guides below. + +This package exports explore backend modules responsible for extending search. + +## Example + +### Use default schedule + +```tsx +// packages/backend-next/src/index.ts +import { createBackend } from '@backstage/backend-defaults'; +import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; +import { searchModuleExploreCollator } from '@backstage/plugin-search-backend-module-explore/alpha'; + +const backend = createBackend(); +backend.add(searchPlugin()); +backend.add(searchModuleExploreCollator()); +backend.start(); +``` + +### Use custom schedule + +```tsx +// packages/backend-next/src/index.ts +import { createBackend } from '@backstage/backend-defaults'; +import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; +import { searchModuleExploreCollator } from '@backstage/plugin-search-backend-module-explore/alpha'; + +const schedule = { + frequency: { minutes: 10 }, + timeout: { minutes: 15 }, + initialDelay: { seconds: 3 }, +}; + +const backend = createBackend(); +backend.add(searchPlugin()); +backend.add(searchModuleExploreCollator({ schedule })); +backend.start(); +``` diff --git a/plugins/search-backend-module-explore/alpha-api-report.md b/plugins/search-backend-module-explore/alpha-api-report.md new file mode 100644 index 0000000000..cf32b59dd3 --- /dev/null +++ b/plugins/search-backend-module-explore/alpha-api-report.md @@ -0,0 +1,24 @@ +## API Report File for "@backstage/plugin-search-backend-module-explore" + +> 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'; +import { TaskScheduleDefinition } from '@backstage/backend-tasks'; +import { ToolDocumentCollatorFactoryOptions } from '@backstage/plugin-search-backend-module-explore'; + +// @alpha +export const searchModuleExploreCollator: ( + options?: SearchModuleExploreCollatorOptions | undefined, +) => BackendFeature; + +// @alpha +export type SearchModuleExploreCollatorOptions = Omit< + ToolDocumentCollatorFactoryOptions, + 'logger' | 'discovery' +> & { + schedule?: TaskScheduleDefinition; +}; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/search-backend-module-explore/api-report.md b/plugins/search-backend-module-explore/api-report.md new file mode 100644 index 0000000000..80e8c0c06b --- /dev/null +++ b/plugins/search-backend-module-explore/api-report.md @@ -0,0 +1,39 @@ +## API Report File for "@backstage/plugin-search-backend-module-explore" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +import { Config } from '@backstage/config'; +import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; +import { ExploreTool } from '@backstage/plugin-explore-common'; +import { IndexableDocument } from '@backstage/plugin-search-common'; +import { Logger } from 'winston'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { Readable } from 'stream'; + +// @public +export interface ToolDocument extends IndexableDocument, ExploreTool {} + +// @public +export class ToolDocumentCollatorFactory implements DocumentCollatorFactory { + // (undocumented) + execute(): AsyncGenerator; + // (undocumented) + static fromConfig( + _config: Config, + options: ToolDocumentCollatorFactoryOptions, + ): ToolDocumentCollatorFactory; + // (undocumented) + getCollator(): Promise; + // (undocumented) + readonly type: string; +} + +// @public +export type ToolDocumentCollatorFactoryOptions = { + discovery: PluginEndpointDiscovery; + logger: Logger; +}; +``` diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json new file mode 100644 index 0000000000..e4c71448ff --- /dev/null +++ b/plugins/search-backend-module-explore/package.json @@ -0,0 +1,56 @@ +{ + "name": "@backstage/plugin-search-backend-module-explore", + "description": "A module for the search backend that exports explore modules", + "version": "0.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, + "backstage": { + "role": "backend-plugin-module" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "clean": "backstage-cli package clean" + }, + "dependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/backend-tasks": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/plugin-explore-common": "workspace:^", + "@backstage/plugin-search-backend-node": "workspace:^", + "@backstage/plugin-search-common": "workspace:^", + "node-fetch": "^2.6.7", + "winston": "^3.2.1" + }, + "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", + "@backstage/cli": "workspace:^" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/search-backend-module-explore/src/alpha.test.ts b/plugins/search-backend-module-explore/src/alpha.test.ts new file mode 100644 index 0000000000..9b133f0fd5 --- /dev/null +++ b/plugins/search-backend-module-explore/src/alpha.test.ts @@ -0,0 +1,46 @@ +/* + * 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 { startTestBackend } from '@backstage/backend-test-utils'; +import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; +import { searchModuleExploreCollator } from './alpha'; + +describe('searchModuleExploreCollator', () => { + const schedule = { + frequency: { minutes: 10 }, + timeout: { minutes: 15 }, + initialDelay: { seconds: 3 }, + }; + + it('should register the explore collator to the search index registry extension point with factory and schedule', async () => { + const extensionPointMock = { + addCollator: jest.fn(), + }; + + await startTestBackend({ + extensionPoints: [ + [searchIndexRegistryExtensionPoint, extensionPointMock], + ], + features: [searchModuleExploreCollator({ schedule })], + }); + + expect(extensionPointMock.addCollator).toHaveBeenCalledTimes(1); + expect(extensionPointMock.addCollator).toHaveBeenCalledWith({ + factory: expect.objectContaining({ type: 'tools' }), + schedule: expect.objectContaining({ run: expect.any(Function) }), + }); + }); +}); diff --git a/plugins/search-backend-module-explore/src/alpha.ts b/plugins/search-backend-module-explore/src/alpha.ts new file mode 100644 index 0000000000..f13c3c2406 --- /dev/null +++ b/plugins/search-backend-module-explore/src/alpha.ts @@ -0,0 +1,84 @@ +/* + * 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. + */ + +/** + * @packageDocumentation + * A module for the search backend that exports Explore modules. + */ + +import { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { TaskScheduleDefinition } from '@backstage/backend-tasks'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; + +import { + ToolDocumentCollatorFactory, + ToolDocumentCollatorFactoryOptions, +} from '@backstage/plugin-search-backend-module-explore'; + +/** + * @alpha + * Options for {@link searchModuleExploreCollator}. + */ +export type SearchModuleExploreCollatorOptions = Omit< + ToolDocumentCollatorFactoryOptions, + 'logger' | 'discovery' +> & { + schedule?: TaskScheduleDefinition; +}; + +/** + * @alpha + * Search backend module for the Explore index. + */ +export const searchModuleExploreCollator = createBackendModule( + (options?: SearchModuleExploreCollatorOptions) => ({ + moduleId: 'exploreCollator', + pluginId: 'search', + register(env) { + env.registerInit({ + deps: { + config: coreServices.config, + logger: coreServices.logger, + discovery: coreServices.discovery, + scheduler: coreServices.scheduler, + indexRegistry: searchIndexRegistryExtensionPoint, + }, + async init({ config, logger, discovery, scheduler, indexRegistry }) { + const defaultSchedule = { + frequency: { minutes: 10 }, + timeout: { minutes: 15 }, + initialDelay: { seconds: 3 }, + }; + + indexRegistry.addCollator({ + schedule: scheduler.createScheduledTaskRunner( + options?.schedule ?? defaultSchedule, + ), + factory: ToolDocumentCollatorFactory.fromConfig(config, { + ...options, + discovery, + logger: loggerToWinstonLogger(logger), + }), + }); + }, + }); + }, + }), +); diff --git a/plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts b/plugins/search-backend-module-explore/src/collators/ToolDocumentCollatorFactory.ts similarity index 100% rename from plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts rename to plugins/search-backend-module-explore/src/collators/ToolDocumentCollatorFactory.ts diff --git a/plugins/explore-backend/src/search/index.ts b/plugins/search-backend-module-explore/src/collators/index.ts similarity index 99% rename from plugins/explore-backend/src/search/index.ts rename to plugins/search-backend-module-explore/src/collators/index.ts index 70e9414652..45f0c933e2 100644 --- a/plugins/explore-backend/src/search/index.ts +++ b/plugins/search-backend-module-explore/src/collators/index.ts @@ -15,6 +15,7 @@ */ export { ToolDocumentCollatorFactory } from './ToolDocumentCollatorFactory'; + export type { ToolDocument, ToolDocumentCollatorFactoryOptions, diff --git a/plugins/search-backend-module-explore/src/index.ts b/plugins/search-backend-module-explore/src/index.ts new file mode 100644 index 0000000000..ea94071984 --- /dev/null +++ b/plugins/search-backend-module-explore/src/index.ts @@ -0,0 +1,22 @@ +/* + * 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. + */ + +/** + * @packageDocumentation + * A module for the search backend that exports Explore modules. + */ + +export * from './collators'; diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index db32c01817..8f3f01e83c 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.5-next.0 + - @backstage/plugin-search-common@1.2.2 + +## 0.5.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + ## 0.5.4-next.2 ### Patch Changes diff --git a/plugins/search-backend-module-pg/alpha-api-report.md b/plugins/search-backend-module-pg/alpha-api-report.md new file mode 100644 index 0000000000..eaee78e944 --- /dev/null +++ b/plugins/search-backend-module-pg/alpha-api-report.md @@ -0,0 +1,12 @@ +## API Report File for "@backstage/plugin-search-backend-module-pg" + +> 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 +export const searchModulePostgresEngine: () => BackendFeature; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index c6513c8e27..28432f2025 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,14 +1,27 @@ { "name": "@backstage/plugin-search-backend-module-pg", "description": "A module for the search backend that implements search using PostgreSQL", - "version": "0.5.4-next.2", + "version": "0.5.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", "publishConfig": { - "access": "public", - "main": "dist/index.cjs.js", - "types": "dist/index.d.ts" + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } }, "backstage": { "role": "backend-plugin-module" @@ -24,6 +37,7 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-search-common": "workspace:^", diff --git a/plugins/search-backend-module-pg/src/alpha.ts b/plugins/search-backend-module-pg/src/alpha.ts new file mode 100644 index 0000000000..e3e0087957 --- /dev/null +++ b/plugins/search-backend-module-pg/src/alpha.ts @@ -0,0 +1,46 @@ +/* + * 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 { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { searchEngineRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; +import { PgSearchEngine } from './PgSearchEngine'; + +/** + * @alpha + * Search backend module for the Postgres engine. + */ +export const searchModulePostgresEngine = createBackendModule({ + moduleId: 'postgresEngine', + pluginId: 'search', + register(env) { + env.registerInit({ + deps: { + searchEngineRegistry: searchEngineRegistryExtensionPoint, + database: coreServices.database, + config: coreServices.config, + }, + async init({ searchEngineRegistry, database, config }) { + searchEngineRegistry.setSearchEngine( + await PgSearchEngine.fromConfig(config, { + database: database, + }), + ); + }, + }); + }, +}); diff --git a/plugins/search-backend-module-techdocs/.eslintrc.js b/plugins/search-backend-module-techdocs/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/search-backend-module-techdocs/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/search-backend-module-techdocs/README.md b/plugins/search-backend-module-techdocs/README.md new file mode 100644 index 0000000000..5de310466b --- /dev/null +++ b/plugins/search-backend-module-techdocs/README.md @@ -0,0 +1,41 @@ +# search-backend-module-techdocs + +> DISCLAIMER: The new backend system is in alpha, and so are the search backend module support for the new backend system. We don't recommend you to migrate your backend installations to the new system yet. But if you want to experiment, you can find getting started guides below. + +This package exports techdocs backend modules responsible for extending search. + +## Example + +### Use default schedule + +```tsx +// packages/backend-next/src/index.ts +import { createBackend } from '@backstage/backend-defaults'; +import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; +import { searchModuleTechDocsCollator } from '@backstage/plugin-search-backend-module-techdocs/alpha'; + +const backend = createBackend(); +backend.add(searchPlugin()); +backend.add(searchModuleTechDocsCollator()); +backend.start(); +``` + +### Use custom schedule + +```tsx +// packages/backend-next/src/index.ts +import { createBackend } from '@backstage/backend-defaults'; +import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; +import { searchModuleTechDocsCollator } from '@backstage/plugin-search-backend-module-techdocs/alpha'; + +const schedule = { + frequency: { minutes: 10 }, + timeout: { minutes: 15 }, + initialDelay: { seconds: 3 }, +}; + +const backend = createBackend(); +backend.add(searchPlugin()); +backend.add(searchModuleTechDocsCollator({ schedule })); +backend.start(); +``` diff --git a/plugins/search-backend-module-techdocs/alpha-api-report.md b/plugins/search-backend-module-techdocs/alpha-api-report.md new file mode 100644 index 0000000000..71ce09b744 --- /dev/null +++ b/plugins/search-backend-module-techdocs/alpha-api-report.md @@ -0,0 +1,24 @@ +## API Report File for "@backstage/plugin-search-backend-module-techdocs" + +> 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'; +import { TaskScheduleDefinition } from '@backstage/backend-tasks'; +import { TechDocsCollatorFactoryOptions } from '@backstage/plugin-search-backend-module-techdocs'; + +// @alpha +export const searchModuleTechDocsCollator: ( + options?: SearchModuleTechDocsCollatorOptions | undefined, +) => BackendFeature; + +// @alpha +export type SearchModuleTechDocsCollatorOptions = Omit< + TechDocsCollatorFactoryOptions, + 'logger' | 'discovery' | 'tokenManager' +> & { + schedule?: TaskScheduleDefinition; +}; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/search-backend-module-techdocs/api-report.md b/plugins/search-backend-module-techdocs/api-report.md new file mode 100644 index 0000000000..9f72b1c487 --- /dev/null +++ b/plugins/search-backend-module-techdocs/api-report.md @@ -0,0 +1,42 @@ +## API Report File for "@backstage/plugin-search-backend-module-techdocs" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +import { CatalogApi } from '@backstage/catalog-client'; +import { Config } from '@backstage/config'; +import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; +import { Logger } from 'winston'; +import { Permission } from '@backstage/plugin-permission-common'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { Readable } from 'stream'; +import { TokenManager } from '@backstage/backend-common'; + +// @public +export class DefaultTechDocsCollatorFactory implements DocumentCollatorFactory { + // (undocumented) + static fromConfig( + config: Config, + options: TechDocsCollatorFactoryOptions, + ): DefaultTechDocsCollatorFactory; + // (undocumented) + getCollator(): Promise; + // (undocumented) + readonly type: string; + // (undocumented) + readonly visibilityPermission: Permission; +} + +// @public +export type TechDocsCollatorFactoryOptions = { + discovery: PluginEndpointDiscovery; + logger: Logger; + tokenManager: TokenManager; + locationTemplate?: string; + catalogClient?: CatalogApi; + parallelismLimit?: number; + legacyPathCasing?: boolean; +}; +``` diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json new file mode 100644 index 0000000000..d08193be29 --- /dev/null +++ b/plugins/search-backend-module-techdocs/package.json @@ -0,0 +1,63 @@ +{ + "name": "@backstage/plugin-search-backend-module-techdocs", + "description": "A module for the search backend that exports techdocs modules", + "version": "0.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, + "backstage": { + "role": "backend-plugin-module" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "clean": "backstage-cli package clean" + }, + "dependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/backend-tasks": "workspace:^", + "@backstage/catalog-client": "workspace:^", + "@backstage/catalog-model": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", + "@backstage/plugin-search-backend-node": "workspace:^", + "@backstage/plugin-search-common": "workspace:^", + "@backstage/plugin-techdocs-node": "workspace:^", + "lodash": "^4.17.21", + "node-fetch": "^2.6.7", + "p-limit": "^3.1.0", + "winston": "^3.2.1" + }, + "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", + "@backstage/cli": "workspace:^", + "msw": "^1.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/search-backend-module-techdocs/src/alpha.test.ts b/plugins/search-backend-module-techdocs/src/alpha.test.ts new file mode 100644 index 0000000000..011b00b12c --- /dev/null +++ b/plugins/search-backend-module-techdocs/src/alpha.test.ts @@ -0,0 +1,46 @@ +/* + * 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 { startTestBackend } from '@backstage/backend-test-utils'; +import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; +import { searchModuleTechDocsCollator } from './alpha'; + +describe('searchModuleTechDocsCollator', () => { + const schedule = { + frequency: { minutes: 10 }, + timeout: { minutes: 15 }, + initialDelay: { seconds: 3 }, + }; + + it('should register the techdocs collator to the search index registry extension point with factory and schedule', async () => { + const extensionPointMock = { + addCollator: jest.fn(), + }; + + await startTestBackend({ + extensionPoints: [ + [searchIndexRegistryExtensionPoint, extensionPointMock], + ], + features: [searchModuleTechDocsCollator({ schedule })], + }); + + expect(extensionPointMock.addCollator).toHaveBeenCalledTimes(1); + expect(extensionPointMock.addCollator).toHaveBeenCalledWith({ + factory: expect.objectContaining({ type: 'techdocs' }), + schedule: expect.objectContaining({ run: expect.any(Function) }), + }); + }); +}); diff --git a/plugins/search-backend-module-techdocs/src/alpha.ts b/plugins/search-backend-module-techdocs/src/alpha.ts new file mode 100644 index 0000000000..1432cc88fb --- /dev/null +++ b/plugins/search-backend-module-techdocs/src/alpha.ts @@ -0,0 +1,93 @@ +/* + * 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. + */ + +/** + * @packageDocumentation + * A module for the search backend that exports TechDocs modules. + */ + +import { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { TaskScheduleDefinition } from '@backstage/backend-tasks'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; + +import { + DefaultTechDocsCollatorFactory, + TechDocsCollatorFactoryOptions, +} from '@backstage/plugin-search-backend-module-techdocs'; + +/** + * @alpha + * Options for {@link searchModuleTechDocsCollator}. + */ +export type SearchModuleTechDocsCollatorOptions = Omit< + TechDocsCollatorFactoryOptions, + 'logger' | 'discovery' | 'tokenManager' +> & { + schedule?: TaskScheduleDefinition; +}; + +/** + * @alpha + * Search backend module for the TechDocs index. + */ +export const searchModuleTechDocsCollator = createBackendModule( + (options?: SearchModuleTechDocsCollatorOptions) => ({ + moduleId: 'techDocsCollator', + pluginId: 'search', + register(env) { + env.registerInit({ + deps: { + config: coreServices.config, + logger: coreServices.logger, + discovery: coreServices.discovery, + tokenManager: coreServices.tokenManager, + scheduler: coreServices.scheduler, + indexRegistry: searchIndexRegistryExtensionPoint, + }, + async init({ + config, + logger, + discovery, + tokenManager, + scheduler, + indexRegistry, + }) { + const defaultSchedule = { + frequency: { minutes: 10 }, + timeout: { minutes: 15 }, + initialDelay: { seconds: 3 }, + }; + + indexRegistry.addCollator({ + schedule: scheduler.createScheduledTaskRunner( + options?.schedule ?? defaultSchedule, + ), + factory: DefaultTechDocsCollatorFactory.fromConfig(config, { + ...options, + discovery, + tokenManager, + logger: loggerToWinstonLogger(logger), + }), + }); + }, + }); + }, + }), +); diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.test.ts b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts similarity index 100% rename from plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.test.ts rename to plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.ts b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts similarity index 100% rename from plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.ts rename to plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts diff --git a/plugins/search-backend-module-techdocs/src/collators/index.ts b/plugins/search-backend-module-techdocs/src/collators/index.ts new file mode 100644 index 0000000000..8c5fd122f1 --- /dev/null +++ b/plugins/search-backend-module-techdocs/src/collators/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { DefaultTechDocsCollatorFactory } from './DefaultTechDocsCollatorFactory'; + +export type { TechDocsCollatorFactoryOptions } from './DefaultTechDocsCollatorFactory'; diff --git a/plugins/search-backend-module-techdocs/src/index.ts b/plugins/search-backend-module-techdocs/src/index.ts new file mode 100644 index 0000000000..c28175fd61 --- /dev/null +++ b/plugins/search-backend-module-techdocs/src/index.ts @@ -0,0 +1,22 @@ +/* + * 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. + */ + +/** + * @packageDocumentation + * A module for the search backend that exports TechDocs modules. + */ + +export * from './collators'; diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index 5fcd3bd0fa..ed51a90369 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-search-backend-node +## 1.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-search-common@1.2.2 + +## 1.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + ## 1.1.4-next.2 ### Patch Changes diff --git a/plugins/search-backend-node/alpha-api-report.md b/plugins/search-backend-node/alpha-api-report.md new file mode 100644 index 0000000000..74b7a4b4bc --- /dev/null +++ b/plugins/search-backend-node/alpha-api-report.md @@ -0,0 +1,50 @@ +## API Report File for "@backstage/plugin-search-backend-node" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { DocumentTypeInfo } from '@backstage/plugin-search-common'; +import { ExtensionPoint } from '@backstage/backend-plugin-api'; +import { RegisterCollatorParameters } from '@backstage/plugin-search-backend-node'; +import { RegisterDecoratorParameters } from '@backstage/plugin-search-backend-node'; +import { SearchEngine } from '@backstage/plugin-search-common'; +import { ServiceRef } from '@backstage/backend-plugin-api'; + +// @alpha +export interface SearchEngineRegistryExtensionPoint { + // (undocumented) + setSearchEngine(searchEngine: SearchEngine): void; +} + +// @alpha +export const searchEngineRegistryExtensionPoint: ExtensionPoint; + +// @alpha +export interface SearchIndexRegistryExtensionPoint { + // (undocumented) + addCollator(options: RegisterCollatorParameters): void; + // (undocumented) + addDecorator(options: RegisterDecoratorParameters): void; +} + +// @alpha +export const searchIndexRegistryExtensionPoint: ExtensionPoint; + +// @alpha +export interface SearchIndexService { + getDocumentTypes(): Record; + start(options: SearchIndexServiceStartOptions): Promise; +} + +// @alpha +export const searchIndexServiceRef: ServiceRef; + +// @alpha +export type SearchIndexServiceStartOptions = { + searchEngine: SearchEngine; + collators: RegisterCollatorParameters[]; + decorators: RegisterDecoratorParameters[]; +}; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index d86be92e92..a49b6088ab 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,14 +1,27 @@ { "name": "@backstage/plugin-search-backend-node", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", - "version": "1.1.4-next.2", + "version": "1.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", "publishConfig": { - "access": "public", - "main": "dist/index.cjs.js", - "types": "dist/index.d.ts" + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } }, "backstage": { "role": "node-library" @@ -24,6 +37,7 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-tasks": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", diff --git a/plugins/search-backend-node/src/alpha.ts b/plugins/search-backend-node/src/alpha.ts new file mode 100644 index 0000000000..943e11b580 --- /dev/null +++ b/plugins/search-backend-node/src/alpha.ts @@ -0,0 +1,159 @@ +/* + * 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 { Logger } from 'winston'; + +import { + createServiceRef, + createServiceFactory, + coreServices, +} from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { + DocumentTypeInfo, + SearchEngine, +} from '@backstage/plugin-search-common'; +import { createExtensionPoint } from '@backstage/backend-plugin-api'; + +import { + RegisterCollatorParameters, + RegisterDecoratorParameters, +} from '@backstage/plugin-search-backend-node'; + +import { IndexBuilder } from './IndexBuilder'; + +/** + * @alpha + * Options for build method on {@link SearchIndexService}. + */ +export type SearchIndexServiceStartOptions = { + searchEngine: SearchEngine; + collators: RegisterCollatorParameters[]; + decorators: RegisterDecoratorParameters[]; +}; + +/** + * @alpha + * Interface for implementation of index service. + */ +export interface SearchIndexService { + /** + * Starts indexing process + */ + start(options: SearchIndexServiceStartOptions): Promise; + /** + * Returns an index types list. + */ + getDocumentTypes(): Record; +} + +/** + * @alpha + * Interface for search index registry extension point. + */ +export interface SearchIndexRegistryExtensionPoint { + addCollator(options: RegisterCollatorParameters): void; + addDecorator(options: RegisterDecoratorParameters): void; +} + +/** + * @alpha + * Interface for search engine registry extension point. + */ +export interface SearchEngineRegistryExtensionPoint { + setSearchEngine(searchEngine: SearchEngine): void; +} + +type DefaultSearchIndexServiceOptions = { + logger: Logger; +}; + +/** + * @alpha + * Reponsible for register the indexing task and start the schedule. + */ +class DefaultSearchIndexService implements SearchIndexService { + private logger: Logger; + private indexBuilder: IndexBuilder | null = null; + + private constructor(options: DefaultSearchIndexServiceOptions) { + this.logger = options.logger; + } + + static fromConfig(options: DefaultSearchIndexServiceOptions) { + return new DefaultSearchIndexService(options); + } + + async start(options: SearchIndexServiceStartOptions): Promise { + this.indexBuilder = new IndexBuilder({ + logger: this.logger, + searchEngine: options.searchEngine, + }); + + options.collators.forEach(collator => + this.indexBuilder?.addCollator(collator), + ); + + options.decorators.forEach(decorator => + this.indexBuilder?.addDecorator(decorator), + ); + + const { scheduler } = await this.indexBuilder?.build(); + scheduler.start(); + } + + getDocumentTypes(): Record { + return this.indexBuilder?.getDocumentTypes() ?? {}; + } +} + +/** + * @alpha + * Service that builds a search index. + */ +export const searchIndexServiceRef = createServiceRef({ + id: 'search.index.service', + defaultFactory: async service => + createServiceFactory({ + service, + deps: { + logger: coreServices.logger, + }, + factory({ logger }) { + return DefaultSearchIndexService.fromConfig({ + logger: loggerToWinstonLogger(logger), + }); + }, + }), +}); + +/** + * @alpha + * Extension point for register a search engine. + */ +export const searchEngineRegistryExtensionPoint = + createExtensionPoint({ + id: 'search.engine.registry', + }); + +/** + * @alpha + * Extension point for registering collators and decorators + */ +export const searchIndexRegistryExtensionPoint = + createExtensionPoint({ + id: 'search.index.registry', + }); diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 513ee4536a..d6985a70f1 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-search-backend +## 1.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + - @backstage/plugin-search-backend-node@1.1.5-next.0 + - @backstage/plugin-search-common@1.2.2 + +## 1.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + ## 1.2.4-next.2 ### Patch Changes diff --git a/plugins/search-backend/alpha-api-report.md b/plugins/search-backend/alpha-api-report.md new file mode 100644 index 0000000000..6ee94a0e29 --- /dev/null +++ b/plugins/search-backend/alpha-api-report.md @@ -0,0 +1,12 @@ +## API Report File for "@backstage/plugin-search-backend" + +> 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 +export const searchPlugin: () => BackendFeature; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 0baecca0a9..e8277afa2d 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,14 +1,27 @@ { "name": "@backstage/plugin-search-backend", "description": "The Backstage backend plugin that provides your backstage app with search", - "version": "1.2.4-next.2", + "version": "1.2.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", "publishConfig": { - "access": "public", - "main": "dist/index.cjs.js", - "types": "dist/index.d.ts" + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } }, "backstage": { "role": "backend-plugin" @@ -24,6 +37,7 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", @@ -40,9 +54,10 @@ "qs": "^6.10.1", "winston": "^3.2.1", "yn": "^4.0.0", - "zod": "~3.18.0" + "zod": "^3.21.4" }, "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@types/supertest": "^2.0.8", "supertest": "^6.1.3" diff --git a/plugins/search-backend/src/alpha.test.ts b/plugins/search-backend/src/alpha.test.ts new file mode 100644 index 0000000000..527f099236 --- /dev/null +++ b/plugins/search-backend/src/alpha.test.ts @@ -0,0 +1,31 @@ +/* + * 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 { startTestBackend } from '@backstage/backend-test-utils'; +import request from 'supertest'; +import { searchPlugin } from './alpha'; + +describe('searchPlugin', () => { + it('should serve search results on query endpoint', async () => { + const { server } = await startTestBackend({ + features: [searchPlugin()], + }); + + const response = await request(server).get('/api/search/query'); + expect(response.status).toBe(200); + expect(response.body).toEqual({ numberOfResults: 0, results: [] }); + }); +}); diff --git a/plugins/search-backend/src/alpha.ts b/plugins/search-backend/src/alpha.ts new file mode 100644 index 0000000000..0c14852875 --- /dev/null +++ b/plugins/search-backend/src/alpha.ts @@ -0,0 +1,130 @@ +/* + * 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 { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { + RegisterCollatorParameters, + RegisterDecoratorParameters, + LunrSearchEngine, +} from '@backstage/plugin-search-backend-node'; +import { + searchIndexServiceRef, + searchIndexRegistryExtensionPoint, + SearchIndexRegistryExtensionPoint, + SearchEngineRegistryExtensionPoint, + searchEngineRegistryExtensionPoint, +} from '@backstage/plugin-search-backend-node/alpha'; + +import { createRouter } from './service/router'; +import { SearchEngine } from '@backstage/plugin-search-common'; + +class SearchIndexRegistry implements SearchIndexRegistryExtensionPoint { + private collators: RegisterCollatorParameters[] = []; + private decorators: RegisterDecoratorParameters[] = []; + + public addCollator(options: RegisterCollatorParameters): void { + this.collators.push(options); + } + + public addDecorator(options: RegisterDecoratorParameters): void { + this.decorators.push(options); + } + + public getCollators(): RegisterCollatorParameters[] { + return this.collators; + } + + public getDecorators(): RegisterDecoratorParameters[] { + return this.decorators; + } +} + +class SearchEngineRegistry implements SearchEngineRegistryExtensionPoint { + private searchEngine: SearchEngine | null = null; + + public setSearchEngine(searchEngine: SearchEngine): void { + if (this.searchEngine) { + throw new Error('Multiple Search engines is not supported at this time'); + } + this.searchEngine = searchEngine; + } + + public getSearchEngine(): SearchEngine | null { + return this.searchEngine; + } +} + +/** + * The Search plugin is responsible for starting search indexing processes and return search results. + * @alpha + */ +export const searchPlugin = createBackendPlugin({ + pluginId: 'search', + register(env) { + const searchIndexRegistry = new SearchIndexRegistry(); + env.registerExtensionPoint( + searchIndexRegistryExtensionPoint, + searchIndexRegistry, + ); + + const searchEngineRegistry = new SearchEngineRegistry(); + env.registerExtensionPoint( + searchEngineRegistryExtensionPoint, + searchEngineRegistry, + ); + + env.registerInit({ + deps: { + logger: coreServices.logger, + config: coreServices.config, + permissions: coreServices.permissions, + http: coreServices.httpRouter, + searchIndexService: searchIndexServiceRef, + }, + async init({ config, logger, permissions, http, searchIndexService }) { + let searchEngine = searchEngineRegistry.getSearchEngine(); + if (!searchEngine) { + searchEngine = new LunrSearchEngine({ + logger: loggerToWinstonLogger(logger), + }); + } + + const collators = searchIndexRegistry.getCollators(); + const decorators = searchIndexRegistry.getDecorators(); + + await searchIndexService.start({ + searchEngine, + collators, + decorators, + }); + + const router = await createRouter({ + config, + permissions, + logger: loggerToWinstonLogger(logger), + engine: searchEngine, + types: searchIndexService.getDocumentTypes(), + }); + + http.use(router); + }, + }); + }, +}); diff --git a/plugins/search-common/CHANGELOG.md b/plugins/search-common/CHANGELOG.md index b0a0479ed3..893e6cc89d 100644 --- a/plugins/search-common/CHANGELOG.md +++ b/plugins/search-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search-common +## 1.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 + - @backstage/types@1.0.2 + ## 1.2.2-next.0 ### Patch Changes diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index ba767f7019..a7c8de1c9f 100644 --- a/plugins/search-common/package.json +++ b/plugins/search-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-common", "description": "Common functionalities for Search, to be shared between various search-enabled plugins", - "version": "1.2.2-next.0", + "version": "1.2.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 9fc158de5d..22bf885caf 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-search-react +## 1.5.2-next.0 + +### Patch Changes + +- b2e182cdfa4: Fixes a UI bug in search result item which rendered the item text with incorrect font size and color +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.2 + +## 1.5.1 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 553f3c95011: Correctly disable next button in `SearchPagination` on last page +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.2 + ## 1.5.1-next.2 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 355191cb47..0a8864392b 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.5.1-next.2", + "version": "1.5.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -39,7 +39,7 @@ "@backstage/version-bridge": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "lodash": "^4.17.21", "qs": "^6.9.4", "react-use": "^17.3.2" diff --git a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx index cf89b6a9cd..0d2c59e173 100644 --- a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx +++ b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx @@ -81,6 +81,8 @@ export const DefaultResultListItemComponent = ({ WebkitLineClamp: lineClamp, overflow: 'hidden', }} + color="textSecondary" + variant="body2" > {highlight?.fields.text ? ( ( ); ``` +To allow external links to be added as shortcut, you can add `allowExternalLinks` property to the `` component. + The plugin exports a `shortcutApiRef` but the plugin includes a default implementation of the `ShortcutApi` that uses `localStorage` to store each user's shortcuts. To overwrite the default implementation add it to the App's `apis.ts`: diff --git a/plugins/shortcuts/api-report.md b/plugins/shortcuts/api-report.md index 1aa1dea003..0dd42f5344 100644 --- a/plugins/shortcuts/api-report.md +++ b/plugins/shortcuts/api-report.md @@ -9,24 +9,25 @@ import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { IconComponent } from '@backstage/core-plugin-api'; import { Observable } from '@backstage/types'; -import { default as Observable_2 } from 'zen-observable'; -import { StorageApi } from '@backstage/core-plugin-api'; +import { Shortcut as Shortcut_2 } from '@backstage/plugin-shortcuts'; +import { ShortcutApi as ShortcutApi_2 } from '@backstage/plugin-shortcuts'; +import type { StorageApi } from '@backstage/core-plugin-api'; // @public -export class LocalStoredShortcuts implements ShortcutApi { +export class LocalStoredShortcuts implements ShortcutApi_2 { constructor(storageApi: StorageApi); // (undocumented) - add(shortcut: Omit): Promise; + add(shortcut: Omit): Promise; // (undocumented) - get(): Shortcut[]; + get(): Shortcut_2[]; // (undocumented) getColor(url: string): string; // (undocumented) remove(id: string): Promise; // (undocumented) - shortcut$(): Observable_2; + shortcut$(): Observable; // (undocumented) - update(shortcut: Shortcut): Promise; + update(shortcut: Shortcut_2): Promise; } // @public (undocumented) @@ -57,6 +58,8 @@ export const shortcutsPlugin: BackstagePlugin<{}, {}, {}>; // @public export interface ShortcutsProps { + // (undocumented) + allowExternalLinks?: boolean; // (undocumented) icon?: IconComponent; } diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index eb48088934..d84cf27223 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-shortcuts", "description": "A Backstage plugin that provides a shortcuts feature to the sidebar", - "version": "0.3.8-next.2", + "version": "0.3.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,8 +29,7 @@ "@backstage/types": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", - "@types/zen-observable": "^0.8.2", + "@material-ui/lab": "4.0.0-alpha.61", "react-hook-form": "^7.12.2", "react-use": "^17.2.4", "uuid": "^8.3.2", @@ -49,6 +48,7 @@ "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/zen-observable": "^0.8.2", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/shortcuts/src/AddShortcut.tsx b/plugins/shortcuts/src/AddShortcut.tsx index e4b1ba84ce..1e14767531 100644 --- a/plugins/shortcuts/src/AddShortcut.tsx +++ b/plugins/shortcuts/src/AddShortcut.tsx @@ -45,9 +45,16 @@ type Props = { onClose: () => void; anchorEl?: Element; api: ShortcutApi; + + allowExternalLinks?: boolean; }; -export const AddShortcut = ({ onClose, anchorEl, api }: Props) => { +export const AddShortcut = ({ + onClose, + anchorEl, + api, + allowExternalLinks, +}: Props) => { const classes = useStyles(); const alertApi = useApi(alertApiRef); const { pathname } = useLocation(); @@ -114,6 +121,7 @@ export const AddShortcut = ({ onClose, anchorEl, api }: Props) => { onClose={handleClose} onSave={handleSave} formValues={formValues} + allowExternalLinks={allowExternalLinks} /> diff --git a/plugins/shortcuts/src/EditShortcut.tsx b/plugins/shortcuts/src/EditShortcut.tsx index 702275e90e..5336841633 100644 --- a/plugins/shortcuts/src/EditShortcut.tsx +++ b/plugins/shortcuts/src/EditShortcut.tsx @@ -46,9 +46,16 @@ type Props = { onClose: () => void; anchorEl?: Element; api: ShortcutApi; + allowExternalLinks?: boolean; }; -export const EditShortcut = ({ shortcut, onClose, anchorEl, api }: Props) => { +export const EditShortcut = ({ + shortcut, + onClose, + anchorEl, + api, + allowExternalLinks, +}: Props) => { const classes = useStyles(); const alertApi = useApi(alertApiRef); const open = Boolean(anchorEl); @@ -127,6 +134,7 @@ export const EditShortcut = ({ shortcut, onClose, anchorEl, api }: Props) => { formValues={{ url: shortcut.url, title: shortcut.title }} onClose={handleClose} onSave={handleSave} + allowExternalLinks={allowExternalLinks} /> diff --git a/plugins/shortcuts/src/ShortcutForm.test.tsx b/plugins/shortcuts/src/ShortcutForm.test.tsx index 2582148fc7..3a52356b5d 100644 --- a/plugins/shortcuts/src/ShortcutForm.test.tsx +++ b/plugins/shortcuts/src/ShortcutForm.test.tsx @@ -43,6 +43,50 @@ describe('ShortcutForm', () => { }); }); + it('allows external links', async () => { + await renderInTestApp(); + + const urlInput = screen.getByPlaceholderText('Enter a URL'); + const titleInput = screen.getByPlaceholderText('Enter a display name'); + fireEvent.change(urlInput, { + target: { value: 'https://www.backstage.io' }, + }); + fireEvent.change(titleInput, { target: { value: 'Backstage' } }); + + fireEvent.click(screen.getByText('Save')); + await waitFor(() => { + expect(props.onSave).toHaveBeenCalledWith( + expect.objectContaining({ + title: 'Backstage', + url: 'https://www.backstage.io', + }), + expect.anything(), + ); + }); + }); + + it('allows relative links when external links are enabled', async () => { + await renderInTestApp(); + + const urlInput = screen.getByPlaceholderText('Enter a URL'); + const titleInput = screen.getByPlaceholderText('Enter a display name'); + fireEvent.change(urlInput, { + target: { value: '/catalog' }, + }); + fireEvent.change(titleInput, { target: { value: 'Catalog' } }); + + fireEvent.click(screen.getByText('Save')); + await waitFor(() => { + expect(props.onSave).toHaveBeenCalledWith( + expect.objectContaining({ + title: 'Catalog', + url: '/catalog', + }), + expect.anything(), + ); + }); + }); + it('calls the save handler', async () => { await renderInTestApp( ; onClose: () => void; + allowExternalLinks?: boolean; }; -export const ShortcutForm = ({ formValues, onSave, onClose }: Props) => { +export const ShortcutForm = ({ + formValues, + onSave, + onClose, + allowExternalLinks, +}: Props) => { const classes = useStyles(); - const { handleSubmit, reset, @@ -70,10 +75,19 @@ export const ShortcutForm = ({ formValues, onSave, onClose }: Props) => { control={control} rules={{ required: true, - pattern: { - value: /^\//, - message: 'Must be a relative URL (starts with a /)', - }, + ...(allowExternalLinks + ? { + pattern: { + value: /^(https?:\/\/)|\//, + message: 'Must start with http(s):// or /', + }, + } + : { + pattern: { + value: /^\//, + message: 'Must be a relative URL (starts with a /)', + }, + }), }} render={({ field }) => ( type Props = { shortcut: Shortcut; api: ShortcutApi; + allowExternalLinks?: boolean; }; -export const ShortcutItem = ({ shortcut, api }: Props) => { +export const ShortcutItem = ({ shortcut, api, allowExternalLinks }: Props) => { const classes = useStyles(); const [anchorEl, setAnchorEl] = React.useState(); @@ -100,6 +101,7 @@ export const ShortcutItem = ({ shortcut, api }: Props) => { anchorEl={anchorEl} api={api} shortcut={shortcut} + allowExternalLinks={allowExternalLinks} /> ); diff --git a/plugins/shortcuts/src/Shortcuts.tsx b/plugins/shortcuts/src/Shortcuts.tsx index 28aa33e8f2..6b9ea4d79b 100644 --- a/plugins/shortcuts/src/Shortcuts.tsx +++ b/plugins/shortcuts/src/Shortcuts.tsx @@ -35,6 +35,7 @@ import { IconComponent, useApi } from '@backstage/core-plugin-api'; */ export interface ShortcutsProps { icon?: IconComponent; + allowExternalLinks?: boolean; } export const Shortcuts = (props: ShortcutsProps) => { @@ -62,6 +63,7 @@ export const Shortcuts = (props: ShortcutsProps) => { onClose={handleClose} anchorEl={anchorEl} api={shortcutApi} + allowExternalLinks={props.allowExternalLinks} /> {loading ? ( @@ -71,6 +73,7 @@ export const Shortcuts = (props: ShortcutsProps) => { key={shortcut.id} shortcut={shortcut} api={shortcutApi} + allowExternalLinks={props.allowExternalLinks} /> )) )} diff --git a/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts b/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts index dbea91863c..86890fc75b 100644 --- a/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts +++ b/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts @@ -36,8 +36,9 @@ describe('LocalStoredShortcuts', () => { resolve(); }, }); - shortcutApi.add(shortcut); }); + observerNextHandler.mockClear(); // handler is called with current state to start + await shortcutApi.add(shortcut); expect(observerNextHandler).toHaveBeenCalledTimes(1); expect(observerNextHandler).toHaveBeenCalledWith( diff --git a/plugins/shortcuts/src/api/LocalStoredShortcuts.ts b/plugins/shortcuts/src/api/LocalStoredShortcuts.ts index 65aeb86e3f..44f7364f69 100644 --- a/plugins/shortcuts/src/api/LocalStoredShortcuts.ts +++ b/plugins/shortcuts/src/api/LocalStoredShortcuts.ts @@ -16,10 +16,10 @@ import { pageTheme } from '@backstage/theme'; import { v4 as uuid } from 'uuid'; -import { ShortcutApi } from './ShortcutApi'; -import { Shortcut } from '../types'; -import { StorageApi } from '@backstage/core-plugin-api'; -import Observable from 'zen-observable'; +import { ShortcutApi, type Shortcut } from '@backstage/plugin-shortcuts'; +import type { StorageApi } from '@backstage/core-plugin-api'; +import type { Observable } from '@backstage/types'; +import ObservableImpl from 'zen-observable'; /** * Implementation of the ShortcutApi that uses the StorageApi to store shortcuts. @@ -27,27 +27,41 @@ import Observable from 'zen-observable'; * @public */ export class LocalStoredShortcuts implements ShortcutApi { - private readonly shortcuts: Observable; + private shortcuts: Shortcut[]; + private readonly subscribers = new Set< + ZenObservable.SubscriptionObserver + >(); + + private readonly observable = new ObservableImpl(subscriber => { + // forward the the latest value + subscriber.next(this.shortcuts); + + this.subscribers.add(subscriber); + return () => { + this.subscribers.delete(subscriber); + }; + }); constructor(private readonly storageApi: StorageApi) { - this.shortcuts = Observable.from( - this.storageApi.observe$('items'), - ).map(snapshot => snapshot.value ?? []); + this.shortcuts = this.storageApi.snapshot('items').value ?? []; + this.storageApi.observe$('items').subscribe({ + next: next => { + this.shortcuts = next.value ?? []; + this.notifyChanges(); + }, + }); } - shortcut$() { - return this.shortcuts; + shortcut$(): Observable { + return this.observable; } get() { - return Array.from( - this.storageApi.snapshot('items').value ?? [], - ).sort((a, b) => (a.title >= b.title ? 1 : -1)); + return this.shortcuts; } async add(shortcut: Omit) { - const shortcuts = this.get(); - shortcuts.push({ ...shortcut, id: uuid() }); + const shortcuts = this.sort([...this.get(), { ...shortcut, id: uuid() }]); await this.storageApi.set('items', shortcuts); } @@ -78,4 +92,14 @@ export class LocalStoredShortcuts implements ShortcutApi { catalog: 'home', docs: 'documentation', }; + + private sort(shortcuts: Shortcut[]): Shortcut[] { + return shortcuts.slice().sort((a, b) => (a.title >= b.title ? 1 : -1)); + } + + private notifyChanges() { + for (const subscription of this.subscribers) { + subscription.next(this.shortcuts); + } + } } diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index f60f7bf047..1989ad3426 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-sonarqube-backend +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.1.8 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + ## 0.1.8-next.2 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index d7de98d307..b69b851115 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.1.8-next.2", + "version": "0.1.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-react/CHANGELOG.md b/plugins/sonarqube-react/CHANGELOG.md index 6c7d5d41f2..ae337f220e 100644 --- a/plugins/sonarqube-react/CHANGELOG.md +++ b/plugins/sonarqube-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-sonarqube-react +## 0.1.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 8ae65a0bc1d: Moved imports from `/alpha` to main public exports. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + ## 0.1.4-next.2 ### Patch Changes diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json index d5266cd220..442a747717 100644 --- a/plugins/sonarqube-react/package.json +++ b/plugins/sonarqube-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-react", - "version": "0.1.4-next.2", + "version": "0.1.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index 6c6f69aaf8..810d2125c0 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-sonarqube +## 0.6.6-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-sonarqube-react@0.1.4 + +## 0.6.5 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 8ae65a0bc1d: Moved imports from `/alpha` to main public exports. +- d3d624e8e8d: Show a more appropriate icon if there are no code smells and/or vulnerabilities. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-sonarqube-react@0.1.4 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.6.5-next.2 ### Patch Changes diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index 48d221e508..672888057a 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.6.5-next.2", + "version": "0.6.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,7 +43,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/styles": "^4.10.0", "cross-fetch": "^3.1.5", "rc-progress": "3.4.1", diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index 830c918ced..8295e1c7ce 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-splunk-on-call +## 0.4.6-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.4.5 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.4.5-next.2 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 97a5357bd0..fd7e6b524f 100644 --- a/plugins/splunk-on-call/package.json +++ b/plugins/splunk-on-call/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-splunk-on-call", "description": "A Backstage plugin that integrates towards Splunk On-Call", - "version": "0.4.5-next.2", + "version": "0.4.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,7 +40,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "classnames": "^2.2.6", "luxon": "^3.0.0", "react-use": "^17.2.4" diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md index fab1416363..bc76962999 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-stack-overflow-backend +## 0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + +## 0.1.12 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + ## 0.1.12-next.2 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index 2dd405dc3b..a3fba58bbe 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow-backend", - "version": "0.1.12-next.2", + "version": "0.1.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index 050900554d..8c8ae16170 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-stack-overflow +## 0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-home@0.4.33-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + +## 0.1.12 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 3ef5fb09ca5: Export api ref and StackOverflowApi type +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-search-react@1.5.1 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-home@0.4.32 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + ## 0.1.12-next.2 ### Patch Changes diff --git a/plugins/stack-overflow/api-report.md b/plugins/stack-overflow/api-report.md index fe2a970c13..598bd06a04 100644 --- a/plugins/stack-overflow/api-report.md +++ b/plugins/stack-overflow/api-report.md @@ -5,6 +5,7 @@ ```ts /// +import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CardExtensionProps } from '@backstage/plugin-home'; import { ReactNode } from 'react'; @@ -15,6 +16,16 @@ export const HomePageStackOverflowQuestions: ( props: CardExtensionProps, ) => JSX.Element; +// @public (undocumented) +export type StackOverflowApi = { + listQuestions(options?: { + requestParams: StackOverflowQuestionsRequestParams; + }): Promise; +}; + +// @public (undocumented) +export const stackOverflowApiRef: ApiRef; + // @public export const StackOverflowIcon: () => JSX.Element; diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 3675593181..94cc071af4 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow", - "version": "0.1.12-next.2", + "version": "0.1.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/src/api/StackOverflowApi.ts b/plugins/stack-overflow/src/api/StackOverflowApi.ts index 6e76f51409..d470e879e7 100644 --- a/plugins/stack-overflow/src/api/StackOverflowApi.ts +++ b/plugins/stack-overflow/src/api/StackOverflowApi.ts @@ -20,10 +20,16 @@ import { StackOverflowQuestionsRequestParams, } from '../types'; +/** + * @public + */ export const stackOverflowApiRef = createApiRef({ id: 'plugin.stackoverflow.service', }); +/** + * @public + */ export type StackOverflowApi = { listQuestions(options?: { requestParams: StackOverflowQuestionsRequestParams; diff --git a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx index 35ace44c14..aed1ed25aa 100644 --- a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx +++ b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx @@ -21,6 +21,26 @@ import { ConfigReader } from '@backstage/config'; import { Grid } from '@material-ui/core'; import React, { ComponentType } from 'react'; import { StackOverflowIcon } from '../../icons'; +import { stackOverflowApiRef } from '../../api'; + +const mockStackOverflowApi = { + listQuestions: async () => [ + { + title: 'Customizing Spotify backstage UI', + link: 'stackoverflow.question/1', + answer_count: 0, + tags: ['backstage'], + owner: { 'some owner': 'name' }, + }, + { + title: 'Customizing Spotify backstage UI', + link: 'stackoverflow.question/1', + answer_count: 0, + tags: ['backstage'], + owner: { 'some owner': 'name' }, + }, + ], +}; export default { title: 'Plugins/Home/Components/StackOverflow', @@ -39,6 +59,7 @@ export default { }, }), ], + [stackOverflowApiRef, mockStackOverflowApi], ]} > diff --git a/plugins/stack-overflow/src/index.ts b/plugins/stack-overflow/src/index.ts index 5965d66983..a796f563eb 100644 --- a/plugins/stack-overflow/src/index.ts +++ b/plugins/stack-overflow/src/index.ts @@ -30,3 +30,5 @@ export type { StackOverflowQuestionsContentProps, StackOverflowQuestionsRequestParams, } from './types'; +export { stackOverflowApiRef } from './api'; +export type { StackOverflowApi } from './api'; diff --git a/plugins/stackstorm/CHANGELOG.md b/plugins/stackstorm/CHANGELOG.md index f68c853b7b..9899f2f05f 100644 --- a/plugins/stackstorm/CHANGELOG.md +++ b/plugins/stackstorm/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-stackstorm +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.1.0 + +### Minor Changes + +- f3a15259e91: Add StackStorm plugin to Backstage which is interfacing with StackStorm API. It allows users to view workflow executions, packs and actions. For installation and configuration instructions please view [README.md](https://github.com/backstage/backstage/tree/master/plugins/stackstorm/README.md) + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.1.0-next.2 ### Patch Changes diff --git a/plugins/stackstorm/package.json b/plugins/stackstorm/package.json index a1ba109d76..ff432f9199 100644 --- a/plugins/stackstorm/package.json +++ b/plugins/stackstorm/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-stackstorm", "description": "A Backstage plugin that integrates towards StackStorm", - "version": "0.1.0-next.2", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,7 +40,6 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.57", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index 12e6693589..cc49a78340 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.0 + +## 0.1.27 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.1 + ## 0.1.27-next.2 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index 7d60ec0cdc..3e6b08c65b 100644 --- a/plugins/tech-insights-backend-module-jsonfc/package.json +++ b/plugins/tech-insights-backend-module-jsonfc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend-module-jsonfc", - "version": "0.1.27-next.2", + "version": "0.1.28-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index c4e8061f05..95497c3b88 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-tech-insights-backend +## 0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.0 + +## 0.5.9 + +### Patch Changes + +- f244b589163: Add DB index to improve latency of latest fact query +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.1 + ## 0.5.9-next.2 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index e11bf60e0d..f6bae36e6b 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.5.9-next.2", + "version": "0.5.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index ed9f3667f0..45583c194f 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-tech-insights-node +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + ## 0.4.1-next.2 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index 6a546f86c1..d662258c3a 100644 --- a/plugins/tech-insights-node/package.json +++ b/plugins/tech-insights-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-node", - "version": "0.4.1-next.2", + "version": "0.4.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md index e8d57b056f..52d6ce6102 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-tech-insights +## 0.3.9-next.0 + +### Patch Changes + +- f538b9c5b83: The `Check` type now optionally includes the `failureMetadata` and `successMetadata` as returned by the `runChecks` call. +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## 0.3.8 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + ## 0.3.8-next.2 ### Patch Changes diff --git a/plugins/tech-insights/api-report.md b/plugins/tech-insights/api-report.md index 83509e1673..47aa8bbbea 100644 --- a/plugins/tech-insights/api-report.md +++ b/plugins/tech-insights/api-report.md @@ -27,6 +27,8 @@ export type Check = { name: string; description: string; factIds: string[]; + successMetadata?: Record; + failureMetadata?: Record; }; // @public diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 680641b1b0..6bff5523dc 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.3.8-next.2", + "version": "0.3.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,7 +37,7 @@ "@backstage/types": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "qs": "^6.9.4", "react-use": "^17.2.4" }, diff --git a/plugins/tech-insights/src/api/types.ts b/plugins/tech-insights/src/api/types.ts index ac1f2e44ee..b08f63ecc2 100644 --- a/plugins/tech-insights/src/api/types.ts +++ b/plugins/tech-insights/src/api/types.ts @@ -22,11 +22,48 @@ import { JsonValue } from '@backstage/types'; * @public */ export type Check = { + /** + * Unique identifier of the check + * + * Used to identify which checks to use when running checks. + */ id: string; + + /** + * Type identifier for the check. + * Can be used to determine storage options, logical routing to correct FactChecker implementation + * or to help frontend render correct component types based on this + */ type: string; + + /** + * Human readable name of the check, may be displayed in the UI + */ name: string; + + /** + * Human readable description of the check, may be displayed in the UI + */ description: string; + + /** + * A collection of string referencing fact rows that a check will be run against. + * + * References the fact container, aka fact retriever itself which may or may not contain multiple individual facts and values + */ factIds: string[]; + + /** + * Metadata to be returned in case a check has been successfully evaluated + * Can contain links, description texts or other actionable items + */ + successMetadata?: Record; + + /** + * Metadata to be returned in case a check evaluation has ended in failure + * Can contain links, description texts or other actionable items + */ + failureMetadata?: Record; }; /** diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md index 4ad21662bd..0ce2e73a86 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-tech-radar +## 0.6.3-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## 0.6.2 + +### Patch Changes + +- e14dcfa4994: Update colors to match Zalando's tech radar, also add coloring on title and legend to match ring color. +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.6.2-next.2 ### Patch Changes diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index 273bd79255..d02a4a0695 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-tech-radar", "description": "A Backstage plugin that lets you display a Tech Radar for your organization", - "version": "0.6.2-next.2", + "version": "0.6.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,7 +37,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "color": "^4.0.1", "d3-force": "^3.0.0", "prop-types": "^15.7.2", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 35dedb8a0b..cd86a795f3 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.12-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/plugin-catalog@1.10.0-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/test-utils@1.3.0-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-techdocs@1.6.1-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## 1.0.11 + +### Patch Changes + +- 2b00d8a225c: Fix bug/problem with test helper +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-search-react@1.5.1 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + ## 1.0.11-next.2 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 8dc81b2cf7..23917a52cb 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.11-next.2", + "version": "1.0.12-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,7 +44,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@testing-library/react": "^12.1.3", "react-use": "^17.2.4", "testing-library__dom": "^7.29.4-beta.1" diff --git a/plugins/techdocs-backend/.gitignore b/plugins/techdocs-backend/.gitignore index 7b4d4ba2e6..b1befabea2 100644 --- a/plugins/techdocs-backend/.gitignore +++ b/plugins/techdocs-backend/.gitignore @@ -1 +1,4 @@ static + +# Folder generated by plantuml containing jdk font config +**/\?/ diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 8e4be204db..80eab46ee0 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-techdocs-backend +## 1.6.1-next.0 + +### Patch Changes + +- 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/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-search-common@1.2.2 + - @backstage/plugin-techdocs-node@1.6.1-next.0 + +## 1.6.0 + +### Minor Changes + +- 92b495328bd: Introduced alpha export of the `techdocsPlugin` using the new backend system. + +### Patch Changes + +- 40298b02778: Techdocs backend explains a bit more about what might have caused the docs not being found when building techdocs. +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-techdocs-node@1.6.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + ## 1.5.4-next.2 ### Patch Changes diff --git a/plugins/techdocs-backend/alpha-api-report.md b/plugins/techdocs-backend/alpha-api-report.md new file mode 100644 index 0000000000..16db84c216 --- /dev/null +++ b/plugins/techdocs-backend/alpha-api-report.md @@ -0,0 +1,12 @@ +## API Report File for "@backstage/plugin-techdocs-backend" + +> 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 +export const techdocsPlugin: () => BackendFeature; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/techdocs-backend/api-report.md b/plugins/techdocs-backend/api-report.md index 1f6aa1d66a..b8974e6d4f 100644 --- a/plugins/techdocs-backend/api-report.md +++ b/plugins/techdocs-backend/api-report.md @@ -3,12 +3,10 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -/// - import { CatalogApi } from '@backstage/catalog-client'; import { CatalogClient } from '@backstage/catalog-client'; import { Config } from '@backstage/config'; -import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; +import { DefaultTechDocsCollatorFactory as DefaultTechDocsCollatorFactory_2 } from '@backstage/plugin-search-backend-module-techdocs'; import { Entity } from '@backstage/catalog-model'; import express from 'express'; import { GeneratorBuilder } from '@backstage/plugin-techdocs-node'; @@ -19,7 +17,7 @@ import { PluginCacheManager } from '@backstage/backend-common'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { PreparerBuilder } from '@backstage/plugin-techdocs-node'; import { PublisherBase } from '@backstage/plugin-techdocs-node'; -import { Readable } from 'stream'; +import type { TechDocsCollatorFactoryOptions as TechDocsCollatorFactoryOptions_2 } from '@backstage/plugin-search-backend-module-techdocs'; import { TechDocsDocument } from '@backstage/plugin-techdocs-node'; import { TokenManager } from '@backstage/backend-common'; import * as winston from 'winston'; @@ -47,20 +45,8 @@ export class DefaultTechDocsCollator { readonly visibilityPermission: Permission; } -// @public -export class DefaultTechDocsCollatorFactory implements DocumentCollatorFactory { - // (undocumented) - static fromConfig( - config: Config, - options: TechDocsCollatorFactoryOptions, - ): DefaultTechDocsCollatorFactory; - // (undocumented) - getCollator(): Promise; - // (undocumented) - readonly type: string; - // (undocumented) - readonly visibilityPermission: Permission; -} +// @public @deprecated (undocumented) +export const DefaultTechDocsCollatorFactory: typeof DefaultTechDocsCollatorFactory_2; // @public export interface DocsBuildStrategy { @@ -105,16 +91,8 @@ export type ShouldBuildParameters = { entity: Entity; }; -// @public -export type TechDocsCollatorFactoryOptions = { - discovery: PluginEndpointDiscovery; - logger: Logger; - tokenManager: TokenManager; - locationTemplate?: string; - catalogClient?: CatalogApi; - parallelismLimit?: number; - legacyPathCasing?: boolean; -}; +// @public @deprecated (undocumented) +export type TechDocsCollatorFactoryOptions = TechDocsCollatorFactoryOptions_2; // @public export type TechDocsCollatorOptions = { diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index c9fff25b70..74af0e1010 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "1.5.4-next.2", + "version": "1.6.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,6 +10,21 @@ "main": "dist/index.cjs.js", "types": "dist/index.d.ts" }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, "backstage": { "role": "backend-plugin" }, @@ -34,6 +49,7 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", @@ -41,6 +57,7 @@ "@backstage/integration": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", + "@backstage/plugin-search-backend-module-techdocs": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "@backstage/plugin-techdocs-node": "workspace:^", "@types/express": "^4.17.6", diff --git a/plugins/techdocs-backend/src/alpha.ts b/plugins/techdocs-backend/src/alpha.ts new file mode 100644 index 0000000000..1a36c5a1f5 --- /dev/null +++ b/plugins/techdocs-backend/src/alpha.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { techdocsPlugin } from './plugin'; diff --git a/plugins/techdocs-backend/src/plugin.ts b/plugins/techdocs-backend/src/plugin.ts new file mode 100644 index 0000000000..134de2bba6 --- /dev/null +++ b/plugins/techdocs-backend/src/plugin.ts @@ -0,0 +1,95 @@ +/* + * 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 { + DockerContainerRunner, + loggerToWinstonLogger, + cacheToPluginCacheManager, +} from '@backstage/backend-common'; +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; + +import { + Preparers, + Generators, + Publisher, +} from '@backstage/plugin-techdocs-node'; +import Docker from 'dockerode'; +import { createRouter } from '@backstage/plugin-techdocs-backend'; + +/** + * The TechDocs plugin is responsible for serving and building documentation for any entity. + * @alpha + */ +export const techdocsPlugin = createBackendPlugin({ + pluginId: 'techdocs', + register(env) { + env.registerInit({ + deps: { + config: coreServices.config, + logger: coreServices.logger, + urlReader: coreServices.urlReader, + http: coreServices.httpRouter, + discovery: coreServices.discovery, + cache: coreServices.cache, + }, + async init({ config, logger, urlReader, http, discovery, cache }) { + const winstonLogger = loggerToWinstonLogger(logger); + // Preparers are responsible for fetching source files for documentation. + const preparers = await Preparers.fromConfig(config, { + reader: urlReader, + logger: winstonLogger, + }); + + // Docker client (conditionally) used by the generators, based on techdocs.generators config. + const dockerClient = new Docker(); + const containerRunner = new DockerContainerRunner({ dockerClient }); + + // Generators are used for generating documentation sites. + const generators = await Generators.fromConfig(config, { + logger: winstonLogger, + containerRunner, + }); + + // Publisher is used for + // 1. Publishing generated files to storage + // 2. Fetching files from storage and passing them to TechDocs frontend. + const publisher = await Publisher.fromConfig(config, { + logger: winstonLogger, + discovery: discovery, + }); + + // checks if the publisher is working and logs the result + await publisher.getReadiness(); + + const cacheManager = cacheToPluginCacheManager(cache); + http.use( + await createRouter({ + logger: winstonLogger, + cache: cacheManager, + preparers, + generators, + publisher, + config, + discovery, + }), + ); + }, + }); + }, +}); diff --git a/plugins/techdocs-backend/src/search/index.ts b/plugins/techdocs-backend/src/search/index.ts index 68e3b4edc7..fc2b48375e 100644 --- a/plugins/techdocs-backend/src/search/index.ts +++ b/plugins/techdocs-backend/src/search/index.ts @@ -14,11 +14,23 @@ * limitations under the License. */ -export { DefaultTechDocsCollatorFactory } from './DefaultTechDocsCollatorFactory'; -export type { TechDocsCollatorFactoryOptions } from './DefaultTechDocsCollatorFactory'; - /** * todo(backstage/techdocs-core): stop exporting these in a future release. */ export { DefaultTechDocsCollator } from './DefaultTechDocsCollator'; export type { TechDocsCollatorOptions } from './DefaultTechDocsCollator'; + +import { DefaultTechDocsCollatorFactory as _DefaultTechDocsCollatorFactory } from '@backstage/plugin-search-backend-module-techdocs'; +import type { TechDocsCollatorFactoryOptions as _TechDocsCollatorFactoryOptions } from '@backstage/plugin-search-backend-module-techdocs'; + +/** + * @public + * @deprecated import from `@backstage/search-backend-module-techdocs` instead + */ +export type TechDocsCollatorFactoryOptions = _TechDocsCollatorFactoryOptions; + +/** + * @public + * @deprecated import from `@backstage/search-backend-module-techdocs` instead + */ +export const DefaultTechDocsCollatorFactory = _DefaultTechDocsCollatorFactory; diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 69fa5d8cfd..7d4e087301 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.0.12-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## 1.0.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 37cf85fb85c: Fixed bug in IssueLink component where the URL was not generated properly when the repository was located inside a Gitlab subgroup +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 1.0.11-next.2 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index b5aebb262c..05989fed44 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", "description": "Plugin module for contributed TechDocs Addons", - "version": "1.0.11-next.2", + "version": "1.0.12-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -41,7 +41,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^20.0.0", "git-url-parse": "^13.0.0", "photoswipe": "^5.3.5", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 28a11e4b57..041437bc89 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-techdocs-node +## 1.6.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/integration-aws-node@0.1.2 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-search-common@1.2.2 + +## 1.6.0 + +### Minor Changes + +- ea2bbef1b16: Added support for an HTTPS proxy for techdocs AWS S3 requests + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- bf493710f50: Update to a newer version of `@trendyol-js/openstack-swift-sdk` +- bfe350ef4ce: Fixed bug that prevented deletion of stale files when non-empty directories where tried to be deleted as well. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/integration-aws-node@0.1.2 + - @backstage/plugin-search-common@1.2.2 + ## 1.6.0-next.2 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 4c3a4a3496..1b0977fbdd 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-node", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "1.6.0-next.2", + "version": "1.6.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { @@ -54,7 +54,7 @@ "@backstage/integration-aws-node": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "@google-cloud/storage": "^6.0.0", - "@trendyol-js/openstack-swift-sdk": "^0.0.5", + "@trendyol-js/openstack-swift-sdk": "^0.0.6", "@types/express": "^4.17.6", "express": "^4.17.1", "fs-extra": "10.1.0", diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index cbc52cf570..434ab32835 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-techdocs-react +## 1.1.5-next.0 + +### Patch Changes + +- 7e0c7b09a47: Fix a bug that caused the header to not render when generating a document for the first time +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/version-bridge@1.0.3 + +## 1.1.4 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 8adfda60ae1: Updated dependency `jss` to `~10.10.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/version-bridge@1.0.3 + ## 1.1.4-next.2 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index ae8d7e21ae..e77a153e65 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-react", "description": "Shared frontend utilities for TechDocs and Addons", - "version": "1.1.4-next.2", + "version": "1.1.5-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -39,7 +39,7 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/version-bridge": "workspace:^", "@material-ui/core": "^4.12.2", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/styles": "^4.11.0", "jss": "~10.10.0", "lodash": "^4.17.21", diff --git a/plugins/techdocs-react/src/context.tsx b/plugins/techdocs-react/src/context.tsx index 4f427e0031..608dbc59b3 100644 --- a/plugins/techdocs-react/src/context.tsx +++ b/plugins/techdocs-react/src/context.tsx @@ -21,8 +21,10 @@ import React, { useState, memo, ReactNode, + useEffect, } from 'react'; import useAsync, { AsyncState } from 'react-use/lib/useAsync'; +import useAsyncRetry from 'react-use/lib/useAsyncRetry'; import { CompoundEntityRef, @@ -117,14 +119,14 @@ export const TechDocsReaderPageProvider = memo( const techdocsApi = useApi(techdocsApiRef); const config = useApi(configApiRef); - const metadata = useAsync(async () => { - return techdocsApi.getTechDocsMetadata(entityRef); - }, [entityRef]); - const entityMetadata = useAsync(async () => { return techdocsApi.getEntityMetadata(entityRef); }, [entityRef]); + const metadata = useAsyncRetry(async () => { + return techdocsApi.getTechDocsMetadata(entityRef); + }, [entityRef]); + const [title, setTitle] = useState(defaultTechDocsReaderPageValue.title); const [subtitle, setSubtitle] = useState( defaultTechDocsReaderPageValue.subtitle, @@ -133,7 +135,19 @@ export const TechDocsReaderPageProvider = memo( defaultTechDocsReaderPageValue.shadowRoot, ); - const value = { + useEffect(() => { + if (shadowRoot && !metadata.value && !metadata.loading) { + metadata.retry(); + } + }, [ + metadata.value, + metadata.loading, + shadowRoot, + metadata.retry, + metadata, + ]); + + const value: TechDocsReaderPageValue = { metadata, entityRef: toLowercaseEntityRefMaybe(entityRef, config), entityMetadata, diff --git a/plugins/techdocs-react/src/hooks.ts b/plugins/techdocs-react/src/hooks.ts index e8cc7bddc8..2984a4b588 100644 --- a/plugins/techdocs-react/src/hooks.ts +++ b/plugins/techdocs-react/src/hooks.ts @@ -84,11 +84,13 @@ export const useShadowRootSelection = (waitMillis: number = 0) => { useEffect(() => { window.document.addEventListener('selectionchange', handleSelectionChange); - return () => + return () => { + handleSelectionChange.cancel(); window.document.removeEventListener( 'selectionchange', handleSelectionChange, ); + }; }, [handleSelectionChange]); return selection; diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 7ce9542731..0b44055461 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,55 @@ # @backstage/plugin-techdocs +## 1.6.1-next.0 + +### Patch Changes + +- b2e182cdfa4: Fixes a UI bug in search result item which rendered the item text with incorrect font size and color +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + +## 1.6.0 + +### Minor Changes + +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 54a1e133b56: Fix bug that caused next and previous links not to work with certain versions of mkdocs-material +- f320c299c67: The HTML tag attributes in the documentation content inserted to shadow DOM is preserved to improve accessibility +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 8adfda60ae1: Updated dependency `jss` to `~10.10.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 238cf657c09: Copy to clipboard now works in a not secure context. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + ## 1.6.0-next.2 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 88ebb91c1b..2fd4effcdc 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "1.6.0-next.2", + "version": "1.6.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -47,7 +47,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/styles": "^4.10.0", "dompurify": "^2.2.9", "event-source-polyfill": "1.0.25", diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx index 0cef4d521f..f3612aa46e 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx @@ -107,7 +107,7 @@ export const TechDocsReaderPageSubheader = (props: { onClose={handleClose} keepMounted > - {settingsAddons} +
{settingsAddons}
) : null} diff --git a/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx b/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx index 422bbb10ce..28a6c789b6 100644 --- a/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx +++ b/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx @@ -23,7 +23,7 @@ import { SvgIcon, Tooltip, } from '@material-ui/core'; -import Button from '@material-ui/core/Button'; +import IconButton from '@material-ui/core/IconButton'; import type { Transformer } from './transformer'; import useCopyToClipboard from 'react-use/lib/useCopyToClipboard'; @@ -69,9 +69,13 @@ const CopyToClipboardButton = ({ text }: CopyToClipboardButtonProps) => { onClose={handleClose} leaveDelay={1000} > - +
); }; diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts index 979a616f01..c5e69e6084 100644 --- a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts +++ b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts @@ -21,6 +21,11 @@ const SIDEBAR_WIDTH = '224px'; export default ({ theme, sidebar }: RuleOptions) => ` /*================== Layout ==================*/ +/* mkdocs material v9 compat */ +.md-nav__title { + color: var(--md-default-fg-color); +} + .md-grid { max-width: 100%; margin: 0; diff --git a/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx b/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx index 3c0d2314e2..eae4ee7ce9 100644 --- a/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx +++ b/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx @@ -132,6 +132,8 @@ export const TechDocsSearchResultListItem = ( WebkitLineClamp: lineClamp, overflow: 'hidden', }} + color="textSecondary" + variant="body2" > {highlight?.fields.text ? ( ; - // (undocumented) - protected readonly env: VaultEnvironment; - setVaultClient(vaultClient: VaultClient): this; + setVaultClient(vaultApi: VaultApi): this; } // @public diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 336363e9ad..cf199f5f33 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.2.10-next.2", + "version": "0.3.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault-backend/src/service/VaultBuilder.ts b/plugins/vault-backend/src/service/VaultBuilder.ts index 788b90ff01..a61d99ac70 100644 --- a/plugins/vault-backend/src/service/VaultBuilder.ts +++ b/plugins/vault-backend/src/service/VaultBuilder.ts @@ -19,7 +19,7 @@ import { InputError } from '@backstage/errors'; import { Logger } from 'winston'; import express from 'express'; import Router from 'express-promise-router'; -import { VaultClient } from './vaultApi'; +import { VaultApi, VaultClient } from './vaultApi'; import { TaskRunner, PluginTaskScheduler } from '@backstage/backend-tasks'; import { errorHandler } from '@backstage/backend-common'; @@ -47,7 +47,7 @@ export type VaultBuilderReturn = { * @public */ export class VaultBuilder { - private vaultClient?: VaultClient; + private vaultApi?: VaultApi; /** * Creates a new instance of the VaultBuilder. @@ -58,7 +58,8 @@ export class VaultBuilder { static createBuilder(env: VaultEnvironment) { return new VaultBuilder(env); } - constructor(protected readonly env: VaultEnvironment) {} + + constructor(private readonly env: VaultEnvironment) {} /** * Builds the routes for Vault. @@ -79,9 +80,9 @@ export class VaultBuilder { }; } - this.vaultClient = this.vaultClient ?? new VaultClient(this.env); + this.vaultApi = this.vaultApi ?? new VaultClient(this.env); - const router = this.buildRouter(this.vaultClient); + const router = this.buildRouter(this.vaultApi); return { router: router, @@ -91,11 +92,11 @@ export class VaultBuilder { /** * Overwrites the current vault client. * - * @param vaultClient - The new Vault client + * @param vaultApi - The new Vault client * @returns */ - public setVaultClient(vaultClient: VaultClient) { - this.vaultClient = vaultClient; + public setVaultClient(vaultApi: VaultApi) { + this.vaultApi = vaultApi; return this; } @@ -116,8 +117,8 @@ export class VaultBuilder { id: 'refresh-vault-token', fn: async () => { this.env.logger.info('Renewing Vault token'); - const vaultClient = this.vaultClient ?? new VaultClient(this.env); - await vaultClient.renewToken(); + const vaultApi = this.vaultApi ?? new VaultClient(this.env); + await vaultApi.renewToken?.(); }, }); return this; @@ -126,10 +127,10 @@ export class VaultBuilder { /** * Builds the backend routes for Vault. * - * @param vaultClient - The Vault client used to list the secrets. + * @param vaultApi - The Vault client used to list the secrets. * @returns The generated backend router */ - protected buildRouter(vaultClient: VaultClient): express.Router { + private buildRouter(vaultApi: VaultApi): express.Router { const router = Router(); router.use(express.json()); @@ -143,7 +144,7 @@ export class VaultBuilder { throw new InputError(`Invalid path: ${path}`); } - const secrets = await vaultClient.listSecrets(path); + const secrets = await vaultApi.listSecrets(path); res.json({ items: secrets }); }); diff --git a/plugins/vault-backend/src/service/vaultApi.ts b/plugins/vault-backend/src/service/vaultApi.ts index 7510ff218e..b75ea76368 100644 --- a/plugins/vault-backend/src/service/vaultApi.ts +++ b/plugins/vault-backend/src/service/vaultApi.ts @@ -56,7 +56,7 @@ type RenewTokenResponse = { */ export interface VaultApi { /** - * Returns the URL to acces the Vault UI with the defined config. + * Returns the URL to access the Vault UI with the defined config. */ getFrontendSecretsUrl(): string; /** diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md index 1f6d8446bd..20ba9bf3b5 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-vault +## 0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.1.10 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.10-next.2 ### Patch Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index 127c9cf753..2195a378af 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault", "description": "A Backstage plugin that integrates towards Vault", - "version": "0.1.10-next.2", + "version": "0.1.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -41,7 +41,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index e9a2023939..0cf8ce8d2c 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-xcmetrics +## 0.2.37-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.18 + +## 0.2.36 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.2.36-next.2 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index fb7695e090..b72d7ce72c 100644 --- a/plugins/xcmetrics/package.json +++ b/plugins/xcmetrics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-xcmetrics", "description": "A Backstage plugin that shows XCode build metrics for your components", - "version": "0.2.36-next.2", + "version": "0.2.37-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,7 +29,7 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.57", + "@material-ui/lab": "4.0.0-alpha.61", "lodash": "^4.17.21", "luxon": "^3.0.0", "react-use": "^17.2.4", diff --git a/storybook/yarn.lock b/storybook/yarn.lock index 9c05864306..d1b064f48c 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -2966,90 +2966,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-arm64@npm:1.3.38" +"@swc/core-darwin-arm64@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-darwin-arm64@npm:1.3.42" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-x64@npm:1.3.38" +"@swc/core-darwin-x64@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-darwin-x64@npm:1.3.42" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.38" +"@swc/core-linux-arm-gnueabihf@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.42" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.38" +"@swc/core-linux-arm64-gnu@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.42" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.38" +"@swc/core-linux-arm64-musl@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.42" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.38" +"@swc/core-linux-x64-gnu@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.42" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-musl@npm:1.3.38" +"@swc/core-linux-x64-musl@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-x64-musl@npm:1.3.42" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.38" +"@swc/core-win32-arm64-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.42" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.38" +"@swc/core-win32-ia32-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.42" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.38" +"@swc/core-win32-x64-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.42" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.38 - resolution: "@swc/core@npm:1.3.38" + version: 1.3.42 + resolution: "@swc/core@npm:1.3.42" dependencies: - "@swc/core-darwin-arm64": 1.3.38 - "@swc/core-darwin-x64": 1.3.38 - "@swc/core-linux-arm-gnueabihf": 1.3.38 - "@swc/core-linux-arm64-gnu": 1.3.38 - "@swc/core-linux-arm64-musl": 1.3.38 - "@swc/core-linux-x64-gnu": 1.3.38 - "@swc/core-linux-x64-musl": 1.3.38 - "@swc/core-win32-arm64-msvc": 1.3.38 - "@swc/core-win32-ia32-msvc": 1.3.38 - "@swc/core-win32-x64-msvc": 1.3.38 + "@swc/core-darwin-arm64": 1.3.42 + "@swc/core-darwin-x64": 1.3.42 + "@swc/core-linux-arm-gnueabihf": 1.3.42 + "@swc/core-linux-arm64-gnu": 1.3.42 + "@swc/core-linux-arm64-musl": 1.3.42 + "@swc/core-linux-x64-gnu": 1.3.42 + "@swc/core-linux-x64-musl": 1.3.42 + "@swc/core-win32-arm64-msvc": 1.3.42 + "@swc/core-win32-ia32-msvc": 1.3.42 + "@swc/core-win32-x64-msvc": 1.3.42 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -3071,7 +3071,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: c55d30e57638bcd21f788add8490c3f3e71bfe027aa5a8b153e1b1b9686ecddd6deeaaa6a6b17717c7eab4c1e2a232b465b6755b6c891506fc0d03139badfbf7 + checksum: 5c28c03ee6a4e1f630c4a519b56d7e23a0102f70fad977a3ab144a3da96231cf4849e473cdc9ee7be6b9266ba0838d0bc0b6b3575a75540f302befe96cc9606e languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 4ad5e727d0..d24b6855ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,6 +33,51 @@ __metadata: languageName: node linkType: hard +"@apollo/cache-control-types@npm:^1.0.2": + version: 1.0.2 + resolution: "@apollo/cache-control-types@npm:1.0.2" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 1e00c57b45fbd8656c96cdcd254658f332c1955bd8db9274c665e1c6ef8ac881a6b6a3f953b60638ae5f59fdfce6b005adb9a5b945b694903579a9665499e823 + languageName: node + linkType: hard + +"@apollo/client@npm:^3.0.0": + version: 3.7.10 + resolution: "@apollo/client@npm:3.7.10" + dependencies: + "@graphql-typed-document-node/core": ^3.1.1 + "@wry/context": ^0.7.0 + "@wry/equality": ^0.5.0 + "@wry/trie": ^0.3.0 + graphql-tag: ^2.12.6 + hoist-non-react-statics: ^3.3.2 + optimism: ^0.16.1 + prop-types: ^15.7.2 + response-iterator: ^0.2.6 + symbol-observable: ^4.0.0 + ts-invariant: ^0.10.3 + tslib: ^2.3.0 + zen-observable-ts: ^1.2.5 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + graphql-ws: ^5.5.5 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + subscriptions-transport-ws: ^0.9.0 || ^0.11.0 + peerDependenciesMeta: + graphql-ws: + optional: true + react: + optional: true + react-dom: + optional: true + subscriptions-transport-ws: + optional: true + checksum: d74a68f8042e76e3a81990c79a89aefc07c8899d354f3b469591356508001005106bba0fa953652c3ec19756d44bdec6730ac98f62fa836bd76acbcb7eff42ce + languageName: node + linkType: hard + "@apollo/explorer@npm:^2.0.0": version: 2.0.2 resolution: "@apollo/explorer@npm:2.0.2" @@ -57,9 +102,9 @@ __metadata: languageName: node linkType: hard -"@apollo/protobufjs@npm:1.2.6": - version: 1.2.6 - resolution: "@apollo/protobufjs@npm:1.2.6" +"@apollo/protobufjs@npm:1.2.7": + version: 1.2.7 + resolution: "@apollo/protobufjs@npm:1.2.7" dependencies: "@protobufjs/aspromise": ^1.1.2 "@protobufjs/base64": ^1.1.2 @@ -72,110 +117,181 @@ __metadata: "@protobufjs/pool": ^1.1.0 "@protobufjs/utf8": ^1.1.0 "@types/long": ^4.0.0 - "@types/node": ^10.1.0 long: ^4.0.0 bin: apollo-pbjs: bin/pbjs apollo-pbts: bin/pbts - checksum: 1410e94f87f7ce202491f2c45633ddea0590f5279bd3eaaeb25aa114345d09a5041f15d79b75e5915b23813dc71ec52e71fc1fda858fee21dead890dcb768416 + checksum: e01a33984ae06d6679f6796bb44e55260112ddd090ebc9f87d3f952c45153dd5df5c91ac4bf91ba60fb72ff8c1218059ce4bf8bb2eb08c5049c783de0098eec0 languageName: node linkType: hard -"@apollo/utils.dropunuseddefinitions@npm:^1.1.0": +"@apollo/server-gateway-interface@npm:^1.1.0": version: 1.1.0 - resolution: "@apollo/utils.dropunuseddefinitions@npm:1.1.0" - peerDependencies: - graphql: 14.x || 15.x || 16.x - checksum: b66e07086ea65bcb94d84cfd5e6d90d0406c4e7f602c9a5e793c2001273380a4f61c287f60ee1d81d47d49d3a62ef3f0afb8049243540d3021ff445869124094 - languageName: node - linkType: hard - -"@apollo/utils.keyvaluecache@npm:^1.0.1": - version: 1.0.1 - resolution: "@apollo/utils.keyvaluecache@npm:1.0.1" + resolution: "@apollo/server-gateway-interface@npm:1.1.0" dependencies: - "@apollo/utils.logger": ^1.0.0 + "@apollo/usage-reporting-protobuf": ^4.0.0 + "@apollo/utils.fetcher": ^2.0.0 + "@apollo/utils.keyvaluecache": ^2.1.0 + "@apollo/utils.logger": ^2.0.0 + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 0ad0b3b9dfb53cc664245acac638b3a3db0d56c496c8bf6c56928a92c21e9b3062bec47bd42c2c0f85a4469443467b245c772bb558c2733c1c0dde194722c82b + languageName: node + linkType: hard + +"@apollo/server@npm:^4.0.0": + version: 4.5.0 + resolution: "@apollo/server@npm:4.5.0" + dependencies: + "@apollo/cache-control-types": ^1.0.2 + "@apollo/server-gateway-interface": ^1.1.0 + "@apollo/usage-reporting-protobuf": ^4.1.0 + "@apollo/utils.createhash": ^2.0.0 + "@apollo/utils.fetcher": ^2.0.0 + "@apollo/utils.isnodelike": ^2.0.0 + "@apollo/utils.keyvaluecache": ^2.1.0 + "@apollo/utils.logger": ^2.0.0 + "@apollo/utils.usagereporting": ^2.0.0 + "@apollo/utils.withrequired": ^2.0.0 + "@graphql-tools/schema": ^9.0.0 + "@josephg/resolvable": ^1.0.0 + "@types/express": ^4.17.13 + "@types/express-serve-static-core": ^4.17.30 + "@types/node-fetch": ^2.6.1 + async-retry: ^1.2.1 + body-parser: ^1.20.0 + cors: ^2.8.5 + express: ^4.17.1 + loglevel: ^1.6.8 lru-cache: ^7.10.1 - checksum: 1a5dbd2eae0575905e25d471430d431d145b767ee6f5e8efe3ba64ed44208db131f437e36cf17df6623ae6de97a87c4c8691b4a274510b52ab49f6afe9627a3b + negotiator: ^0.6.3 + node-abort-controller: ^3.1.1 + node-fetch: ^2.6.7 + uuid: ^9.0.0 + whatwg-mimetype: ^3.0.0 + peerDependencies: + graphql: ^16.6.0 + checksum: 193b5f6913c945aafb8fc6b5b75fcfff250e5b84dc2727f6a0472b304da08a6cd90a21ae45591e6408e9413e8bee323bbf4c9586b511a4f426b562da5328e4d0 languageName: node linkType: hard -"@apollo/utils.logger@npm:^1.0.0": - version: 1.0.0 - resolution: "@apollo/utils.logger@npm:1.0.0" - checksum: 9be2b269d6d1cf2235c7b49a5edbb36c87589facf79516521df66d0c782709b7301a1365693b6e15d77f482d231bbb0fea4c2ae42faac7068cc4e014ce338c68 +"@apollo/usage-reporting-protobuf@npm:^4.0.0, @apollo/usage-reporting-protobuf@npm:^4.1.0": + version: 4.1.0 + resolution: "@apollo/usage-reporting-protobuf@npm:4.1.0" + dependencies: + "@apollo/protobufjs": 1.2.7 + checksum: 442532d7077a728a499de6c2c2340d106b26f14695446361f947a14d3092e4109239a86cfb99e4bb795d913523c1f61a05bb799b45fc72615560693bbd62e645 languageName: node linkType: hard -"@apollo/utils.printwithreducedwhitespace@npm:^1.1.0": - version: 1.1.0 - resolution: "@apollo/utils.printwithreducedwhitespace@npm:1.1.0" +"@apollo/utils.createhash@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.createhash@npm:2.0.0" + dependencies: + "@apollo/utils.isnodelike": ^2.0.0 + sha.js: ^2.4.11 + checksum: 467558891f22b05293ca2d9c04fb4815d8b13e9e03cac6f6f5eb752d06f00eb46a3f237c93250d83d53753326c289899b177f3147cd368079b7e74098392b1b7 + languageName: node + linkType: hard + +"@apollo/utils.dropunuseddefinitions@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.dropunuseddefinitions@npm:2.0.0" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 86536751681c64f35a2d37b0c2f69a39d91ea0e4f0c3c993d9f76fa109f85e9d306e6994bd6e38eef1e4e5b83245125aaa125ecc94e185d90b3255f06a538503 + checksum: aaabd487ce25b56488f6bbf6606aecdc2b1f57805ec1b7fa16e21510947d4d5b4b1d557ebaa499dfecb8dfaef4058b696812feed6896bac5d7fb52e9bb1e1b2c languageName: node linkType: hard -"@apollo/utils.removealiases@npm:1.0.0": - version: 1.0.0 - resolution: "@apollo/utils.removealiases@npm:1.0.0" +"@apollo/utils.fetcher@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.fetcher@npm:2.0.0" + checksum: e9f4b696f496751d1b781836f394608115ae1fab673cb30ede223748d04eb983384b5c9e01f8350bb0530d841fd0ccb41be3a3a4bcae0a141b2478862add29cc + languageName: node + linkType: hard + +"@apollo/utils.isnodelike@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.isnodelike@npm:2.0.0" + checksum: 436853000037c955e7112d19b60ca82e6d453e7bc715f3360ab23384fe1153039b06f9329e85e1adb030a1b22f0b9e960b28a5ccd92f7c61a1af57e58401a1aa + languageName: node + linkType: hard + +"@apollo/utils.keyvaluecache@npm:^2.1.0": + version: 2.1.0 + resolution: "@apollo/utils.keyvaluecache@npm:2.1.0" + dependencies: + "@apollo/utils.logger": ^2.0.0 + lru-cache: ^7.14.1 + checksum: 1e1c9cdea98384c01864250bd8e39cffaa822adbd60f9387ecf5c6565f69c2fd23b3ebdc499990b39535d4df0e3991fe73ec2d59a2798631ede04d8834d8c384 + languageName: node + linkType: hard + +"@apollo/utils.logger@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.logger@npm:2.0.0" + checksum: bfe87036382adaf1b5f05acc8e926b6316a8b37dc0c0b20ae0c2010b61085d018620203eda9cb6884e650f3d971a4dfdbc30980deedba99d219ba2abd9bd8ffa + languageName: node + linkType: hard + +"@apollo/utils.printwithreducedwhitespace@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.printwithreducedwhitespace@npm:2.0.0" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: fda30ad4ee1fbf012e4289b9963b8b75a102eadbdfa5e558dc923cfc68df42eff6e232dc20c34b7e7563e5aac7ae3781d17919cd8f5eccb90c4225a274b2af93 + checksum: 0e1d374f2e0afd2d0fd31ff1c6717476b4ddeb642981d8f731a44420137f4991a28c1f9e278abf4229bb3174ae68037736e8cd8e13de5e316bf384dc32246518 languageName: node linkType: hard -"@apollo/utils.sortast@npm:^1.1.0": - version: 1.1.0 - resolution: "@apollo/utils.sortast@npm:1.1.0" +"@apollo/utils.removealiases@npm:2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.removealiases@npm:2.0.0" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 4f97e5864353386b8326eb62dd923be19c7e1f6b7ddc0935ceac1e34462aa471908d015f223f47a9cdd819e2d844f9dbdd27800bb451f5ffb4f376c4da8d2c41 + languageName: node + linkType: hard + +"@apollo/utils.sortast@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.sortast@npm:2.0.0" dependencies: lodash.sortby: ^4.7.0 peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 5ec695d8c91efd82ad75cb3e27662644c71e22be71793908135b38965be6fe1f229c24fd2f4fed1bc1829b84bec2a1f6470817a83c633d95292db7635a625471 + checksum: 50cfbdb6b8af735e9786af225edd6d4350e7530f5109bc330ae7f32edf38f15eed7711184d133a0801c5673fbc9a988a6521c7f69f3dc27910f2bd9fb6fbbb22 languageName: node linkType: hard -"@apollo/utils.stripsensitiveliterals@npm:^1.2.0": - version: 1.2.0 - resolution: "@apollo/utils.stripsensitiveliterals@npm:1.2.0" +"@apollo/utils.stripsensitiveliterals@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.stripsensitiveliterals@npm:2.0.0" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 5910186a30be23fac59652d350e83a8a7a53adb9146ed545906f6893ad9c8d380752e679348ee210ae01fa39cc0487692b632e960003dcedc2282bd28de2aa01 + checksum: d0a740a6d1e525b72c7d7066fa87a4ee273b3ce7401f3578542278121819bf90c97d32227270e07c923ab205afee2b52afb03261865175ba0040666a8988d479 languageName: node linkType: hard -"@apollo/utils.usagereporting@npm:^1.0.0": - version: 1.0.0 - resolution: "@apollo/utils.usagereporting@npm:1.0.0" +"@apollo/utils.usagereporting@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.usagereporting@npm:2.0.0" dependencies: - "@apollo/utils.dropunuseddefinitions": ^1.1.0 - "@apollo/utils.printwithreducedwhitespace": ^1.1.0 - "@apollo/utils.removealiases": 1.0.0 - "@apollo/utils.sortast": ^1.1.0 - "@apollo/utils.stripsensitiveliterals": ^1.2.0 - apollo-reporting-protobuf: ^3.3.1 + "@apollo/usage-reporting-protobuf": ^4.0.0 + "@apollo/utils.dropunuseddefinitions": ^2.0.0 + "@apollo/utils.printwithreducedwhitespace": ^2.0.0 + "@apollo/utils.removealiases": 2.0.0 + "@apollo/utils.sortast": ^2.0.0 + "@apollo/utils.stripsensitiveliterals": ^2.0.0 peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 9f4d1b8381fc7930619c51ce96580e61e604455e01701de9c822245d3a7583553a0cc4c050450ddf80d8e556682b2ac79ed784c58a8b98b52cf097d344c5d1d8 + checksum: 599e44d236728d6e57953c6fb9372cc35bc5e8e0d572b951907c94683228c134662efef4e97e456e7655d2871215319b912cabc3662c799111b5265de7873880 languageName: node linkType: hard -"@apollographql/apollo-tools@npm:^0.5.3": - version: 0.5.3 - resolution: "@apollographql/apollo-tools@npm:0.5.3" - peerDependencies: - graphql: ^14.2.1 || ^15.0.0 || ^16.0.0 - checksum: 652f16f8ae4afb65a2cb62a47e46882f49368f8f2c115f421773c3f8aa47b466ab9a6758fc18138495bd010baea5fda05d3c313edd11c4f4b3e8f8783b54d5a2 - languageName: node - linkType: hard - -"@apollographql/graphql-playground-html@npm:1.6.29": - version: 1.6.29 - resolution: "@apollographql/graphql-playground-html@npm:1.6.29" - dependencies: - xss: ^1.0.8 - checksum: 32984ae225de572f3fe286409553884e4d252a35019abfd5bd6ef40f52173ba810fd0a4d23915e727425cd993fd178115e6a2557315789085e235114228dfe4a +"@apollo/utils.withrequired@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.withrequired@npm:2.0.0" + checksum: 144cef2859318879b3478693eb891c31afa75f30e807bdfbef98ec3aa93c74cb0a3f76d245dbdedd4954f52c1b9ec8bebbccc69eb5d8bb8109c88c4352225e24 languageName: node linkType: hard @@ -373,1118 +489,1058 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/abort-controller@npm:3.272.0, @aws-sdk/abort-controller@npm:^3.208.0": - version: 3.272.0 - resolution: "@aws-sdk/abort-controller@npm:3.272.0" +"@aws-sdk/abort-controller@npm:3.296.0, @aws-sdk/abort-controller@npm:^3.208.0": + version: 3.296.0 + resolution: "@aws-sdk/abort-controller@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 298974b97641732c74272dd645b55c15aaefd891b5a868c279ae2abe3c3e0753e7e6f218e8c3712196ca2d4f19796623cb48f9e9816b5bbbc4eb38247d07d0fe + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: bfaf89f703f3be0b2c79574e3bd67f7f8272c88e1f99edaba51fa592a70d82f391380fdec703d8b31eea5488b285797848f7c6d187e87872ec0faf2df8284d47 languageName: node linkType: hard -"@aws-sdk/chunked-blob-reader-native@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/chunked-blob-reader-native@npm:3.208.0" +"@aws-sdk/chunked-blob-reader@npm:3.295.0": + version: 3.295.0 + resolution: "@aws-sdk/chunked-blob-reader@npm:3.295.0" dependencies: - "@aws-sdk/util-base64": 3.208.0 - tslib: ^2.3.1 - checksum: 6df294c66d6acaa3de2c5f3444a62577d0effa451a65b6a1606df538cfc865d257f01c74e711b36741a2c59f43385bd393c07c8562fe5101d6069b8c2646da53 + tslib: ^2.5.0 + checksum: 229903d1092a4367fcd4b9e9f9a0b5f33dece397e97e8266406fb17cb40ad3ce212d48d7b6fe4dc5e7b2cf4563fd2f61652e0b4803df9c5079ccb05fccb15ec7 languageName: node linkType: hard -"@aws-sdk/chunked-blob-reader@npm:3.188.0": - version: 3.188.0 - resolution: "@aws-sdk/chunked-blob-reader@npm:3.188.0" - dependencies: - tslib: ^2.3.1 - checksum: d6becebc6d77a63dd84601806c5f04bc9d0e418368fb2d593d786738119091e4d2e40721751be66260063fe7bb1c7ee2a5e075fa731eb8307722b90f6ce809dc - languageName: node - linkType: hard - -"@aws-sdk/client-cognito-identity@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.282.0" +"@aws-sdk/client-cognito-identity@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.299.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.282.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/credential-provider-node": 3.282.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-signing": 3.282.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: 9f7790e26dd3d7b0316105dd40092736526f1f6a11b814fcc95736ade3fe40058fb93f1dc2558f1b54b7871908247852e314cb1a892109e6294958eeff1d4439 + "@aws-sdk/client-sts": 3.299.0 + "@aws-sdk/config-resolver": 3.299.0 + "@aws-sdk/credential-provider-node": 3.299.0 + "@aws-sdk/fetch-http-handler": 3.296.0 + "@aws-sdk/hash-node": 3.296.0 + "@aws-sdk/invalid-dependency": 3.296.0 + "@aws-sdk/middleware-content-length": 3.296.0 + "@aws-sdk/middleware-endpoint": 3.299.0 + "@aws-sdk/middleware-host-header": 3.296.0 + "@aws-sdk/middleware-logger": 3.296.0 + "@aws-sdk/middleware-recursion-detection": 3.296.0 + "@aws-sdk/middleware-retry": 3.296.0 + "@aws-sdk/middleware-serde": 3.296.0 + "@aws-sdk/middleware-signing": 3.299.0 + "@aws-sdk/middleware-stack": 3.296.0 + "@aws-sdk/middleware-user-agent": 3.299.0 + "@aws-sdk/node-config-provider": 3.296.0 + "@aws-sdk/node-http-handler": 3.296.0 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/smithy-client": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/url-parser": 3.296.0 + "@aws-sdk/util-base64": 3.295.0 + "@aws-sdk/util-body-length-browser": 3.295.0 + "@aws-sdk/util-body-length-node": 3.295.0 + "@aws-sdk/util-defaults-mode-browser": 3.296.0 + "@aws-sdk/util-defaults-mode-node": 3.299.0 + "@aws-sdk/util-endpoints": 3.296.0 + "@aws-sdk/util-retry": 3.296.0 + "@aws-sdk/util-user-agent-browser": 3.299.0 + "@aws-sdk/util-user-agent-node": 3.299.0 + "@aws-sdk/util-utf8": 3.295.0 + tslib: ^2.5.0 + checksum: fdcf53a12c4d5a4b71e29cac553c1aa8137fa4e5df3c23134f168618f4bd10e2480786a3de50bc9fab66aead74bd359bdbc5bf64c4d3553d71eb2488377a3f1f languageName: node linkType: hard "@aws-sdk/client-s3@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/client-s3@npm:3.282.0" + version: 3.299.0 + resolution: "@aws-sdk/client-s3@npm:3.299.0" dependencies: "@aws-crypto/sha1-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.282.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/credential-provider-node": 3.282.0 - "@aws-sdk/eventstream-serde-browser": 3.272.0 - "@aws-sdk/eventstream-serde-config-resolver": 3.272.0 - "@aws-sdk/eventstream-serde-node": 3.272.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-blob-browser": 3.272.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/hash-stream-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/md5-js": 3.272.0 - "@aws-sdk/middleware-bucket-endpoint": 3.282.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-expect-continue": 3.282.0 - "@aws-sdk/middleware-flexible-checksums": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-location-constraint": 3.272.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-sdk-s3": 3.282.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-signing": 3.282.0 - "@aws-sdk/middleware-ssec": 3.272.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/signature-v4-multi-region": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-stream-browser": 3.282.0 - "@aws-sdk/util-stream-node": 3.282.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 - "@aws-sdk/util-waiter": 3.272.0 - "@aws-sdk/xml-builder": 3.201.0 + "@aws-sdk/client-sts": 3.299.0 + "@aws-sdk/config-resolver": 3.299.0 + "@aws-sdk/credential-provider-node": 3.299.0 + "@aws-sdk/eventstream-serde-browser": 3.296.0 + "@aws-sdk/eventstream-serde-config-resolver": 3.296.0 + "@aws-sdk/eventstream-serde-node": 3.299.0 + "@aws-sdk/fetch-http-handler": 3.296.0 + "@aws-sdk/hash-blob-browser": 3.299.0 + "@aws-sdk/hash-node": 3.296.0 + "@aws-sdk/hash-stream-node": 3.296.0 + "@aws-sdk/invalid-dependency": 3.296.0 + "@aws-sdk/md5-js": 3.296.0 + "@aws-sdk/middleware-bucket-endpoint": 3.299.0 + "@aws-sdk/middleware-content-length": 3.296.0 + "@aws-sdk/middleware-endpoint": 3.299.0 + "@aws-sdk/middleware-expect-continue": 3.296.0 + "@aws-sdk/middleware-flexible-checksums": 3.296.0 + "@aws-sdk/middleware-host-header": 3.296.0 + "@aws-sdk/middleware-location-constraint": 3.296.0 + "@aws-sdk/middleware-logger": 3.296.0 + "@aws-sdk/middleware-recursion-detection": 3.296.0 + "@aws-sdk/middleware-retry": 3.296.0 + "@aws-sdk/middleware-sdk-s3": 3.296.0 + "@aws-sdk/middleware-serde": 3.296.0 + "@aws-sdk/middleware-signing": 3.299.0 + "@aws-sdk/middleware-ssec": 3.296.0 + "@aws-sdk/middleware-stack": 3.296.0 + "@aws-sdk/middleware-user-agent": 3.299.0 + "@aws-sdk/node-config-provider": 3.296.0 + "@aws-sdk/node-http-handler": 3.296.0 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/signature-v4-multi-region": 3.299.0 + "@aws-sdk/smithy-client": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/url-parser": 3.296.0 + "@aws-sdk/util-base64": 3.295.0 + "@aws-sdk/util-body-length-browser": 3.295.0 + "@aws-sdk/util-body-length-node": 3.295.0 + "@aws-sdk/util-defaults-mode-browser": 3.296.0 + "@aws-sdk/util-defaults-mode-node": 3.299.0 + "@aws-sdk/util-endpoints": 3.296.0 + "@aws-sdk/util-retry": 3.296.0 + "@aws-sdk/util-stream-browser": 3.296.0 + "@aws-sdk/util-stream-node": 3.296.0 + "@aws-sdk/util-user-agent-browser": 3.299.0 + "@aws-sdk/util-user-agent-node": 3.299.0 + "@aws-sdk/util-utf8": 3.295.0 + "@aws-sdk/util-waiter": 3.296.0 + "@aws-sdk/xml-builder": 3.295.0 fast-xml-parser: 4.1.2 - tslib: ^2.3.1 - checksum: 4f0a1d9ddad89eb71da6f39c210c451461d570d11bc394c6b3d7af139e3ea077bed88fee56fae8318182e7a26464d31119620f191f0d552b51125b9f6ddffe0b + tslib: ^2.5.0 + checksum: 564fb486c47550e44abee25ebb98349418dc0c7d016695aeeb7fc08a0401353e0789f3191eb02825aee06e892d15c175434bf727d8e79a7af8c8deb9c08bf54d languageName: node linkType: hard "@aws-sdk/client-sqs@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/client-sqs@npm:3.282.0" + version: 3.299.0 + resolution: "@aws-sdk/client-sqs@npm:3.299.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.282.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/credential-provider-node": 3.282.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/md5-js": 3.272.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-sdk-sqs": 3.272.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-signing": 3.282.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/client-sts": 3.299.0 + "@aws-sdk/config-resolver": 3.299.0 + "@aws-sdk/credential-provider-node": 3.299.0 + "@aws-sdk/fetch-http-handler": 3.296.0 + "@aws-sdk/hash-node": 3.296.0 + "@aws-sdk/invalid-dependency": 3.296.0 + "@aws-sdk/md5-js": 3.296.0 + "@aws-sdk/middleware-content-length": 3.296.0 + "@aws-sdk/middleware-endpoint": 3.299.0 + "@aws-sdk/middleware-host-header": 3.296.0 + "@aws-sdk/middleware-logger": 3.296.0 + "@aws-sdk/middleware-recursion-detection": 3.296.0 + "@aws-sdk/middleware-retry": 3.296.0 + "@aws-sdk/middleware-sdk-sqs": 3.296.0 + "@aws-sdk/middleware-serde": 3.296.0 + "@aws-sdk/middleware-signing": 3.299.0 + "@aws-sdk/middleware-stack": 3.296.0 + "@aws-sdk/middleware-user-agent": 3.299.0 + "@aws-sdk/node-config-provider": 3.296.0 + "@aws-sdk/node-http-handler": 3.296.0 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/smithy-client": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/url-parser": 3.296.0 + "@aws-sdk/util-base64": 3.295.0 + "@aws-sdk/util-body-length-browser": 3.295.0 + "@aws-sdk/util-body-length-node": 3.295.0 + "@aws-sdk/util-defaults-mode-browser": 3.296.0 + "@aws-sdk/util-defaults-mode-node": 3.299.0 + "@aws-sdk/util-endpoints": 3.296.0 + "@aws-sdk/util-retry": 3.296.0 + "@aws-sdk/util-user-agent-browser": 3.299.0 + "@aws-sdk/util-user-agent-node": 3.299.0 + "@aws-sdk/util-utf8": 3.295.0 fast-xml-parser: 4.1.2 - tslib: ^2.3.1 - checksum: d3a2a2abb27313666aa8c9842c91a098b2570878a9853d59bf07d480669723d77b74ad2ca8e5297dc593d8e76578c78c2634f81e4eed84b84b020b06af04c423 + tslib: ^2.5.0 + checksum: a9e40735cfbef7beea646aa1047b0e629006b882b42bea61b129df415521ae5cb2e93c823d0117fb0deb38f43d7c239d4147e9268f3b78f7fd74c33634f8e7cf languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.282.0" +"@aws-sdk/client-sso-oidc@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.299.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: 4b7d40614d5379e30ce800acd60d6c04751f2a1e347474925d74fc4b9bdf9529132fd2e40933ae2fba5ef65569d55387ea80ca5312d810a868826276296b18a4 + "@aws-sdk/config-resolver": 3.299.0 + "@aws-sdk/fetch-http-handler": 3.296.0 + "@aws-sdk/hash-node": 3.296.0 + "@aws-sdk/invalid-dependency": 3.296.0 + "@aws-sdk/middleware-content-length": 3.296.0 + "@aws-sdk/middleware-endpoint": 3.299.0 + "@aws-sdk/middleware-host-header": 3.296.0 + "@aws-sdk/middleware-logger": 3.296.0 + "@aws-sdk/middleware-recursion-detection": 3.296.0 + "@aws-sdk/middleware-retry": 3.296.0 + "@aws-sdk/middleware-serde": 3.296.0 + "@aws-sdk/middleware-stack": 3.296.0 + "@aws-sdk/middleware-user-agent": 3.299.0 + "@aws-sdk/node-config-provider": 3.296.0 + "@aws-sdk/node-http-handler": 3.296.0 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/smithy-client": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/url-parser": 3.296.0 + "@aws-sdk/util-base64": 3.295.0 + "@aws-sdk/util-body-length-browser": 3.295.0 + "@aws-sdk/util-body-length-node": 3.295.0 + "@aws-sdk/util-defaults-mode-browser": 3.296.0 + "@aws-sdk/util-defaults-mode-node": 3.299.0 + "@aws-sdk/util-endpoints": 3.296.0 + "@aws-sdk/util-retry": 3.296.0 + "@aws-sdk/util-user-agent-browser": 3.299.0 + "@aws-sdk/util-user-agent-node": 3.299.0 + "@aws-sdk/util-utf8": 3.295.0 + tslib: ^2.5.0 + checksum: 67ab9a7a85cd6802e3247baa0932dbad6a385075975ba6ee939115fa9531ddb2c38a0829dff6def2a62e1d868a6f6bf340e2ba494c075128fafcc851ad352ab6 languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/client-sso@npm:3.282.0" +"@aws-sdk/client-sso@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/client-sso@npm:3.299.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: e227d6c3dfcb4c0ec8c2a42ba281bca82dc6134ec69e6af6901892567d729be7f4b361cd0b70e18d85117e29f52aa75affc8e91fef1eb8c024f577897480085f + "@aws-sdk/config-resolver": 3.299.0 + "@aws-sdk/fetch-http-handler": 3.296.0 + "@aws-sdk/hash-node": 3.296.0 + "@aws-sdk/invalid-dependency": 3.296.0 + "@aws-sdk/middleware-content-length": 3.296.0 + "@aws-sdk/middleware-endpoint": 3.299.0 + "@aws-sdk/middleware-host-header": 3.296.0 + "@aws-sdk/middleware-logger": 3.296.0 + "@aws-sdk/middleware-recursion-detection": 3.296.0 + "@aws-sdk/middleware-retry": 3.296.0 + "@aws-sdk/middleware-serde": 3.296.0 + "@aws-sdk/middleware-stack": 3.296.0 + "@aws-sdk/middleware-user-agent": 3.299.0 + "@aws-sdk/node-config-provider": 3.296.0 + "@aws-sdk/node-http-handler": 3.296.0 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/smithy-client": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/url-parser": 3.296.0 + "@aws-sdk/util-base64": 3.295.0 + "@aws-sdk/util-body-length-browser": 3.295.0 + "@aws-sdk/util-body-length-node": 3.295.0 + "@aws-sdk/util-defaults-mode-browser": 3.296.0 + "@aws-sdk/util-defaults-mode-node": 3.299.0 + "@aws-sdk/util-endpoints": 3.296.0 + "@aws-sdk/util-retry": 3.296.0 + "@aws-sdk/util-user-agent-browser": 3.299.0 + "@aws-sdk/util-user-agent-node": 3.299.0 + "@aws-sdk/util-utf8": 3.295.0 + tslib: ^2.5.0 + checksum: e83a26facdf0f08677f883df4e382654db6850a71a370c7f60afba1c00ecf7aac315477fcfc571e7300dd016804445d416fce3edd14966aa1b366e662a3697be languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.282.0, @aws-sdk/client-sts@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/client-sts@npm:3.282.0" +"@aws-sdk/client-sts@npm:3.299.0, @aws-sdk/client-sts@npm:^3.208.0": + version: 3.299.0 + resolution: "@aws-sdk/client-sts@npm:3.299.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/credential-provider-node": 3.282.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-sdk-sts": 3.282.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-signing": 3.282.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/config-resolver": 3.299.0 + "@aws-sdk/credential-provider-node": 3.299.0 + "@aws-sdk/fetch-http-handler": 3.296.0 + "@aws-sdk/hash-node": 3.296.0 + "@aws-sdk/invalid-dependency": 3.296.0 + "@aws-sdk/middleware-content-length": 3.296.0 + "@aws-sdk/middleware-endpoint": 3.299.0 + "@aws-sdk/middleware-host-header": 3.296.0 + "@aws-sdk/middleware-logger": 3.296.0 + "@aws-sdk/middleware-recursion-detection": 3.296.0 + "@aws-sdk/middleware-retry": 3.296.0 + "@aws-sdk/middleware-sdk-sts": 3.299.0 + "@aws-sdk/middleware-serde": 3.296.0 + "@aws-sdk/middleware-signing": 3.299.0 + "@aws-sdk/middleware-stack": 3.296.0 + "@aws-sdk/middleware-user-agent": 3.299.0 + "@aws-sdk/node-config-provider": 3.296.0 + "@aws-sdk/node-http-handler": 3.296.0 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/smithy-client": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/url-parser": 3.296.0 + "@aws-sdk/util-base64": 3.295.0 + "@aws-sdk/util-body-length-browser": 3.295.0 + "@aws-sdk/util-body-length-node": 3.295.0 + "@aws-sdk/util-defaults-mode-browser": 3.296.0 + "@aws-sdk/util-defaults-mode-node": 3.299.0 + "@aws-sdk/util-endpoints": 3.296.0 + "@aws-sdk/util-retry": 3.296.0 + "@aws-sdk/util-user-agent-browser": 3.299.0 + "@aws-sdk/util-user-agent-node": 3.299.0 + "@aws-sdk/util-utf8": 3.295.0 fast-xml-parser: 4.1.2 - tslib: ^2.3.1 - checksum: 5af24417f7ef2dbebe6b0c0aa545eeb809e92136bce2b1e7dd07de1159f2308c2d673c3b136440e4137ce7524cbdabe50e80d7ca6f8635a3d9dcd2983532a9e7 + tslib: ^2.5.0 + checksum: 4a9160e0e79a3f5d39646d56dbd9a0cb52063164df42e88640019ca74e88e49f7c36ddb98beae537051eb0798d912e283262657bdf420c6640ed04783f2d3d72 languageName: node linkType: hard -"@aws-sdk/config-resolver@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/config-resolver@npm:3.282.0" +"@aws-sdk/config-resolver@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/config-resolver@npm:3.299.0" dependencies: - "@aws-sdk/signature-v4": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-config-provider": 3.208.0 - "@aws-sdk/util-middleware": 3.272.0 - tslib: ^2.3.1 - checksum: 47628c4c66d93f2fb109039a55f206f1d9360fd3440ba2354489b5ddf05aab5322791a7e688cb02012342b3ecc7c5a61030838e6b94be76461f7f86d10a3c120 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-config-provider": 3.295.0 + "@aws-sdk/util-middleware": 3.296.0 + tslib: ^2.5.0 + checksum: 2fc2bd424a3b24cabf1df549b6102a47657ddf77f6d81cf2d477fd7eec407071febc5ec5e21384903104526b753c71777106c24dfdfd055e2b8cd810d7d50730 languageName: node linkType: hard -"@aws-sdk/credential-provider-cognito-identity@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.282.0" +"@aws-sdk/credential-provider-cognito-identity@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.299.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.282.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: c78e08a43e5611d6fbf15871720b38d76168ffbf75e24394ad10550b636d454c97bc6caaf70b0a3b960406b85874c7e45406167e6d38ae18acadfcaac16b2d73 + "@aws-sdk/client-cognito-identity": 3.299.0 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 03a1719599fa72cd42677a6b59cdb22285b0b27353489c9b04ddafc0a61d3cdd2206f90e456c2e162fb8b85f7d8214f25b774368624fa087dcd42f6ef187c8e6 languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.272.0" +"@aws-sdk/credential-provider-env@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.296.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 74195ecb608e3e6dedfc40e052bd7d0ef3a9e531ecf404f40d05869e23328bd156e458e9770d30458137438de92efd3dcb9fc3ff5f1319c49b55e057323f3ea6 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 2695b2431f68a0faea47e41bef6ad38a5ccaa48a85729b7b533af63daa30e0645e9aee6d138abfbb2175c361b2afdf6a8acb6bd19a6cc7c2648d7c6a1ca84917 languageName: node linkType: hard -"@aws-sdk/credential-provider-imds@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/credential-provider-imds@npm:3.272.0" +"@aws-sdk/credential-provider-imds@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/credential-provider-imds@npm:3.296.0" dependencies: - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - tslib: ^2.3.1 - checksum: c6adfcaa8dada3f99bbbd241aee3e568474c93df97e9b3f5e4feb9b000a91e5b3f0491556f712ebbd4d67de9c77c1072e6d444ac63ad9c6be31cf26acb2bc72c + "@aws-sdk/node-config-provider": 3.296.0 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/url-parser": 3.296.0 + tslib: ^2.5.0 + checksum: 02e3e5b45816a7907c48a79db209c7c3a3158908dd8beac2bf20c097d6d246d3cc89d3058c11ba2d774afc37b3cf1f83d93936644179e75f5bbc9484e853c747 languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.282.0" +"@aws-sdk/credential-provider-ini@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.299.0" dependencies: - "@aws-sdk/credential-provider-env": 3.272.0 - "@aws-sdk/credential-provider-imds": 3.272.0 - "@aws-sdk/credential-provider-process": 3.272.0 - "@aws-sdk/credential-provider-sso": 3.282.0 - "@aws-sdk/credential-provider-web-identity": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: e5281422c8e060dbfca271ccb2f80f23fac11d513d2f97954a7070ca3fdfa0293aed55d8bb0e65cc50dbb60c624755436892a9dd41a659dd3ab8f91d1d9ba74e + "@aws-sdk/credential-provider-env": 3.296.0 + "@aws-sdk/credential-provider-imds": 3.296.0 + "@aws-sdk/credential-provider-process": 3.296.0 + "@aws-sdk/credential-provider-sso": 3.299.0 + "@aws-sdk/credential-provider-web-identity": 3.296.0 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/shared-ini-file-loader": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 2bb3b76ee7083cd861ac81bfd3f9e3f2a610277e23a4235503101d262d3ed9e4fd9f2fff079549f0b180e7383e0388c30f965e55eb107f90dc3b9aef69a51946 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.282.0, @aws-sdk/credential-provider-node@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.282.0" +"@aws-sdk/credential-provider-node@npm:3.299.0, @aws-sdk/credential-provider-node@npm:^3.208.0": + version: 3.299.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.299.0" dependencies: - "@aws-sdk/credential-provider-env": 3.272.0 - "@aws-sdk/credential-provider-imds": 3.272.0 - "@aws-sdk/credential-provider-ini": 3.282.0 - "@aws-sdk/credential-provider-process": 3.272.0 - "@aws-sdk/credential-provider-sso": 3.282.0 - "@aws-sdk/credential-provider-web-identity": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: dc76e67a635bb8807e2e80f4095beaa9d19a07cb5ed7e86080dd9ccff9fc23d6a84af88b74994233742032766efaebc2fd621cd3f8462d8ff041fdf5604a0ee4 + "@aws-sdk/credential-provider-env": 3.296.0 + "@aws-sdk/credential-provider-imds": 3.296.0 + "@aws-sdk/credential-provider-ini": 3.299.0 + "@aws-sdk/credential-provider-process": 3.296.0 + "@aws-sdk/credential-provider-sso": 3.299.0 + "@aws-sdk/credential-provider-web-identity": 3.296.0 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/shared-ini-file-loader": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: e622fe0c550cdfc6df247591becfdb747c6a0aecc1142f954a728f72677a00391302b90ee90b019861093d2c79050ba4bc038430235c56a0f5bb8f131865a4ca languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.272.0" +"@aws-sdk/credential-provider-process@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.296.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: fda290aea2417137f333c8ad0a94d7789054b464bdf5f9a7eef06341f88d4bd0c96ca02b84b58e0af2a9c490cee4febf6ee84254dfbff192bfccccbb0c8c1876 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/shared-ini-file-loader": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 5b29c587806b8a611d3843bd3236061c9a4fd6ce2d4a461c94ff14bd6d4b3193323398d2a0380036be96f4e589d2e46f92f5af7c40da7bdd935444d7ebe009d3 languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.282.0" +"@aws-sdk/credential-provider-sso@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.299.0" dependencies: - "@aws-sdk/client-sso": 3.282.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/token-providers": 3.282.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 7888c5fbb0be701a8b6ad0a853959f5de0549e0c54dd475767395cfd9337e429056c948ee332da3b447751899635886955a8cc30e0ffbb1b86b6d887712ac0e4 + "@aws-sdk/client-sso": 3.299.0 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/shared-ini-file-loader": 3.296.0 + "@aws-sdk/token-providers": 3.299.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: b837ea99a623f0d7e427db70160dcc1ac4c0c6e497ec4b4dadc9fdd16aa6fc0a0434998b48af50e3490be3c591c5fe7601a4b70e71b03118ce45d38cb22dd846 languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.272.0" +"@aws-sdk/credential-provider-web-identity@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.296.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: aad84e2bfd90495ed4eb76b83940729bd2fb652398f7e477cfd8053f9c986132b4ff8682854a91e3f23c7daaab66e1c31320188561104fea710cd87be1221e9d + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 35fadfbc623cb47eae1b189a6384ae545d4a5d203c70a12e57bb236c645d61d31dd3ffaafc323d878cde6061ec5be5c285c34b3296e7c4a8992c479b4485518a languageName: node linkType: hard "@aws-sdk/credential-providers@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/credential-providers@npm:3.282.0" + version: 3.299.0 + resolution: "@aws-sdk/credential-providers@npm:3.299.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.282.0 - "@aws-sdk/client-sso": 3.282.0 - "@aws-sdk/client-sts": 3.282.0 - "@aws-sdk/credential-provider-cognito-identity": 3.282.0 - "@aws-sdk/credential-provider-env": 3.272.0 - "@aws-sdk/credential-provider-imds": 3.272.0 - "@aws-sdk/credential-provider-ini": 3.282.0 - "@aws-sdk/credential-provider-node": 3.282.0 - "@aws-sdk/credential-provider-process": 3.272.0 - "@aws-sdk/credential-provider-sso": 3.282.0 - "@aws-sdk/credential-provider-web-identity": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: ec707176eba558fc5bfc45b2917d624a83995c75bfc38a121d3a3fe6c0be541c25815d4892fc33fd0f1de5f892232014724b0d5c62c19a2d6d3f839258b25840 + "@aws-sdk/client-cognito-identity": 3.299.0 + "@aws-sdk/client-sso": 3.299.0 + "@aws-sdk/client-sts": 3.299.0 + "@aws-sdk/credential-provider-cognito-identity": 3.299.0 + "@aws-sdk/credential-provider-env": 3.296.0 + "@aws-sdk/credential-provider-imds": 3.296.0 + "@aws-sdk/credential-provider-ini": 3.299.0 + "@aws-sdk/credential-provider-node": 3.299.0 + "@aws-sdk/credential-provider-process": 3.296.0 + "@aws-sdk/credential-provider-sso": 3.299.0 + "@aws-sdk/credential-provider-web-identity": 3.296.0 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 0c1f49d6e057925f13a1a7028bb4fee124a1ec08d16fe5616aa7272007d8a9e70cd292726628a95d17a7d7099c91b88d94712faa2751da34bebee574f6e2ee4d languageName: node linkType: hard -"@aws-sdk/eventstream-codec@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/eventstream-codec@npm:3.272.0" +"@aws-sdk/eventstream-codec@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/eventstream-codec@npm:3.296.0" dependencies: "@aws-crypto/crc32": 3.0.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-hex-encoding": 3.201.0 - tslib: ^2.3.1 - checksum: bea8599a72657d698de169643950031624e0b61179240c8d8eb3c17f01bfc4579c507a861be6c703f318fcdff4217a4cb4279223cad93fb21e69f4b5d10d6102 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-hex-encoding": 3.295.0 + tslib: ^2.5.0 + checksum: 474fa95fa6cc2e6730d0931337d288e469de270ca53887a5acf4b18c9a11c4149fee491847dd4904757597c1446d0f52b38a61a3c2afd66970dc89acb182d278 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-browser@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/eventstream-serde-browser@npm:3.272.0" +"@aws-sdk/eventstream-serde-browser@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/eventstream-serde-browser@npm:3.296.0" dependencies: - "@aws-sdk/eventstream-serde-universal": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: a4fa42e1a8658eca191f567046741192e6e04f5c58744655ec0112a1d46b57d5ce04432e2fec0e6fe16d486c30abdc58b734ed67879c10e0fcc4820530eaff35 + "@aws-sdk/eventstream-serde-universal": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 2c6e203c35d8725809a827830bdc66699f7b78915aa39dbc9df6895edba63715f6039dbd4b72fe2f39e3c60eca48aeeccb193c0fbcdc9c5b09890adb7e6b7c8b languageName: node linkType: hard -"@aws-sdk/eventstream-serde-config-resolver@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/eventstream-serde-config-resolver@npm:3.272.0" +"@aws-sdk/eventstream-serde-config-resolver@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/eventstream-serde-config-resolver@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: feee058288bbf5a97d78dfee5084c2dc224d771499848dcaedbfd671c8889f52329f96ce87c291d29e66b46c8e25923bd55f64d8ed744089fc40723296eb003c + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: f0297397078e4d7e9f116e070c62c90ad2650f26c47cb75beaff045cffef9a51a5005c94292b7ffdf62ff867b57ee11253d8da6ab1fbe3ace26193d9c85bcb5a languageName: node linkType: hard -"@aws-sdk/eventstream-serde-node@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/eventstream-serde-node@npm:3.272.0" +"@aws-sdk/eventstream-serde-node@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/eventstream-serde-node@npm:3.299.0" dependencies: - "@aws-sdk/eventstream-serde-universal": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 02fa0c5f992df253713bbe19515bf898e332e3bc51da28da28bdf2cde584df90689bb9b54afa57354798c8b01e4b592d63fb575d7652fd5df2c00bf1e45e689a + "@aws-sdk/eventstream-serde-universal": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: b570a1b9310b56ed0f81c2bb682676c0754d82af946a6187905198244e530da370150ada6dd04c2a5bcd0c196654db9013ed9f5da81245968b98974523b32818 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-universal@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/eventstream-serde-universal@npm:3.272.0" +"@aws-sdk/eventstream-serde-universal@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/eventstream-serde-universal@npm:3.296.0" dependencies: - "@aws-sdk/eventstream-codec": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 3d8031e84af1a0cdf5f22f98aee868cd62b6fa87e432231bbe32a400874dc44b030cffdf9dce3194281bf04a1669b23bf8ce16759123ba10980676fe9388e63b + "@aws-sdk/eventstream-codec": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 9e9068bd9dae4fda72fc073f36960b9e892d2abc5459e853c643a8b69e813f75443a8350834fd38e9c368106f58f09beb105c0d8c3e401eb90c2ea40b3557e4f languageName: node linkType: hard -"@aws-sdk/fetch-http-handler@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/fetch-http-handler@npm:3.208.0" +"@aws-sdk/fetch-http-handler@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/fetch-http-handler@npm:3.296.0" dependencies: - "@aws-sdk/protocol-http": 3.208.0 - "@aws-sdk/querystring-builder": 3.208.0 - "@aws-sdk/types": 3.208.0 - "@aws-sdk/util-base64": 3.208.0 - tslib: ^2.3.1 - checksum: a0016ec854d247e28ba7a86e72d6915854b33d489e88e5d26c8e3843704a3978129b4b52619c9810acd19c47dbf9b4359be17ad939e0be676b4af9cb21952abf + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/querystring-builder": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-base64": 3.295.0 + tslib: ^2.5.0 + checksum: cc57acffff2a1dd96ed752a21f76d35f6c597a09ad2a7d5be5b03dba93386a1c3cfaf6c3c5f41b33e9734005424444892f4a173e58ce06dcf6e78421fb7b511b languageName: node linkType: hard -"@aws-sdk/fetch-http-handler@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/fetch-http-handler@npm:3.282.0" +"@aws-sdk/hash-blob-browser@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/hash-blob-browser@npm:3.299.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/querystring-builder": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - tslib: ^2.3.1 - checksum: 20823143bfed12dd25dc77abb8f869b4f013506f5a028477add87213ec184649dd799f4c6db5d25699a050763ef4a24c6363c06ff096e3a9b7413e2e865a10f6 + "@aws-sdk/chunked-blob-reader": 3.295.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: a21e6cc2f64b925e3283af0d878c6fea4621b66b77809d85612708f54df3000db52966c70fd981b761e59216e6ddb66c57b66706d8f027b7b2d8fab2e08971be languageName: node linkType: hard -"@aws-sdk/hash-blob-browser@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/hash-blob-browser@npm:3.272.0" +"@aws-sdk/hash-node@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/hash-node@npm:3.296.0" dependencies: - "@aws-sdk/chunked-blob-reader": 3.188.0 - "@aws-sdk/chunked-blob-reader-native": 3.208.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: ab0564672606760b934973ef33a8a8d567d52d3fa4be2a7a8919daa1b9ac1c3afaaee975ae7ad20940f51e1057e3321c39f5dcd2246ca85aad03e1f7aed68669 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-buffer-from": 3.295.0 + "@aws-sdk/util-utf8": 3.295.0 + tslib: ^2.5.0 + checksum: 728680b1bc04764dc710003e6b967e176d65ba46c03e53ffebf25f7d87bad2354203e1c1e754ef6b6bcebbc3bde725aac6a1e00cb47118f78419cefed13b5724 languageName: node linkType: hard -"@aws-sdk/hash-node@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/hash-node@npm:3.272.0" +"@aws-sdk/hash-stream-node@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/hash-stream-node@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-buffer-from": 3.208.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: 1b3d5b288133af9294df36cec2377589f45c82f61cb824b14ac38955541357826cf5a8f95d7906cbf284ed9ffbd928a37b2f94581f7281715879aa4c0e7c7b24 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-utf8": 3.295.0 + tslib: ^2.5.0 + checksum: 3dec341abc783f333e2536dea9191b9e732ad40eecd76cc863eaa455a91e8d184466732fb8fd9652afe83630a9da2cb5073b76360d8f45ecc4a8244ed38c9ef3 languageName: node linkType: hard -"@aws-sdk/hash-stream-node@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/hash-stream-node@npm:3.272.0" +"@aws-sdk/invalid-dependency@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/invalid-dependency@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: 4cb90a9ae442e0722d651d7e7558a8b0abcbc1b45670e194d51d0a9b2ea6cad6e3a02433d506a8d96ac94a26cd8e5746514c09f05f0da2acb2dc06c60218d3c5 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 5dc57b4396cbde9f594f14dc2a38e0c12e8cca4557b8e78fb5d23e1429e6dfef0b5ed1382da84862bb19abeaf39b92bc4dc7cba7c7a04dbc212cb6971f0553b0 languageName: node linkType: hard -"@aws-sdk/invalid-dependency@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/invalid-dependency@npm:3.272.0" +"@aws-sdk/is-array-buffer@npm:3.295.0": + version: 3.295.0 + resolution: "@aws-sdk/is-array-buffer@npm:3.295.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 4ef63ed9a9275e20bdcec551ee92a9d60a6a688c120f968fd51af235d357d39ec522752592075dad752be9a8439d93b4d1848e12fa9a88cda595920d78b008d2 - languageName: node - linkType: hard - -"@aws-sdk/is-array-buffer@npm:3.201.0": - version: 3.201.0 - resolution: "@aws-sdk/is-array-buffer@npm:3.201.0" - dependencies: - tslib: ^2.3.1 - checksum: 295450b417a9ab0b734050afff6c53aaed8a33dccd3ede60bf67fdec21f675d14ab8edc24f4e1d12aa4e99f9ccaf794aaaaff270c296c1ee38f73ea7ba7f59ce + tslib: ^2.5.0 + checksum: 23de81a3ab63a51ae61183792db4a9faf74f02c7c9cb5cfa6d4b36781d7832070090bb406dc8591dd74a07fa3d3c27bac11d7a931e75163f8e018987a995f3ce languageName: node linkType: hard "@aws-sdk/lib-storage@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/lib-storage@npm:3.282.0" + version: 3.299.0 + resolution: "@aws-sdk/lib-storage@npm:3.299.0" dependencies: - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 + "@aws-sdk/middleware-endpoint": 3.299.0 + "@aws-sdk/smithy-client": 3.296.0 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 - tslib: ^2.3.1 + tslib: ^2.5.0 peerDependencies: "@aws-sdk/abort-controller": ^3.0.0 "@aws-sdk/client-s3": ^3.0.0 - checksum: 14f1f21a653d239721ca488b6d7951511576a2e2652d240f3561ac0255cd4af321bc41531c15c3c6fae4095da062f5e841c6c9b58afd80be9bf105b63a256f72 + checksum: bbf180386c03ac4fb78c65c7b476dbb6bb5c81a4d8013e8c216710b6654642e89d4cd6dc8fe3383b42c285c098ca8f325199b58efdc13b5278ed6ce011b28331 languageName: node linkType: hard -"@aws-sdk/md5-js@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/md5-js@npm:3.272.0" +"@aws-sdk/md5-js@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/md5-js@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: d59010c1b48ba1992298ed23b605e7395a4aa964430d41012492faac24c7fa50856b565a523b0262b2c8b667904fdc57748d98475ba8c2e24b4550e17211e5ab + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-utf8": 3.295.0 + tslib: ^2.5.0 + checksum: 88d08cbf13af32c1c95c99727e8024c691c3fc2ff940394513a93524701a091385778bd5829a561991a7e145bf509c3e5e750803f352281df34d7a46d0147c51 languageName: node linkType: hard -"@aws-sdk/middleware-bucket-endpoint@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.282.0" +"@aws-sdk/middleware-bucket-endpoint@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.299.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-arn-parser": 3.208.0 - "@aws-sdk/util-config-provider": 3.208.0 - tslib: ^2.3.1 - checksum: 1b2f2dfcbf808b8f6e24173f05bdec21c8c6d5ea4eda6b01b3d3812e51e69fd39fe4880922f0f8f6ecbf35bf8410622458882b754d24a67eae59871c1273a2d4 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-arn-parser": 3.295.0 + "@aws-sdk/util-config-provider": 3.295.0 + tslib: ^2.5.0 + checksum: ed6bddb44c9e7212cea418cbc0ff0541f4d303722133708092dd25b08979b5cb3730f96b5ba1172604fc3274dcbcc84af9d96b511f499642aa191f00f9b5d0e5 languageName: node linkType: hard -"@aws-sdk/middleware-content-length@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-content-length@npm:3.282.0" +"@aws-sdk/middleware-content-length@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-content-length@npm:3.296.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: ebe0f4f55c30cd8ea3711a412e8f0c216c863b7b313ebd12de35b2c8e857cc38b5638c8acdfeca62307911b1092a516d5eaac60493dbeb76806012cda96f46d5 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 649c0d3f0c1ec607ea9558df09f318bffc763f66501263136791571206c148ca7ca691cb3211fe18bd09aacdc69545fdc5ffff4daeac73323864b5cb76b5c072 languageName: node linkType: hard -"@aws-sdk/middleware-endpoint@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-endpoint@npm:3.282.0" +"@aws-sdk/middleware-endpoint@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/middleware-endpoint@npm:3.299.0" dependencies: - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/signature-v4": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-config-provider": 3.208.0 - "@aws-sdk/util-middleware": 3.272.0 - tslib: ^2.3.1 - checksum: 84a9f3d6d5f904e9728c20444f3e2fc369b8a57e9dbc01cf3c3f5a6b6062b2ba470774bddd60a095845bba62ce153590c69a10211f61609d4eebf173338299e7 + "@aws-sdk/middleware-serde": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/url-parser": 3.296.0 + "@aws-sdk/util-middleware": 3.296.0 + tslib: ^2.5.0 + checksum: 7e8c6a85575019871c87dc5c1b19c47999bd5ae3fc2546b72e3e617bf8bdea1392fb385e25a51f382b37d01d171de51dfaf2f53b79fb09adc10049ee571fbc13 languageName: node linkType: hard -"@aws-sdk/middleware-expect-continue@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-expect-continue@npm:3.282.0" +"@aws-sdk/middleware-expect-continue@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.296.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 9b940175d545140608f17d7d5aefd798ea36640acfca95923320eab087bdd2edd25986a68f950a1ecfdf3c922bf91c0cae5b1bc4ce32d51c2f3e1915acc3939a + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 8ccebf2f5d351c6495e5699016e7c132c8c9f19fa272910d443e63df5fbd7ba84da1b31cd56cf6a0e1756f89970e90b199e45ef52f551e11e4b2593983889708 languageName: node linkType: hard -"@aws-sdk/middleware-flexible-checksums@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.282.0" +"@aws-sdk/middleware-flexible-checksums@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.296.0" dependencies: "@aws-crypto/crc32": 3.0.0 "@aws-crypto/crc32c": 3.0.0 - "@aws-sdk/is-array-buffer": 3.201.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: 7575ebdf82e62b0a03813acc18dab4c070c019b0e723ffb7be41d36955d29d87603689351ecb612a44ff9b70fd83fe6977c5a36f1d7c9cb80b104e28f19ddf23 + "@aws-sdk/is-array-buffer": 3.295.0 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-utf8": 3.295.0 + tslib: ^2.5.0 + checksum: 9191bf0b950699dd4eef575cdda598d54bdf90633bd683f0103aa9b9c44090190c7316b59619748803e0ec926444cf376ce89dc055d1675e3671bf108865c3a5 languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.282.0" +"@aws-sdk/middleware-host-header@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.296.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 19b5c9284ec5df8732301d5853007613d62ec43657d8793be14bd1dc4b64700748b37d09dbae835750be440faae0105be6d14caaa55f1309842873a701007b72 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 8b5b2b26b204bcc8587cbd659a052b896c4d76dd1633e99d7c035b7b779d2b90beff4878481b8b5b28deeb363bf276584f371a5f7c88cecda43a18c5ae1ab7aa languageName: node linkType: hard -"@aws-sdk/middleware-location-constraint@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-location-constraint@npm:3.272.0" +"@aws-sdk/middleware-location-constraint@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 42cb878c4a2b4e1c0884277a9cacc4611111e1d6de649c4fb41f770e60ddceef27de433667c4e4d29882f6c9ad746859e53e0724fbfc5aff23720496a4007a0b + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 00378f43d08abe45d85c386c2c4acd5b80c16158d94f61341da85ba979731b5ce4c6ecaf706d3356b680a459fa8c26119845997a1e3d5bd24adb3ae98e945d3e languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-logger@npm:3.272.0" +"@aws-sdk/middleware-logger@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-logger@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 128163d39522017ffb0099334f283ba82806b0c5b82965b47fff8b3b8648ae2b542b1733c69934bbca65fded9d26b8b93fa587547eeb8db2a3f5249841848f96 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: c006c03d24e26bbc1f9089987a0987b7627e1f7e1a5215d75e7132d2905f77f867d78806b968bee6e6830ddb94ddae8c1cead785b3fe4762e66da10584218ca9 languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.282.0" +"@aws-sdk/middleware-recursion-detection@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.296.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 3e2b43e4e3f8ebb4f02a5bf33b15d95b559e5a35a872a94ca254497fdc896508baa8c316f3bec660d6fad2154041d81a5295be8ed245943dcdb3abc2dd75ef27 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 2d8b8e130b6410e95340bca961e966c36f54154041aba3b0a308b0b6786cea36e026f28b910ac13411f333e445dbcc122801366bb55f64fab5cd76e05bb70257 languageName: node linkType: hard -"@aws-sdk/middleware-retry@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-retry@npm:3.282.0" +"@aws-sdk/middleware-retry@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-retry@npm:3.296.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/service-error-classification": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-middleware": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - tslib: ^2.3.1 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/service-error-classification": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-middleware": 3.296.0 + "@aws-sdk/util-retry": 3.296.0 + tslib: ^2.5.0 uuid: ^8.3.2 - checksum: fca7a6c8bac2f52df9987a66f7be5891e85fda0f6eff678ed78bc545ee45e159026d30cc8a136293e731ca69f9e5edc4f9f4895fea73bf28634426d9db0021f6 + checksum: 9672f0654606581e27a2f79b4ff2436539f115700319cd1b1e8373a3eb54f1f95820a38fe2ed4da04c7a8d09e8962e3e7412d2fc9835f4d165c02b2ac2d3138d languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.282.0" +"@aws-sdk/middleware-sdk-s3@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.296.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-arn-parser": 3.208.0 - tslib: ^2.3.1 - checksum: c373dcb455450897075adb943e454da84eae66e6b223a30a80599e2d8a33b61cf1a5e46ec8f7595adfd9059132ce444316f9e376eff6ca121f05b1bb67e99b2b + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-arn-parser": 3.295.0 + tslib: ^2.5.0 + checksum: f8be243d930d887c1f4dd3d850a382bcf0e90a5fec645fa357ebfd38bebba33428997927b2411a07c097cba50347b989b366b43d372553cf7b20a64740427ddc languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sqs@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.272.0" +"@aws-sdk/middleware-sdk-sqs@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-hex-encoding": 3.201.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: 2338c5865fb797f5e9f0963cf0045e991a9aa816c4fefb86943e129be68ff3b94a662741692999c2a212e4491db299241453d9b432c3eee63781850f22772a29 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-hex-encoding": 3.295.0 + "@aws-sdk/util-utf8": 3.295.0 + tslib: ^2.5.0 + checksum: 5a62ebf80bee110bde2b0c5da271c24db5af484bf50ade8cac2211e2acb3bc0566fdda1bd885110fe463cfa18c53b464af12f0d3c297201e1ba7f2275f0fd10a languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sts@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-sdk-sts@npm:3.282.0" +"@aws-sdk/middleware-sdk-sts@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/middleware-sdk-sts@npm:3.299.0" dependencies: - "@aws-sdk/middleware-signing": 3.282.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/signature-v4": 3.282.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: bcd2ee00d30191262da5caf5fda4d6c12a9a4aa1ae76693b5e49dc562c89294b4bd133e7036b3811d69806d3d6277848731a3ff8eb919644c33d58909f6ce42e + "@aws-sdk/middleware-signing": 3.299.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: b1e2b28d29d924bbe176203c9a0abbe05a48748845da970a5aa61723b5ad118d50b3790baf63cecb69db63b89dc6e4abca218f14ce258bce87858acf339696de languageName: node linkType: hard -"@aws-sdk/middleware-serde@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-serde@npm:3.272.0" +"@aws-sdk/middleware-serde@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-serde@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: d33c07ff8c7fb9682115220ae035de5414124fd81319d7490ed3f2c235b3c0b536634a5939b311dbd735050deca4702503ee26d9e17b97ba8a1ff9e46093573e + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 337bf9c4a621d6ef3a5c5d16273633f098e12e3581e08a9543d48e3a63ba6b70472f26f4e4e46040ed43fc1a498f8f046b66c28fc629f4a3a74b6a331609fd52 languageName: node linkType: hard -"@aws-sdk/middleware-signing@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-signing@npm:3.282.0" +"@aws-sdk/middleware-signing@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/middleware-signing@npm:3.299.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/signature-v4": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-middleware": 3.272.0 - tslib: ^2.3.1 - checksum: bf3040f3939430d2d32ccc893103f34a7ffd3d979021a124d6f03e6dbbe3b1537fe8736143ddee20f13170a46e545ed5774dd08bdc0be2d8d9b610dd90949246 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/signature-v4": 3.299.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-middleware": 3.296.0 + tslib: ^2.5.0 + checksum: 4eaa0a3b51eefa0f5e839a55ffa98f7cc79644fb7e8e3a3fbbdc4de2e2d10fb07cbd5201f44464a5550462af5efe47977feb6f057e6bd2160eed0904cd9d1752 languageName: node linkType: hard -"@aws-sdk/middleware-ssec@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-ssec@npm:3.272.0" +"@aws-sdk/middleware-ssec@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-ssec@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 81836fd3235f455d79d7cdc0bc193b321024dab2f6443f16e013c5eb4b3e06c3ca283152cb560f7f2bd2e2accf81f773f95278e8c9094806c1ddb54b5af0db8f + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 37795d8094ee6209d76ef7423eb967c1ab1330ca5242c176230972004b36cdeda1328e9ed8626c33f16d1eff7df7a9d0d90df9ad298fad4d22a1ba81bde4d91e languageName: node linkType: hard -"@aws-sdk/middleware-stack@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-stack@npm:3.272.0" +"@aws-sdk/middleware-stack@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/middleware-stack@npm:3.296.0" dependencies: - tslib: ^2.3.1 - checksum: 7006c4168c2e5c7b15edd4e87001a6e4edbd2f549908ac0e68bb61f12c232048ac1d351b0714e7a79115aeaf251838877b2ef9ac829a6b1ab04913015a3c87a3 + tslib: ^2.5.0 + checksum: 1fb787c066aa48612e0f7ddd4932c3a9fbfd37eef5838bd83c06bd113d11af76f098e2b09a431ab039fb3f3628b1b80bdaca1200a10d9ec9cde56134e40b6995 languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.282.0" +"@aws-sdk/middleware-user-agent@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.299.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 6ad66ec8517deccb6dbbc1c3241d2afc2fa73d9a3bbaf56f3c1e8adbfd0791391f43058f79f2e2ace40090be481b5bbe8db8a42c0f444fc7cc56666c5ca07c72 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-endpoints": 3.296.0 + tslib: ^2.5.0 + checksum: 7ae91b41d2a9ab6d016e749458c30eb99f7fc1b11093410e6e2b0f0258aba8269fd5e22a980eb54bcbf8456679bf65c7e76fbf5bb145a13ff7d31398a82821ae languageName: node linkType: hard -"@aws-sdk/node-config-provider@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/node-config-provider@npm:3.272.0" +"@aws-sdk/node-config-provider@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/node-config-provider@npm:3.296.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 57f1f107ae4e213ffedf648d46fe0e026af83b13eeb8c13bd8f812cbbb226a0b2c2793afec0e29165ee64cc948182499ad44fe62f63ac58b06d0dd2cab7f1461 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/shared-ini-file-loader": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 367dc07dffc8673d4c197773a023b79cbfb5dbd36ed02aeaa63ccd1a801e88164c2a042aadc51344198af3a6919db1d56302ce5e14ff8eaa7b9cf708bbbac2d9 languageName: node linkType: hard -"@aws-sdk/node-http-handler@npm:3.282.0, @aws-sdk/node-http-handler@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/node-http-handler@npm:3.282.0" +"@aws-sdk/node-http-handler@npm:3.296.0, @aws-sdk/node-http-handler@npm:^3.208.0": + version: 3.296.0 + resolution: "@aws-sdk/node-http-handler@npm:3.296.0" dependencies: - "@aws-sdk/abort-controller": 3.272.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/querystring-builder": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 22bbb8cae68c3405f3695de2a4be4d08ade5ffaad5367badcc40dc06ef08ec634fb95953deed58641775265d852f7afb095675d353cd7c82b7cb21881f5cc549 + "@aws-sdk/abort-controller": 3.296.0 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/querystring-builder": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 8766f46047f1667363a34433c9a867b4e5b27b400252418df2d5b110b6f85ff46a8aeff8b96132f7b39fc2bafa54fb1ae0e0fe44da84c8222349cea05cc7cc38 languageName: node linkType: hard -"@aws-sdk/property-provider@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/property-provider@npm:3.272.0" +"@aws-sdk/property-provider@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/property-provider@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 7f01794e93276e13339034dac816b2b5da2370fbc1ff304d451e2d0344957e94ba53f5c54de44eca4cb53e2847c7be820db25d6164ca9e489a4a39787fb6c8b3 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: b456e82002c8302b2ebe328446346381c6d34b63d64f797ffd5b24d9f5cb0d739127d21657587c76a351fa6f56f43585d66020df370ae64f7cd9718c26175fff languageName: node linkType: hard -"@aws-sdk/protocol-http@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/protocol-http@npm:3.208.0" +"@aws-sdk/protocol-http@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/protocol-http@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.208.0 - tslib: ^2.3.1 - checksum: 6cf57f264a4ef393fbe5fac71f22eaba47bc421646063dac004919ec7185979ed91a3e03c71373749150249f6be4ae41294a4c068d7c22a5990dcd2f5cf8347c + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: b283a1e6b6a6ba544bf833929d19f988747a451a1e1232f440b9412918932d099f29c0459dd398163b7f7bbae4c372166cc36a5e5afc1343d3085884e36879bc languageName: node linkType: hard -"@aws-sdk/protocol-http@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/protocol-http@npm:3.282.0" +"@aws-sdk/querystring-builder@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/querystring-builder@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 5f9d927a69cc1d51767df86d5bfa76f280866e3ef7bcfb8b7b8dab7fc11638ca92d20e3a8a2708a251748c15c0582ad032dfd89aada8ce6068c58605b193e555 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-uri-escape": 3.295.0 + tslib: ^2.5.0 + checksum: 54028a5087126cdf48cf7abf4cc12c5d761c30aa97b23bab001ae387179cd95974a9332aacc6a74936f3ce818067ded67383231d5839b0456c5ed326bcaeeac5 languageName: node linkType: hard -"@aws-sdk/querystring-builder@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/querystring-builder@npm:3.208.0" +"@aws-sdk/querystring-parser@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/querystring-parser@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.208.0 - "@aws-sdk/util-uri-escape": 3.201.0 - tslib: ^2.3.1 - checksum: 69ff07e2a05ae0979da4e5b12ffb223f0eb037fab079f1f4c245101fdb2d9244454a543dcc829120b882a99a63ecfc950f209ba5a1aaacf94432a35a214c2521 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: b60b003302b4823609f9f585acdc3b7e48444aeaaf941549626066a6a74579201b473cdaa0ab1d59e63c4c8eec5bc9380464ccfeca47077ec4b5bc20fea4b190 languageName: node linkType: hard -"@aws-sdk/querystring-builder@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/querystring-builder@npm:3.272.0" +"@aws-sdk/service-error-classification@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/service-error-classification@npm:3.296.0" + checksum: f4f53591c636971bb2766340137a4816619c8ede0955dff37f795f03a0ed18534042f3ab9ec898d9f3fba98309322854b7442caeb919590f241ac21b3b18de74 + languageName: node + linkType: hard + +"@aws-sdk/shared-ini-file-loader@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/shared-ini-file-loader@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-uri-escape": 3.201.0 - tslib: ^2.3.1 - checksum: 8164bb5547c556a2b3933b0a93d55d9f205ebe096f2dbcea6d3be4aa23bb0b4e7996ba24363b9ac3f80b4026903b267b759efdf9f72379f1eea9250c182238b9 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: a9e505957eefaedfa1c4ad09eea3d7bc5e4fab65ea40df4e46a1a2db6e461a63d4fc53c801be5d5bb189c634b157262154bf8840bacc02ecf0ffeaa10fb8b2b3 languageName: node linkType: hard -"@aws-sdk/querystring-parser@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/querystring-parser@npm:3.272.0" +"@aws-sdk/signature-v4-multi-region@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.299.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: fe5a29a265f48ad02b3161e888a66e4ac08fe07d52a67e811ac1da1734bfa9ac87ead637b595efcbc163f64f2280c8b56c867a8399f4c816b3683b6308837f93 - languageName: node - linkType: hard - -"@aws-sdk/service-error-classification@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/service-error-classification@npm:3.272.0" - checksum: 9507f74c909a968aa9bf835a05a9cfc93a0892e7c685de37da485e74a61b4fff271621d7c841aa0c9aedbcc57b19f171e6bc74925a82007be6c6750b3c7d0198 - languageName: node - linkType: hard - -"@aws-sdk/shared-ini-file-loader@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/shared-ini-file-loader@npm:3.272.0" - dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 1245658ad6efbeda0181aca64b00259749abc76d6200ac8fb481fe627eb88932a5cf2e9c366583ccba9fa540706a08b611552fff5233d66835c0e525c51f97c4 - languageName: node - linkType: hard - -"@aws-sdk/signature-v4-multi-region@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.282.0" - dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/signature-v4": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-arn-parser": 3.208.0 - tslib: ^2.3.1 + "@aws-sdk/protocol-http": 3.296.0 + "@aws-sdk/signature-v4": 3.299.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 peerDependencies: "@aws-sdk/signature-v4-crt": ^3.118.0 peerDependenciesMeta: "@aws-sdk/signature-v4-crt": optional: true - checksum: 3f25ba04145d9e274f5bea5ac34de77021c2a06d68085e29cd9bae3b0803aef53a0ab8b184034c67019b7b730730374a9e5a216859ee8f01c11032417ca84f7c + checksum: 6e1b20d4586ec02a30c272d978ddafc492cedee2e98853163f842e870cc3abe3ed4f4b9dd23bd8673841e0d64b58adc12fc5a21289ad6bcadf67e7d59bd1b400 languageName: node linkType: hard -"@aws-sdk/signature-v4@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/signature-v4@npm:3.282.0" +"@aws-sdk/signature-v4@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/signature-v4@npm:3.299.0" dependencies: - "@aws-sdk/is-array-buffer": 3.201.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-hex-encoding": 3.201.0 - "@aws-sdk/util-middleware": 3.272.0 - "@aws-sdk/util-uri-escape": 3.201.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: ef5a5f32c7671979c173cded5ca4749f3d4d156c67b7de11eac881a0141b2f43cc6ac5f29facd3e6af2a3883775de64d0c2789b2f7ccb1c6d14f0da5e22a58f0 + "@aws-sdk/is-array-buffer": 3.295.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-hex-encoding": 3.295.0 + "@aws-sdk/util-middleware": 3.296.0 + "@aws-sdk/util-uri-escape": 3.295.0 + "@aws-sdk/util-utf8": 3.295.0 + tslib: ^2.5.0 + checksum: 642e49ef1cb87649a0fdceb82c55f5153f9d662d5429d49fb18601c3ff8c12a1b050d8856fb18c041511be9d4d38fa741628c23f4be508cb816be696446139cd languageName: node linkType: hard -"@aws-sdk/smithy-client@npm:3.279.0": - version: 3.279.0 - resolution: "@aws-sdk/smithy-client@npm:3.279.0" +"@aws-sdk/smithy-client@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/smithy-client@npm:3.296.0" dependencies: - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 43d933b714ba7249d7f9f007e6e107d88d34e76db2cf934c43f38b6039699da450227f25bf559a3a6f12f9f62c4dec6dd5c4dda2205e6889e7d530521b879d61 + "@aws-sdk/middleware-stack": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 8b7a626c1fd8b253f1f5b365c340626a9495aa6ba83d246be50f559d8274259daa6386f6931c9db41d3250ee3fd9d2d63646f4f0d7c2f793fed5aa7c87593676 languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/token-providers@npm:3.282.0" +"@aws-sdk/token-providers@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/token-providers@npm:3.299.0" dependencies: - "@aws-sdk/client-sso-oidc": 3.282.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 064425ec0373269ccc7c4eeb583dd31e79b02af5e4c4ade25258cec59986dd3f8d4d80770d4802b26882dba9a61f66ca9d49d9ade70002417f73bdd46c64bace + "@aws-sdk/client-sso-oidc": 3.299.0 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/shared-ini-file-loader": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 37fac12eead196c717385511344a0125871a2a1a745ce85fc7c2cf086023aeb19ce9cd0c5289ba425cb7df1182d346f8c6c50087467243850c879b3d74dc4a17 languageName: node linkType: hard -"@aws-sdk/types@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/types@npm:3.208.0" - checksum: 3d4eb51720bd20b6811dece5e096ba3b59da842d1c8b2a8e2785e9931d916f41197651da689aa415083e1259e03507b7703ecbbac001b4cdbe68dde2ed94b5cf - languageName: node - linkType: hard - -"@aws-sdk/types@npm:3.272.0, @aws-sdk/types@npm:^3.208.0, @aws-sdk/types@npm:^3.222.0": - version: 3.272.0 - resolution: "@aws-sdk/types@npm:3.272.0" +"@aws-sdk/types@npm:3.296.0, @aws-sdk/types@npm:^3.208.0, @aws-sdk/types@npm:^3.222.0": + version: 3.296.0 + resolution: "@aws-sdk/types@npm:3.296.0" dependencies: - tslib: ^2.3.1 - checksum: c4e4f09dd2672eab4fc15b08006c730c1d07d4b54ae35e03167d99f6110751e36b5332165e03c71c28724037f623f8da87a45a018eb631a1ce86d406f9d08da6 + tslib: ^2.5.0 + checksum: 3cff062f8cb08cd5473c40076ca06f8d93c80fa11e64a7c2d8273fcc0107e709e08a669779f9e3e70d35b3ae7fc3abafd2885f74fa9f8ba57042e5167f72bd2a languageName: node linkType: hard -"@aws-sdk/url-parser@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/url-parser@npm:3.272.0" +"@aws-sdk/url-parser@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/url-parser@npm:3.296.0" dependencies: - "@aws-sdk/querystring-parser": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 4a66e733b336b0e28eceef89271f255dcd7079cfa8ba1c854e6c147ced211242e00016e3f22752e5ea3e49b35457568c5ae8df574f729d6e60cd1f5054f5a57d + "@aws-sdk/querystring-parser": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: eb76e25571d9d13f7a335f36dc5f7466a7d7e8a6e26a5a0ea2529cda36d0ad29d0d6c5d418ac8a81a53a480a57a1b8aced93a43a08060eb0fb8e4259ab2e5048 languageName: node linkType: hard -"@aws-sdk/util-arn-parser@npm:3.208.0, @aws-sdk/util-arn-parser@npm:^3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/util-arn-parser@npm:3.208.0" +"@aws-sdk/util-arn-parser@npm:3.295.0, @aws-sdk/util-arn-parser@npm:^3.208.0": + version: 3.295.0 + resolution: "@aws-sdk/util-arn-parser@npm:3.295.0" dependencies: - tslib: ^2.3.1 - checksum: 1e1793adc0c53801b9fd7ccb7e94169dcd984047533c28897aea2af4c4fa02cbc2cd1b5d9b6f34eaf6b9aaa0aba27f927c8e2a58a6b4bb06888cfa68d66b6b2d + tslib: ^2.5.0 + checksum: 207dadcd23efc318bd9c028157a302999403749722b3b9cd4f2701cf2fd4c7b588bbcede45d949f583c4e41bb4e66ca7df923f9d4123574744497c961cd1c673 languageName: node linkType: hard -"@aws-sdk/util-base64@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/util-base64@npm:3.208.0" +"@aws-sdk/util-base64@npm:3.295.0": + version: 3.295.0 + resolution: "@aws-sdk/util-base64@npm:3.295.0" dependencies: - "@aws-sdk/util-buffer-from": 3.208.0 - tslib: ^2.3.1 - checksum: 2ccab3453a3a3636f3f1397441574b3adb984e1ba3865030393108327ed7304cf80c9b31d69691e6aba85cfe6a611a881bbb724e544324240763bb4e96630ed9 + "@aws-sdk/util-buffer-from": 3.295.0 + tslib: ^2.5.0 + checksum: 047329e37dd6946f63b47ae415a988c32022b883b9fcf113120973b2d5e97679bc19f5183b264474f3201cb0560d3a4cb4b9d07d4d70b823945387e20869b41d languageName: node linkType: hard -"@aws-sdk/util-body-length-browser@npm:3.188.0": - version: 3.188.0 - resolution: "@aws-sdk/util-body-length-browser@npm:3.188.0" +"@aws-sdk/util-body-length-browser@npm:3.295.0": + version: 3.295.0 + resolution: "@aws-sdk/util-body-length-browser@npm:3.295.0" dependencies: - tslib: ^2.3.1 - checksum: 1b08bd1e63ec843ee336f51d894c49bf3c4c2f96e50d1711a12f7d0c5b6f7a15b490e366fec55b63e77036002994bac12927b29de2eb9ac91e4f152b1af78e58 + tslib: ^2.5.0 + checksum: 15100fa717f98a58475c934944108f98b811025039a04eeaaed71380bb2d4444fe44af7c527b74bb6ebd5a3ce277e28896d2e60ea73084f2b9e6cce6873b5592 languageName: node linkType: hard -"@aws-sdk/util-body-length-node@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/util-body-length-node@npm:3.208.0" +"@aws-sdk/util-body-length-node@npm:3.295.0": + version: 3.295.0 + resolution: "@aws-sdk/util-body-length-node@npm:3.295.0" dependencies: - tslib: ^2.3.1 - checksum: 986b42b358656dec4e75c231213331c4f01785f9ab17c8b87b6e268b6880818a96117f1785cef9786e6c0f7e2c1332c80e8388a43bfd83e8c7224ad059a72733 + tslib: ^2.5.0 + checksum: e44fa83139d0e7e61152cce8f7709e772c920996fbd3ae4acc545df75ea3f7f28fd2959c97029411802b3e12277f775f3e2dbb34c797369635d0881bcf6b0a12 languageName: node linkType: hard -"@aws-sdk/util-buffer-from@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/util-buffer-from@npm:3.208.0" +"@aws-sdk/util-buffer-from@npm:3.295.0": + version: 3.295.0 + resolution: "@aws-sdk/util-buffer-from@npm:3.295.0" dependencies: - "@aws-sdk/is-array-buffer": 3.201.0 - tslib: ^2.3.1 - checksum: 00bfa4d4494d3a1eb128e19104994d1aca8b3802e9aa218cecafb1ed3ff2ecf5c946485e06aa97ae312458842b0f31a6484dc945232f7cb0e357ba341cb2e53e + "@aws-sdk/is-array-buffer": 3.295.0 + tslib: ^2.5.0 + checksum: c93e6f0cf66927230588365995d0e94ee874857dae6753529f44ebd7f2d9c1bc6e8fdef0a6459bd96f0c29a2fdc9eaa35145102d074249f4e8ff8bb070708f24 languageName: node linkType: hard -"@aws-sdk/util-config-provider@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/util-config-provider@npm:3.208.0" +"@aws-sdk/util-config-provider@npm:3.295.0": + version: 3.295.0 + resolution: "@aws-sdk/util-config-provider@npm:3.295.0" dependencies: - tslib: ^2.3.1 - checksum: 97b0414b120b4eb53001f3ab2135ee94937e47bd7bd0d0de7c6a7e00a282eaa78cd84be2bfd3e389340f0c0b2f7ba60da9a403f084721970ee55b779ecf7a451 + tslib: ^2.5.0 + checksum: 2b6cd2b118465a36c9908dfc330f9f107a0a67cbde2293101af8b3ca0cb2d9f29f76394261880535d62da74b10cf89c5433a2d4524272d5b8776ad8085b0489b languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-browser@npm:3.279.0": - version: 3.279.0 - resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.279.0" +"@aws-sdk/util-defaults-mode-browser@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.296.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/types": 3.296.0 bowser: ^2.11.0 - tslib: ^2.3.1 - checksum: 727700ae9c741a24cb8d30991344d778ca5e9ec3ad30364a63f22af8889f03a5fedecad87c76b7022118ab2c6a3dfc48abd530502b7e1f0926bf467081189645 + tslib: ^2.5.0 + checksum: ae8c6b03d9de2fc9c320ae4aa65027604658aff95483d3eccdc87307e683da2c6943f863a98f74af7c7f9cae74d0b1df7e6f83592cd0b5eff0ff8eba48fca127 languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-node@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/util-defaults-mode-node@npm:3.282.0" +"@aws-sdk/util-defaults-mode-node@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/util-defaults-mode-node@npm:3.299.0" dependencies: - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/credential-provider-imds": 3.272.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 56086b64a65f9999923bbba56c87ecdb886cc729d32683107ae3dd8c9077b6aceecdf2acfc934220522883282f03dd6e37690d242a2d63fee3ec7f3db39cecb7 + "@aws-sdk/config-resolver": 3.299.0 + "@aws-sdk/credential-provider-imds": 3.296.0 + "@aws-sdk/node-config-provider": 3.296.0 + "@aws-sdk/property-provider": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: f0a30f8a58a5f92ea8ee6bc0239f635f318f16b3cf00ef00ce622715a267c598f55791532bd845070344f35d4ba7e8b6063ecb7bc76caac3c2eb90cca3150657 languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-endpoints@npm:3.272.0" +"@aws-sdk/util-endpoints@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/util-endpoints@npm:3.296.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: d701e0245930df2000974f9d7c8398fde65924fe5aaa72f2c314fa40a8842e1868a6e285aa78479f741e40b8be54060a4607c9b5b3ac0386839a45df8df238f2 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 9ff3b1c39123e8a88c2dcc1e81757f99cfd787be2039b9172e6a1a8b48b04d78712c2082dd1762e41b8b0a6c2f8d79aa06c571ea7ee622351634e5c40a069643 languageName: node linkType: hard -"@aws-sdk/util-hex-encoding@npm:3.201.0": - version: 3.201.0 - resolution: "@aws-sdk/util-hex-encoding@npm:3.201.0" +"@aws-sdk/util-hex-encoding@npm:3.295.0": + version: 3.295.0 + resolution: "@aws-sdk/util-hex-encoding@npm:3.295.0" dependencies: - tslib: ^2.3.1 - checksum: a27f3365dfb1e6ece79ea34fd6e2c4540eb0084536d7300ff0ff42a7334ddf07f21958c6cfd0bbeb71361ee408e16deae2c82b7c7378b048b8e81a52c75f190a + tslib: ^2.5.0 + checksum: 4b85f087de5c2a8317ff13df4947e355b4c4acae1dd283133e53139457252fb83951194c85e07b89a1e12cecec1b3c0dbd11b7d0f9f2a7775d8c6d3d9c21371e languageName: node linkType: hard @@ -1497,93 +1553,88 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-middleware@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-middleware@npm:3.272.0" +"@aws-sdk/util-middleware@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/util-middleware@npm:3.296.0" dependencies: - tslib: ^2.3.1 - checksum: e9a0b55317c474d3eecd65765443eff68f5130ac6f982a41450e0cb949169ff2cf13273282337f2067dfdb5cc7d25137b3bd2fa5f5228cfe541003cf387a6101 + tslib: ^2.5.0 + checksum: 9743a6279208cdb25fc6a5d5800477dfa7f10c25e65cfcb7e0721613c0640df21bef7fe6cb18f27ee3ff470c0be2ff06cb6afdefe234d418c7ac17d9a3563301 languageName: node linkType: hard -"@aws-sdk/util-retry@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-retry@npm:3.272.0" +"@aws-sdk/util-retry@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/util-retry@npm:3.296.0" dependencies: - "@aws-sdk/service-error-classification": 3.272.0 - tslib: ^2.3.1 - checksum: 7449d9b5daef1244a1601c9892bdd57abeb71ee87357e9dac71d53a77b80648b8cd0db1e99749a76e241ab01fce71a753360d0c8e130f6ae6e71a94b462242f0 + "@aws-sdk/service-error-classification": 3.296.0 + tslib: ^2.5.0 + checksum: f225fc4eb0933eda3df069d2b0028d8eed76be9b7b871b7bf601c4f5f17012ebb6ebb194df26fc141c9e77bad86d5cbdb79113fe5624d3c2c9d3441f96f580b3 languageName: node linkType: hard -"@aws-sdk/util-stream-browser@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/util-stream-browser@npm:3.282.0" +"@aws-sdk/util-stream-browser@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/util-stream-browser@npm:3.296.0" dependencies: - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-hex-encoding": 3.201.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: 30dda128249c30052cc7d92fbc08c423d03938c202bd95ffcbeb0b72804da19defe742ca702062fd96803381bb508cedc27b4b4bf4d418175f905849352fdf71 + "@aws-sdk/fetch-http-handler": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-base64": 3.295.0 + "@aws-sdk/util-hex-encoding": 3.295.0 + "@aws-sdk/util-utf8": 3.295.0 + tslib: ^2.5.0 + checksum: 52d0fd8919a9990eeaa0207d1c91396414ee5015684b0d6279f0ec250c6a32e5daf3fec6bb1bb0830901d873997c0c5a66f8c7721cec7bdc0dc828df56f41262 languageName: node linkType: hard -"@aws-sdk/util-stream-node@npm:3.282.0, @aws-sdk/util-stream-node@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/util-stream-node@npm:3.282.0" +"@aws-sdk/util-stream-node@npm:3.296.0, @aws-sdk/util-stream-node@npm:^3.208.0": + version: 3.296.0 + resolution: "@aws-sdk/util-stream-node@npm:3.296.0" dependencies: - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-buffer-from": 3.208.0 - tslib: ^2.3.1 - checksum: 0b19609d0c2608c120e317b6127a49016c90f746e38c300893ee16e276951c294fd4fef8dbee42978e655f34c2c56676e8def637fdb5a3f9284c475c73a67f62 + "@aws-sdk/node-http-handler": 3.296.0 + "@aws-sdk/types": 3.296.0 + "@aws-sdk/util-buffer-from": 3.295.0 + tslib: ^2.5.0 + checksum: b1e4a196be6f24c2c652d22d405ce3238769fd64267c157e480309b18531d693cae0c49ade10869b1f0f0fc4b7d5c2835fdd51562c434a09774d4606ee652606 languageName: node linkType: hard -"@aws-sdk/util-uri-escape@npm:3.201.0": - version: 3.201.0 - resolution: "@aws-sdk/util-uri-escape@npm:3.201.0" +"@aws-sdk/util-uri-escape@npm:3.295.0": + version: 3.295.0 + resolution: "@aws-sdk/util-uri-escape@npm:3.295.0" dependencies: - "@aws-sdk/fetch-http-handler": 3.208.0 - "@aws-sdk/types": 3.208.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-hex-encoding": 3.201.0 - "@aws-sdk/util-utf8-browser": 3.188.0 - tslib: ^2.3.1 - checksum: 8bd751459eaab75a9b61801f3484cfa5c4e0133381ace6ec901cb9b92b1fee99beb4ef9c0f87ade59425a882ed3a280255d9b2fd8da6a6286e49efb9af8f0d55 + tslib: ^2.5.0 + checksum: 2334baedd339161aa2fb6ae880c04730b072a217ed42b40aa0c0df526aba5a663302da50ba550ad657a4b3cf44070696d91501bf2ba33722f452247f5c2d0fde languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.282.0" +"@aws-sdk/util-user-agent-browser@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.299.0" dependencies: - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.296.0 bowser: ^2.11.0 - tslib: ^2.3.1 - checksum: cf751b285e57c4d7a00584ac4eab4c27c5fc6d73dc9d6ed8082d297885b262a27bc0a51b882e57779eb807149c27b4d083e07596b99ae145c9acb46f64edf587 + tslib: ^2.5.0 + checksum: 60ebb1c0f5de624c212f00641fdcc8b667dac6442413d0d882745b660f72a6d1107cd6b04e7a5eee4013f0444b9fedfe151317937ac1f7d333dd3feeefa027b0 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.282.0" +"@aws-sdk/util-user-agent-node@npm:3.299.0": + version: 3.299.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.299.0" dependencies: - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 + "@aws-sdk/node-config-provider": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: b13d7e114610c15d0d4d6137e6b6e2ce2d9b696aec1f3ba60515228b9c59068260fb976a0af2d9166705e00c99408c603abf4ebc65384bcd76abfa9003a4afa4 + checksum: 50bfcaf9bc0ee6f0ca87bfbcbacf10394631d62dba508f0b43b7c3cf2a6febe75ca1160e18d0abc96caddb0608504ab7ceb4a92078184764669a935db1af7cf8 languageName: node linkType: hard -"@aws-sdk/util-utf8-browser@npm:3.188.0, @aws-sdk/util-utf8-browser@npm:^3.0.0": +"@aws-sdk/util-utf8-browser@npm:^3.0.0": version: 3.188.0 resolution: "@aws-sdk/util-utf8-browser@npm:3.188.0" dependencies: @@ -1592,33 +1643,33 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-utf8@npm:3.254.0": - version: 3.254.0 - resolution: "@aws-sdk/util-utf8@npm:3.254.0" +"@aws-sdk/util-utf8@npm:3.295.0": + version: 3.295.0 + resolution: "@aws-sdk/util-utf8@npm:3.295.0" dependencies: - "@aws-sdk/util-buffer-from": 3.208.0 - tslib: ^2.3.1 - checksum: e5dfe7565f2de32245a544d1d715d803025bc5522538c0206fa61377f747804d95fc2e5e25976144bb63a6857e360b4286d101e730ab5d39866c60383a47e7d5 + "@aws-sdk/util-buffer-from": 3.295.0 + tslib: ^2.5.0 + checksum: 098058651aa48bb2a6652ea6a1a0a1520e9964a91920e67eed023eacc0956b75475d25025e888ee193140aa800ed89faafa67653914b78c7ffb98e8f96f6d54c languageName: node linkType: hard -"@aws-sdk/util-waiter@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-waiter@npm:3.272.0" +"@aws-sdk/util-waiter@npm:3.296.0": + version: 3.296.0 + resolution: "@aws-sdk/util-waiter@npm:3.296.0" dependencies: - "@aws-sdk/abort-controller": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: e931a9359dc582db9e5dcd62539572aecff5320ce424e5462c2f8d4a2d83acde07f87fe9ffc83850aaf70eaf17b06b6ffd4554350bab0f0f3a4427d1b7e776c6 + "@aws-sdk/abort-controller": 3.296.0 + "@aws-sdk/types": 3.296.0 + tslib: ^2.5.0 + checksum: 9984297149735df1791791c2f02077bab47501113393efbef619f6af9d19fb1c44a6ac79be73dbc6725a9eb3343b77c04068dcdc0797ddc7da7b9f93df810d7c languageName: node linkType: hard -"@aws-sdk/xml-builder@npm:3.201.0": - version: 3.201.0 - resolution: "@aws-sdk/xml-builder@npm:3.201.0" +"@aws-sdk/xml-builder@npm:3.295.0": + version: 3.295.0 + resolution: "@aws-sdk/xml-builder@npm:3.295.0" dependencies: - tslib: ^2.3.1 - checksum: fd250c2edcf062e79af576fa39d555f624c155540f7bb27da05a400540f3c2ceb89f33841157eda5f4558a0b6c58d2686a105d26f79eeab5790e6b6bfbe18d4a + tslib: ^2.5.0 + checksum: a32bcea43104c049b995c967ea416887fac45da8a8ecf55f06836a08aff878683c702852b383a36c04a09368ebb091388169f46f0d0a49cf477392966b4bdbdd languageName: node linkType: hard @@ -3281,13 +3332,13 @@ __metadata: languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.11.2, @babel/runtime-corejs3@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/runtime-corejs3@npm:7.18.9" +"@babel/runtime-corejs3@npm:^7.18.9, @babel/runtime-corejs3@npm:^7.20.13, @babel/runtime-corejs3@npm:^7.20.7": + version: 7.21.0 + resolution: "@babel/runtime-corejs3@npm:7.21.0" dependencies: - core-js-pure: ^3.20.2 - regenerator-runtime: ^0.13.4 - checksum: 249158b660ac996fa4f4b0d1ab5810db060af40fac4d0bb5da23f55539a151313ae254aa64afc2ab7000d95167824e21a689f74bc24b36fd0f5ca030d522133d + core-js-pure: ^3.25.1 + regenerator-runtime: ^0.13.11 + checksum: a47927671672b1e1644771458f804e03802303eeffcafd55f85cb121d3d3ca33032cc2fe68e086e3de6923049343d0aa599fc3eb3ad5749e30646e2a2ef6f11d languageName: node linkType: hard @@ -3565,7 +3616,7 @@ __metadata: uuid: ^8.0.0 wait-for-expect: ^3.0.2 winston: ^3.2.1 - zod: ~3.18.0 + zod: ^3.21.4 languageName: unknown linkType: soft @@ -3593,18 +3644,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-client@npm:^1.3.1": - version: 1.3.1 - resolution: "@backstage/catalog-client@npm:1.3.1" - dependencies: - "@backstage/catalog-model": ^1.2.0 - "@backstage/errors": ^1.1.4 - cross-fetch: ^3.1.5 - checksum: e2e0050d93f509fbaed40d89228ce9af7c9f32372c721d5faea29ef312e488cbfc1426959f39d61790d41406fbd6bc895bed2c3427bbdf6cab6a412f449c2efe - languageName: node - linkType: hard - -"@backstage/catalog-client@workspace:^, @backstage/catalog-client@workspace:packages/catalog-client": +"@backstage/catalog-client@^1.4.0, @backstage/catalog-client@workspace:^, @backstage/catalog-client@workspace:packages/catalog-client": version: 0.0.0-use.local resolution: "@backstage/catalog-client@workspace:packages/catalog-client" dependencies: @@ -3616,22 +3656,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@npm:^1.1.3, @backstage/catalog-model@npm:^1.1.5, @backstage/catalog-model@npm:^1.2.0": - version: 1.2.0 - resolution: "@backstage/catalog-model@npm:1.2.0" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/errors": ^1.1.4 - "@backstage/types": ^1.0.2 - ajv: ^8.10.0 - json-schema: ^0.4.0 - lodash: ^4.17.21 - uuid: ^8.0.0 - checksum: d4e07e91e501b4ecbc9d0b754518277dd2ed93f22f801740cc539dbcbd905ba8111b1651d20fb725e44d7cd99a96faec6fd56cd51fdf8e1d7f39a6e177f31efa - languageName: node - linkType: hard - -"@backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": +"@backstage/catalog-model@^1.1.5, @backstage/catalog-model@^1.2.1, @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: @@ -3678,6 +3703,7 @@ __metadata: "@backstage/types": "workspace:^" "@esbuild-kit/cjs-loader": ^2.4.1 "@manypkg/get-packages": ^1.1.3 + "@octokit/oauth-app": ^4.2.0 "@octokit/request": ^6.0.0 "@pmmmwh/react-refresh-webpack-plugin": ^0.5.7 "@rollup/plugin-commonjs": ^23.0.0 @@ -3788,7 +3814,7 @@ __metadata: yaml: ^2.0.0 yml-loader: ^2.1.0 yn: ^4.0.0 - zod: ~3.18.0 + zod: ^3.21.4 peerDependencies: "@microsoft/api-extractor": ^7.21.2 peerDependenciesMeta: @@ -3846,17 +3872,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/config@npm:^1.0.4, @backstage/config@npm:^1.0.6": - version: 1.0.6 - resolution: "@backstage/config@npm:1.0.6" - dependencies: - "@backstage/types": ^1.0.2 - lodash: ^4.17.21 - checksum: 5cd2b409237091eb523a61c11df49c183ad1548dce90df343c9b0204eec7147508f41c832f931f82783c458ccdcc9d9fb73511cdd373fdb023db67bc738fcc67 - languageName: node - linkType: hard - -"@backstage/config@workspace:^, @backstage/config@workspace:packages/config": +"@backstage/config@^1.0.6, @backstage/config@^1.0.7, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": version: 0.0.0-use.local resolution: "@backstage/config@workspace:packages/config" dependencies: @@ -3894,7 +3910,7 @@ __metadata: react-router-stable: "npm:react-router@^6.3.0" react-use: ^17.2.4 zen-observable: ^0.10.0 - zod: ~3.18.0 + zod: ^3.21.4 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 @@ -3902,14 +3918,14 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@npm:^0.12.0, @backstage/core-components@npm:^0.12.3, @backstage/core-components@npm:^0.12.4": - version: 0.12.4 - resolution: "@backstage/core-components@npm:0.12.4" +"@backstage/core-components@npm:^0.12.3, @backstage/core-components@npm:^0.12.5": + version: 0.12.5 + resolution: "@backstage/core-components@npm:0.12.5" dependencies: - "@backstage/config": ^1.0.6 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/errors": ^1.1.4 - "@backstage/theme": ^0.2.17 + "@backstage/config": ^1.0.7 + "@backstage/core-plugin-api": ^1.5.0 + "@backstage/errors": ^1.1.5 + "@backstage/theme": ^0.2.18 "@backstage/version-bridge": ^1.0.3 "@material-table/core": ^3.1.0 "@material-ui/core": ^4.12.2 @@ -3948,7 +3964,7 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 476160ad54a399e7393bb70fc34fc01b69519431606797fdecc974d5e826315527d8ab71af5dd4d1c8d88bfe797aa37e781fd5fd31d8293c19982704e4f7cfdc + checksum: 8308c1b90247911f6cf22963b530cef169287f508ff29d159d0c83758134dd43bd5acd2113350690a46a02246bc05dca975bcc38325000aefb1c93c80e2f19c7 languageName: node linkType: hard @@ -3967,7 +3983,7 @@ __metadata: "@material-table/core": ^3.1.0 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^20.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -4014,7 +4030,7 @@ __metadata: react-window: ^1.8.6 remark-gfm: ^3.0.1 zen-observable: ^0.10.0 - zod: ~3.18.0 + zod: ^3.21.4 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 @@ -4023,25 +4039,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@npm:^1.1.0, @backstage/core-plugin-api@npm:^1.3.0, @backstage/core-plugin-api@npm:^1.4.0": - version: 1.4.0 - resolution: "@backstage/core-plugin-api@npm:1.4.0" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/types": ^1.0.2 - "@backstage/version-bridge": ^1.0.3 - history: ^5.0.0 - prop-types: ^15.7.2 - zen-observable: ^0.10.0 - peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 046d0fcb52b3110d6a926eeaf766486c753c2eeca70f7897f4ded45e0cf7da8591ec7df337433427bc50de7193e7a6d875356a027a8d1733fa07d87509e561a1 - languageName: node - linkType: hard - -"@backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@^1.3.0, @backstage/core-plugin-api@^1.5.0, @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: @@ -4126,18 +4124,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/errors@npm:^1.1.4": - version: 1.1.4 - resolution: "@backstage/errors@npm:1.1.4" - dependencies: - "@backstage/types": ^1.0.2 - cross-fetch: ^3.1.5 - serialize-error: ^8.0.1 - checksum: 1f0915a29fbeeff0e7fb82f1b4858248d99e9fa6a1aec65d617a241fab812f7939ec418ef0751370833753a2ee2c989463c5e26b40d7ea6aa297e5b6aee96584 - languageName: node - linkType: hard - -"@backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": +"@backstage/errors@^1.1.5, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@backstage/errors@workspace:packages/errors" dependencies: @@ -4178,22 +4165,22 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@npm:^1.1.10": - version: 1.1.10 - resolution: "@backstage/integration-react@npm:1.1.10" +"@backstage/integration-react@npm:^1.1.11": + version: 1.1.11 + resolution: "@backstage/integration-react@npm:1.1.11" dependencies: - "@backstage/config": ^1.0.6 - "@backstage/core-components": ^0.12.4 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/integration": ^1.4.2 - "@backstage/theme": ^0.2.17 + "@backstage/config": ^1.0.7 + "@backstage/core-components": ^0.12.5 + "@backstage/core-plugin-api": ^1.5.0 + "@backstage/integration": ^1.4.3 + "@backstage/theme": ^0.2.18 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.57 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 - checksum: 248e11c74fed7fb6d5fcc9cf7f7d7baffe94a6a4091aff60afc46c797b08a63486baaffe32812c237e29e3cb295d429b1cd740ca704b43b7dc4704a910184716 + checksum: ea3946236486a4d36c7851cf2f6562eacf10da00923cd7d51bb1f50e60bba766008745fd431ec26de9843cf5acc8fd6b3ba7a654e4e43a815f6d02151eeee235 languageName: node linkType: hard @@ -4211,7 +4198,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -4224,23 +4211,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration@npm:^1.4.2": - version: 1.4.2 - resolution: "@backstage/integration@npm:1.4.2" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/errors": ^1.1.4 - "@octokit/auth-app": ^4.0.0 - "@octokit/rest": ^19.0.3 - cross-fetch: ^3.1.5 - git-url-parse: ^13.0.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - checksum: b1fceb1c7d08d1db29529d1ba1d661019e9829dec8a004414fedc5ceec13b7087a1bdc7f4839e8e818f3386dc93aa94d74e8b65f9be75330a28b34305374126c - languageName: node - linkType: hard - -"@backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": +"@backstage/integration@^1.4.3, @backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": version: 0.0.0-use.local resolution: "@backstage/integration@workspace:packages/integration" dependencies: @@ -4318,7 +4289,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -4371,7 +4342,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -4400,7 +4371,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -4428,7 +4399,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -4454,7 +4425,7 @@ __metadata: "@backstage/test-utils": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -4498,7 +4469,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -4533,7 +4504,6 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": ^4.0.0-alpha.57 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -4710,7 +4680,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -4772,7 +4742,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -4824,7 +4794,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -4875,7 +4845,7 @@ __metadata: "@date-io/luxon": 1.x "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/pickers": ^3.3.10 "@testing-library/jest-dom": ^5.10.1 cross-fetch: ^3.1.5 @@ -4916,7 +4886,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -5182,6 +5152,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" "@types/ldapjs": ^2.2.0 @@ -5205,6 +5176,7 @@ __metadata: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@microsoft/microsoft-graph-types": ^2.6.0 "@types/lodash": ^4.14.151 @@ -5232,6 +5204,7 @@ __metadata: "@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 @@ -5282,6 +5255,7 @@ __metadata: "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-permission-node": "workspace:^" "@backstage/plugin-scaffolder-common": "workspace:^" + "@backstage/plugin-search-backend-module-catalog": "workspace:^" "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-search-common": "workspace:^" "@backstage/types": "workspace:^" @@ -5315,22 +5289,11 @@ __metadata: winston: ^3.2.1 yaml: ^2.0.0 yn: ^4.0.0 - zod: ~3.18.0 + zod: ^3.21.4 languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@npm:^1.0.11, @backstage/plugin-catalog-common@npm:^1.0.8": - version: 1.0.11 - resolution: "@backstage/plugin-catalog-common@npm:1.0.11" - dependencies: - "@backstage/catalog-model": ^1.2.0 - "@backstage/plugin-permission-common": ^0.7.3 - "@backstage/plugin-search-common": ^1.2.1 - checksum: e0e37a96b4d97230c590fc4f1e17f252167a3cbbc79533c7e29a26d3480e82435c57ae6f7952aaf694bd8dc22245410c9fd29853249b1b73ed3a009dd49bce6b - languageName: node - linkType: hard - -"@backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": +"@backstage/plugin-catalog-common@^1.0.10, @backstage/plugin-catalog-common@^1.0.12, @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: @@ -5359,7 +5322,7 @@ __metadata: "@backstage/types": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -5380,6 +5343,8 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-graphql@workspace:plugins/catalog-graphql" dependencies: + "@apollo/client": ^3.0.0 + "@apollo/server": ^4.0.0 "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" @@ -5390,7 +5355,6 @@ __metadata: "@graphql-codegen/typescript": ^3.0.0 "@graphql-codegen/typescript-resolvers": ^3.0.0 "@graphql-tools/schema": ^9.0.0 - apollo-server: ^3.0.0 graphql: ^16.0.0 graphql-modules: ^2.0.0 graphql-tag: ^2.11.0 @@ -5421,7 +5385,7 @@ __metadata: "@backstage/test-utils": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -5458,20 +5422,20 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@npm:^1.2.1, @backstage/plugin-catalog-react@npm:^1.2.4, @backstage/plugin-catalog-react@npm:^1.3.0": - version: 1.3.0 - resolution: "@backstage/plugin-catalog-react@npm:1.3.0" +"@backstage/plugin-catalog-react@npm:^1.2.4, @backstage/plugin-catalog-react@npm:^1.4.0": + version: 1.4.0 + resolution: "@backstage/plugin-catalog-react@npm:1.4.0" dependencies: - "@backstage/catalog-client": ^1.3.1 - "@backstage/catalog-model": ^1.2.0 - "@backstage/core-components": ^0.12.4 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/errors": ^1.1.4 - "@backstage/integration": ^1.4.2 - "@backstage/plugin-catalog-common": ^1.0.11 - "@backstage/plugin-permission-common": ^0.7.3 - "@backstage/plugin-permission-react": ^0.4.10 - "@backstage/theme": ^0.2.17 + "@backstage/catalog-client": ^1.4.0 + "@backstage/catalog-model": ^1.2.1 + "@backstage/core-components": ^0.12.5 + "@backstage/core-plugin-api": ^1.5.0 + "@backstage/errors": ^1.1.5 + "@backstage/integration": ^1.4.3 + "@backstage/plugin-catalog-common": ^1.0.12 + "@backstage/plugin-permission-common": ^0.7.4 + "@backstage/plugin-permission-react": ^0.4.11 + "@backstage/theme": ^0.2.18 "@backstage/types": ^1.0.2 "@backstage/version-bridge": ^1.0.3 "@material-ui/core": ^4.12.2 @@ -5489,7 +5453,7 @@ __metadata: "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 03cd5a270154c0cde63bd33104d11ba5811690205c697441f207606d961935f5c45ad2a8e17f591c5ac8b294601c1855852bac35ccb30125e2ab6df13daf82d2 + checksum: 40af3a97f3f8fd87b8bb8dcde2e54e47937be9e1fc0872df7d767d0e6caf6271293fd8160899c1adb7d19599de204255c1b2652cf04e0126d2db29af22321abc languageName: node linkType: hard @@ -5515,7 +5479,7 @@ __metadata: "@backstage/version-bridge": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -5562,7 +5526,7 @@ __metadata: "@backstage/types": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -5606,7 +5570,7 @@ __metadata: "@date-io/luxon": ^1.3.13 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/pickers": ^3.3.10 "@types/luxon": ^3.0.0 "@types/react": ^16.13.1 || ^17.0.0 @@ -5636,7 +5600,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -5670,7 +5634,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -5700,7 +5664,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -5762,7 +5726,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/styles": ^4.11.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -5797,7 +5761,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": ^4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -5828,7 +5792,7 @@ __metadata: "@backstage/types": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -5868,7 +5832,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/styles": ^4.9.6 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -5911,7 +5875,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -5975,7 +5939,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.9.13 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.1 @@ -6012,7 +5976,7 @@ __metadata: "@codemirror/view": ^6.0.0 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": ^4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^20.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -6168,6 +6132,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/plugin-explore-common": "workspace:^" + "@backstage/plugin-search-backend-module-explore": "workspace:^" "@backstage/plugin-search-common": "workspace:^" "@types/express": "*" "@types/supertest": ^2.0.8 @@ -6229,7 +6194,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -6249,6 +6214,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-firehydrant@workspace:plugins/firehydrant" dependencies: + "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/core-app-api": "workspace:^" "@backstage/core-components": "workspace:^" @@ -6259,7 +6225,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -6289,7 +6255,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -6318,7 +6284,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@maxim_mazurok/gapi.client.calendar": ^3.0.20220408 "@tanstack/react-query": ^4.1.3 "@testing-library/jest-dom": ^5.10.1 @@ -6353,7 +6319,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^20.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -6381,7 +6347,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -6418,7 +6384,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -6452,7 +6418,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@octokit/graphql": ^5.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -6484,7 +6450,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.4 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": ^4.0.0-alpha.61 + "@material-ui/lab": 4.0.0-alpha.61 "@spotify/prettier-config": ^14.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -6516,7 +6482,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -6539,6 +6505,7 @@ __metadata: resolution: "@backstage/plugin-gitops-profiles@workspace:plugins/gitops-profiles" dependencies: "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" "@backstage/core-app-api": "workspace:^" "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" @@ -6547,7 +6514,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -6577,7 +6544,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -6608,7 +6575,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -6630,6 +6597,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-graphql-backend@workspace:plugins/graphql-backend" dependencies: + "@apollo/server": ^4.0.0 "@backstage/backend-common": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" @@ -6637,8 +6605,6 @@ __metadata: "@graphql-tools/schema": ^9.0.0 "@types/express": ^4.17.6 "@types/supertest": ^2.0.8 - apollo-server: ^3.0.0 - apollo-server-express: ^3.0.0 express: ^4.17.1 express-promise-router: ^4.1.0 graphql: ^16.0.0 @@ -6665,7 +6631,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -6679,16 +6645,16 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-home@npm:^0.4.30": - version: 0.4.31 - resolution: "@backstage/plugin-home@npm:0.4.31" +"@backstage/plugin-home@npm:^0.4.32": + version: 0.4.32 + resolution: "@backstage/plugin-home@npm:0.4.32" dependencies: - "@backstage/catalog-model": ^1.2.0 - "@backstage/config": ^1.0.6 - "@backstage/core-components": ^0.12.4 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/plugin-catalog-react": ^1.3.0 - "@backstage/theme": ^0.2.17 + "@backstage/catalog-model": ^1.2.1 + "@backstage/config": ^1.0.7 + "@backstage/core-components": ^0.12.5 + "@backstage/core-plugin-api": ^1.5.0 + "@backstage/plugin-catalog-react": ^1.4.0 + "@backstage/theme": ^0.2.18 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.57 @@ -6698,7 +6664,7 @@ __metadata: "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 2ba5d377713540a4f9ab7083bc1595361678b59c80d57f26f2fe0bd660ec77926a6bfdeb52a2c6179e809e5186360333ae1bb41f51e741c4bdb7fc3edfda60c3 + checksum: 24e4b880be179b940098ab636333218200d26dbea249c883dc27b4e209bbec9ae74970d11340833c668dbd05d978a354be771d15dba96a105267365321f1db57 languageName: node linkType: hard @@ -6718,7 +6684,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -6751,7 +6717,7 @@ __metadata: "@date-io/luxon": 1.x "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/pickers": ^3.3.10 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -6820,7 +6786,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -6875,7 +6841,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -6905,6 +6871,8 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-kubernetes-common": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-permission-node": "workspace:^" "@google-cloud/container": ^4.0.0 "@jest-mock/express": ^2.0.1 "@kubernetes/client-node": 0.18.1 @@ -6941,6 +6909,7 @@ __metadata: dependencies: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" "@kubernetes/client-node": 0.18.1 languageName: unknown linkType: soft @@ -6963,7 +6932,7 @@ __metadata: "@kubernetes/client-node": 0.18.1 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7025,7 +6994,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7097,7 +7066,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.9.13 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": ^4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -7158,7 +7127,7 @@ __metadata: "@backstage/plugin-catalog-react": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 @@ -7181,7 +7150,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -7209,7 +7178,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.9.13 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -7238,7 +7207,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": ^4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -7267,7 +7236,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -7300,7 +7269,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -7353,7 +7322,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -7392,25 +7361,11 @@ __metadata: supertest: ^6.1.6 winston: ^3.2.1 yn: ^4.0.0 - zod: ~3.18.0 + zod: ^3.21.4 languageName: unknown linkType: soft -"@backstage/plugin-permission-common@npm:^0.7.3": - version: 0.7.3 - resolution: "@backstage/plugin-permission-common@npm:0.7.3" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/errors": ^1.1.4 - "@backstage/types": ^1.0.2 - cross-fetch: ^3.1.5 - uuid: ^8.0.0 - zod: ~3.18.0 - checksum: b3aa1e4a487ec7c4edd20c60bc216ee54841431e8e932fa9778c72f13dfa369044186f9afbf44316a9017e9bca0ffa774bbec7847711f04557981fb7cd6af080 - languageName: node - linkType: hard - -"@backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": +"@backstage/plugin-permission-common@^0.7.4, @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: @@ -7421,7 +7376,7 @@ __metadata: cross-fetch: ^3.1.5 msw: ^1.0.0 uuid: ^8.0.0 - zod: ~3.18.0 + zod: ^3.21.4 languageName: unknown linkType: soft @@ -7442,30 +7397,12 @@ __metadata: express-promise-router: ^4.1.0 msw: ^1.0.0 supertest: ^6.1.3 - zod: ~3.18.0 - zod-to-json-schema: ~3.18.0 + zod: ^3.21.4 + zod-to-json-schema: ^3.20.4 languageName: unknown linkType: soft -"@backstage/plugin-permission-react@npm:^0.4.10": - version: 0.4.10 - resolution: "@backstage/plugin-permission-react@npm:0.4.10" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/plugin-permission-common": ^0.7.3 - cross-fetch: ^3.1.5 - react-use: ^17.2.4 - swr: ^2.0.0 - peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: f7a82648a31a8fe9873492abdbcc524549205e3fd11fe144ab225e6263ce2b2e46abd642e6c370d692d424c51e7c55b9259d8178500f9bfbfc9267d09596843c - languageName: node - linkType: hard - -"@backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": +"@backstage/plugin-permission-react@^0.4.11, @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: @@ -7512,7 +7449,7 @@ __metadata: uuid: ^8.2.0 winston: ^3.2.1 yn: ^4.0.0 - zod: ~3.18.0 + zod: ^3.21.4 languageName: unknown linkType: soft @@ -7546,7 +7483,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": ^4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7633,7 +7570,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7651,6 +7588,29 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdown": + version: 0.0.0-use.local + resolution: "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdown" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/errors": "workspace:^" + "@backstage/integration": "workspace:^" + "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/plugin-scaffolder-node": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@backstage/types": "workspace:^" + fs-extra: 10.1.0 + git-url-parse: ^13.1.0 + mock-fs: ^5.2.0 + msw: ^1.0.0 + node-fetch: ^2.6.7 + node-html-markdown: ^1.3.0 + yaml: ^2.0.0 + languageName: unknown + linkType: soft + "@backstage/plugin-scaffolder-backend-module-cookiecutter@workspace:plugins/scaffolder-backend-module-cookiecutter": version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-cookiecutter@workspace:plugins/scaffolder-backend-module-cookiecutter" @@ -7675,6 +7635,21 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-scaffolder-backend-module-gitlab@workspace:plugins/scaffolder-backend-module-gitlab": + version: 0.0.0-use.local + resolution: "@backstage/plugin-scaffolder-backend-module-gitlab@workspace:plugins/scaffolder-backend-module-gitlab" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/core-app-api": "workspace:^" + "@backstage/errors": "workspace:^" + "@backstage/integration": "workspace:^" + "@backstage/plugin-scaffolder-node": "workspace:^" + "@gitbeaker/node": ^35.8.0 + languageName: unknown + linkType: soft + "@backstage/plugin-scaffolder-backend-module-rails@workspace:^, @backstage/plugin-scaffolder-backend-module-rails@workspace:plugins/scaffolder-backend-module-rails": version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-rails@workspace:plugins/scaffolder-backend-module-rails" @@ -7739,7 +7714,10 @@ __metadata: "@backstage/integration": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-permission-node": "workspace:^" "@backstage/plugin-scaffolder-common": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/types": "workspace:^" @@ -7750,6 +7728,7 @@ __metadata: "@types/express": ^4.17.6 "@types/fs-extra": ^9.0.1 "@types/git-url-parse": ^9.0.0 + "@types/luxon": ^3.0.0 "@types/mock-fs": ^4.13.0 "@types/nunjucks": ^3.1.4 "@types/supertest": ^2.0.8 @@ -7784,10 +7763,11 @@ __metadata: supertest: ^6.1.3 uuid: ^8.2.0 vm2: ^3.9.11 + wait-for-expect: ^3.0.2 winston: ^3.2.1 yaml: ^2.0.0 zen-observable: ^0.10.0 - zod: ~3.18.0 + zod: ^3.21.4 languageName: unknown linkType: soft @@ -7797,6 +7777,7 @@ __metadata: dependencies: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" "@backstage/types": "workspace:^" languageName: unknown linkType: soft @@ -7812,8 +7793,8 @@ __metadata: "@backstage/types": "workspace:^" jsonschema: ^1.2.6 winston: ^3.2.1 - zod: ~3.18.0 - zod-to-json-schema: ~3.18.0 + zod: ^3.21.4 + zod-to-json-schema: ^3.20.4 languageName: unknown linkType: soft @@ -7838,14 +7819,14 @@ __metadata: "@backstage/version-bridge": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^20.0.0 "@rjsf/core": ^3.2.1 - "@rjsf/core-v5": "npm:@rjsf/core@5.1.0" + "@rjsf/core-v5": "npm:@rjsf/core@5.3.1" "@rjsf/material-ui": ^3.2.1 - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.1.0" - "@rjsf/utils": 5.1.0 - "@rjsf/validator-ajv8": 5.1.0 + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.3.1" + "@rjsf/utils": 5.3.1 + "@rjsf/validator-ajv8": 5.3.1 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7864,8 +7845,8 @@ __metadata: react-use: ^17.2.4 use-immer: ^0.8.0 zen-observable: ^0.10.0 - zod: ~3.18.0 - zod-to-json-schema: ~3.18.0 + zod: ^3.21.4 + zod-to-json-schema: ^3.20.4 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 @@ -7902,12 +7883,12 @@ __metadata: "@codemirror/view": ^6.0.0 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^20.0.0 "@rjsf/core": ^3.2.1 "@rjsf/material-ui": ^3.2.1 - "@rjsf/utils": 5.1.0 - "@rjsf/validator-ajv8": 5.1.0 + "@rjsf/utils": 5.3.1 + "@rjsf/validator-ajv8": 5.3.1 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7931,8 +7912,8 @@ __metadata: react-use: ^17.2.4 yaml: ^2.0.0 zen-observable: ^0.10.0 - zod: ~3.18.0 - zod-to-json-schema: ~3.18.0 + zod: ^3.21.4 + zod-to-json-schema: ^3.20.4 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 @@ -7940,11 +7921,32 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-search-backend-module-catalog@workspace:^, @backstage/plugin-search-backend-module-catalog@workspace:plugins/search-backend-module-catalog": + version: 0.0.0-use.local + resolution: "@backstage/plugin-search-backend-module-catalog@workspace:plugins/search-backend-module-catalog" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/backend-tasks": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" + "@backstage/catalog-client": "workspace:^" + "@backstage/catalog-model": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-search-backend-node": "workspace:^" + "@backstage/plugin-search-common": "workspace:^" + msw: ^1.0.0 + languageName: unknown + linkType: soft + "@backstage/plugin-search-backend-module-elasticsearch@workspace:^, @backstage/plugin-search-backend-module-elasticsearch@workspace:plugins/search-backend-module-elasticsearch": version: 0.0.0-use.local resolution: "@backstage/plugin-search-backend-module-elasticsearch@workspace:plugins/search-backend-module-elasticsearch" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/plugin-search-backend-node": "workspace:^" @@ -7962,11 +7964,30 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-search-backend-module-explore@workspace:^, @backstage/plugin-search-backend-module-explore@workspace:plugins/search-backend-module-explore": + version: 0.0.0-use.local + resolution: "@backstage/plugin-search-backend-module-explore@workspace:plugins/search-backend-module-explore" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/backend-tasks": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/plugin-explore-common": "workspace:^" + "@backstage/plugin-search-backend-node": "workspace:^" + "@backstage/plugin-search-common": "workspace:^" + node-fetch: ^2.6.7 + winston: ^3.2.1 + languageName: unknown + linkType: soft + "@backstage/plugin-search-backend-module-pg@workspace:^, @backstage/plugin-search-backend-module-pg@workspace:plugins/search-backend-module-pg": version: 0.0.0-use.local resolution: "@backstage/plugin-search-backend-module-pg@workspace:plugins/search-backend-module-pg" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" @@ -7979,11 +8000,37 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-search-backend-module-techdocs@workspace:^, @backstage/plugin-search-backend-module-techdocs@workspace:plugins/search-backend-module-techdocs": + version: 0.0.0-use.local + resolution: "@backstage/plugin-search-backend-module-techdocs@workspace:plugins/search-backend-module-techdocs" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/backend-tasks": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" + "@backstage/catalog-client": "workspace:^" + "@backstage/catalog-model": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-search-backend-node": "workspace:^" + "@backstage/plugin-search-common": "workspace:^" + "@backstage/plugin-techdocs-node": "workspace:^" + lodash: ^4.17.21 + msw: ^1.0.0 + node-fetch: ^2.6.7 + p-limit: ^3.1.0 + winston: ^3.2.1 + languageName: unknown + linkType: soft + "@backstage/plugin-search-backend-node@workspace:^, @backstage/plugin-search-backend-node@workspace:plugins/search-backend-node": version: 0.0.0-use.local resolution: "@backstage/plugin-search-backend-node@workspace:plugins/search-backend-node" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-tasks": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" @@ -8005,6 +8052,8 @@ __metadata: resolution: "@backstage/plugin-search-backend@workspace:plugins/search-backend" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" @@ -8024,20 +8073,10 @@ __metadata: supertest: ^6.1.3 winston: ^3.2.1 yn: ^4.0.0 - zod: ~3.18.0 + zod: ^3.21.4 languageName: unknown linkType: soft -"@backstage/plugin-search-common@npm:^1.2.1": - version: 1.2.1 - resolution: "@backstage/plugin-search-common@npm:1.2.1" - dependencies: - "@backstage/plugin-permission-common": ^0.7.3 - "@backstage/types": ^1.0.2 - checksum: ebeacfd26dccd906e1d72f8b2df4a585294e31c6759aaabe0de245f0d93dfc1e0f44b8359e951116c619a7700bf71d22dad901c9fbd6dfb79b9385832989fe00 - 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" @@ -8063,7 +8102,7 @@ __metadata: "@backstage/version-bridge": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -8099,7 +8138,7 @@ __metadata: "@backstage/version-bridge": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -8132,7 +8171,7 @@ __metadata: "@material-table/core": ^3.1.0 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8164,7 +8203,7 @@ __metadata: "@backstage/types": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8231,7 +8270,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/styles": ^4.10.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -8261,7 +8300,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8341,7 +8380,6 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": ^4.0.0-alpha.57 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8450,7 +8488,7 @@ __metadata: "@backstage/types": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8479,7 +8517,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8516,7 +8554,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8538,6 +8576,7 @@ __metadata: resolution: "@backstage/plugin-techdocs-backend@workspace:plugins/techdocs-backend" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-client": "workspace:^" "@backstage/catalog-model": "workspace:^" @@ -8547,6 +8586,7 @@ __metadata: "@backstage/integration": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-search-backend-module-techdocs": "workspace:^" "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-search-common": "workspace:^" "@backstage/plugin-techdocs-node": "workspace:^" @@ -8583,7 +8623,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^20.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -8620,7 +8660,7 @@ __metadata: "@backstage/integration-aws-node": "workspace:^" "@backstage/plugin-search-common": "workspace:^" "@google-cloud/storage": ^6.0.0 - "@trendyol-js/openstack-swift-sdk": ^0.0.5 + "@trendyol-js/openstack-swift-sdk": ^0.0.6 "@types/express": ^4.17.6 "@types/fs-extra": ^9.0.5 "@types/js-yaml": ^4.0.0 @@ -8657,7 +8697,7 @@ __metadata: "@backstage/theme": "workspace:^" "@backstage/version-bridge": "workspace:^" "@material-ui/core": ^4.12.2 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/styles": ^4.11.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -8696,7 +8736,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/styles": ^4.10.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -8764,7 +8804,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8817,7 +8857,7 @@ __metadata: "@backstage/types": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8876,7 +8916,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": ^4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8903,7 +8943,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8996,16 +9036,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/theme@npm:^0.2.16, @backstage/theme@npm:^0.2.17": - version: 0.2.17 - resolution: "@backstage/theme@npm:0.2.17" - dependencies: - "@material-ui/core": ^4.12.2 - checksum: 4be1d9bf2c3fce611a75f3b5b80f91365dcb67b8e5a417f9c760ffbc9c6f3dd9c243082347278569ad343cf017b76ebaf2143eb9aebfa07a58513c38dbbca97e - languageName: node - linkType: hard - -"@backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": +"@backstage/theme@^0.2.16, @backstage/theme@^0.2.18, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": version: 0.0.0-use.local resolution: "@backstage/theme@workspace:packages/theme" dependencies: @@ -9014,7 +9045,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/types@^1.0.1, @backstage/types@^1.0.2, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": +"@backstage/types@^1.0.2, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@backstage/types@workspace:packages/types" dependencies: @@ -9025,7 +9056,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/version-bridge@^1.0.2, @backstage/version-bridge@^1.0.3, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": +"@backstage/version-bridge@^1.0.3, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": version: 0.0.0-use.local resolution: "@backstage/version-bridge@workspace:packages/version-bridge" dependencies: @@ -9053,10 +9084,10 @@ __metadata: languageName: node linkType: hard -"@braintree/sanitize-url@npm:=6.0.0": - version: 6.0.0 - resolution: "@braintree/sanitize-url@npm:6.0.0" - checksum: 409ce7709dc1a0c67bc887d20af1becd4145d5c62cc5124b1c4c1f3ea2a8d69b0ee9f582d446469c6f5294b56442b99048cbbba6861dd5c834d4e019b95e1f40 +"@braintree/sanitize-url@npm:=6.0.2": + version: 6.0.2 + resolution: "@braintree/sanitize-url@npm:6.0.2" + checksum: 6a9dfd4081cc96516eeb281d1a83d3b5f1ad3d2837adf968fcc2ba18889ee833554f9c641b4083c36d3360a932e4504ddf25b0b51e9933c3742622df82cf7c9a languageName: node linkType: hard @@ -9105,8 +9136,8 @@ __metadata: linkType: hard "@changesets/cli@npm:^2.14.0": - version: 2.26.0 - resolution: "@changesets/cli@npm:2.26.0" + version: 2.26.1 + resolution: "@changesets/cli@npm:2.26.1" dependencies: "@babel/runtime": ^7.20.1 "@changesets/apply-release-plan": ^6.1.3 @@ -9143,7 +9174,7 @@ __metadata: tty-table: ^4.1.5 bin: changeset: bin.js - checksum: 12a911b4196ff390ce114e27b475e59f5f5e1fdc7049d1ab04effe73d4811d99db47a030de6abe332300b4b2c43cffc537cec4883476b59b69bc23aee07cd5c5 + checksum: d7d6445ebbc1b2718d97852a2275f59af32020e8a1e1efe666767819dd862c7794ce50627ad52f1f97ba4bc57c81bfc4750e92265757cc94ab2d44198d2afb10 languageName: node linkType: hard @@ -9340,11 +9371,11 @@ __metadata: linkType: hard "@codemirror/legacy-modes@npm:^6.1.0": - version: 6.3.1 - resolution: "@codemirror/legacy-modes@npm:6.3.1" + version: 6.3.2 + resolution: "@codemirror/legacy-modes@npm:6.3.2" dependencies: "@codemirror/language": ^6.0.0 - checksum: 9065e521bf14e33856e9d3ea114d7b352adf341a8b8d4fb94b4c866189336a32b5ed42ffc20f5d2fa3c839f1bdf29a868bbf9b74c105ed83fa9fd6080e0429e9 + checksum: fa5f5477fb9e19267251e2ecd3de8c1a4c2512813555bb60111dce3951f2c3f6080a2985a573b7542534ba1d2c34115f7e39ee23fdf8f6f81db6f8ce447c1efc languageName: node linkType: hard @@ -9390,13 +9421,13 @@ __metadata: linkType: hard "@codemirror/view@npm:^6.0.0": - version: 6.9.1 - resolution: "@codemirror/view@npm:6.9.1" + version: 6.9.3 + resolution: "@codemirror/view@npm:6.9.3" dependencies: "@codemirror/state": ^6.1.4 style-mod: ^4.0.0 w3c-keyname: ^2.2.4 - checksum: 485d54d338a27ebde6bec489e3008db80a2a801fe27db0d4a3c70181c8739f806f035855ba13d5b311d186ad2b130db07196e8b465ec102b0142df0689bff2f8 + checksum: 718ecbb021ca75eb89003f73c846a07d36a708dcfec8345f0f0dbcfc0d0df5ea6f114918694b2730a6d49e5e50502bcce79ce7ff94ce55748e068e5a35073755 languageName: node linkType: hard @@ -9598,9 +9629,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/android-arm64@npm:0.17.11" +"@esbuild/android-arm64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/android-arm64@npm:0.17.14" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -9619,9 +9650,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/android-arm@npm:0.17.11" +"@esbuild/android-arm@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/android-arm@npm:0.17.14" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -9633,9 +9664,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/android-x64@npm:0.17.11" +"@esbuild/android-x64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/android-x64@npm:0.17.14" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -9647,9 +9678,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/darwin-arm64@npm:0.17.11" +"@esbuild/darwin-arm64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/darwin-arm64@npm:0.17.14" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -9661,9 +9692,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/darwin-x64@npm:0.17.11" +"@esbuild/darwin-x64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/darwin-x64@npm:0.17.14" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -9675,9 +9706,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/freebsd-arm64@npm:0.17.11" +"@esbuild/freebsd-arm64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/freebsd-arm64@npm:0.17.14" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -9689,9 +9720,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/freebsd-x64@npm:0.17.11" +"@esbuild/freebsd-x64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/freebsd-x64@npm:0.17.14" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -9703,9 +9734,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-arm64@npm:0.17.11" +"@esbuild/linux-arm64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/linux-arm64@npm:0.17.14" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -9717,9 +9748,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-arm@npm:0.17.11" +"@esbuild/linux-arm@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/linux-arm@npm:0.17.14" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -9731,9 +9762,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-ia32@npm:0.17.11" +"@esbuild/linux-ia32@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/linux-ia32@npm:0.17.14" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -9752,9 +9783,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-loong64@npm:0.17.11" +"@esbuild/linux-loong64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/linux-loong64@npm:0.17.14" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -9766,9 +9797,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-mips64el@npm:0.17.11" +"@esbuild/linux-mips64el@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/linux-mips64el@npm:0.17.14" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -9780,9 +9811,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-ppc64@npm:0.17.11" +"@esbuild/linux-ppc64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/linux-ppc64@npm:0.17.14" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -9794,9 +9825,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-riscv64@npm:0.17.11" +"@esbuild/linux-riscv64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/linux-riscv64@npm:0.17.14" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -9808,9 +9839,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-s390x@npm:0.17.11" +"@esbuild/linux-s390x@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/linux-s390x@npm:0.17.14" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -9822,9 +9853,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-x64@npm:0.17.11" +"@esbuild/linux-x64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/linux-x64@npm:0.17.14" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -9836,9 +9867,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/netbsd-x64@npm:0.17.11" +"@esbuild/netbsd-x64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/netbsd-x64@npm:0.17.14" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -9850,9 +9881,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/openbsd-x64@npm:0.17.11" +"@esbuild/openbsd-x64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/openbsd-x64@npm:0.17.14" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -9864,9 +9895,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/sunos-x64@npm:0.17.11" +"@esbuild/sunos-x64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/sunos-x64@npm:0.17.14" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -9878,9 +9909,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/win32-arm64@npm:0.17.11" +"@esbuild/win32-arm64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/win32-arm64@npm:0.17.14" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -9892,9 +9923,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/win32-ia32@npm:0.17.11" +"@esbuild/win32-ia32@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/win32-ia32@npm:0.17.14" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -9906,9 +9937,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/win32-x64@npm:0.17.11" +"@esbuild/win32-x64@npm:0.17.14": + version: 0.17.14 + resolution: "@esbuild/win32-x64@npm:0.17.14" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -9997,8 +10028,8 @@ __metadata: linkType: hard "@frsource/cypress-plugin-visual-regression-diff@npm:^3.2.8": - version: 3.2.8 - resolution: "@frsource/cypress-plugin-visual-regression-diff@npm:3.2.8" + version: 3.2.14 + resolution: "@frsource/cypress-plugin-visual-regression-diff@npm:3.2.14" dependencies: "@frsource/base64": 1.0.5 glob: 8.0.3 @@ -10009,7 +10040,7 @@ __metadata: sharp: 0.31.2 peerDependencies: cypress: ">=4.5.0" - checksum: 7e5a1daf3a36ec7f62ea643da8eff73aadb595e4fb8b400abec37e38a356a200de1ce47ff2e14666e71556300e4d044d5fa5ad21bdd2d214b93402addb1a490e + checksum: 1650eded6db559ef13d0d8b3aba8b19e703dc103a9e806c87cb49ce495a37e296c041530f509f4c0372c15217c8b54a17f51b034261b5b109f4503ab24a8181f languageName: node linkType: hard @@ -10021,52 +10052,52 @@ __metadata: linkType: hard "@gitbeaker/browser@npm:^35.6.0": - version: 35.8.0 - resolution: "@gitbeaker/browser@npm:35.8.0" + version: 35.8.1 + resolution: "@gitbeaker/browser@npm:35.8.1" dependencies: - "@gitbeaker/core": ^35.8.0 - "@gitbeaker/requester-utils": ^35.8.0 + "@gitbeaker/core": ^35.8.1 + "@gitbeaker/requester-utils": ^35.8.1 delay: ^5.0.0 ky: 0.28.7 - checksum: 23fa14d64661108c03a5d141123037aebb68e257d84e26bd8f6241df65a0958eaa79b8b491e0f08159e325cdc3244f79b2426dedcc2354ad106316ea499415ac + checksum: 8a76322cfd19da3d691fb08c7ebc79971da02cfb950841578523f20de02cb5e2dcf9741eca048dfa17d6a9620eb4884c9a29d84a230ba9c8d18fc528deb830cd languageName: node linkType: hard -"@gitbeaker/core@npm:^35.6.0, @gitbeaker/core@npm:^35.8.0": - version: 35.8.0 - resolution: "@gitbeaker/core@npm:35.8.0" +"@gitbeaker/core@npm:^35.6.0, @gitbeaker/core@npm:^35.8.1": + version: 35.8.1 + resolution: "@gitbeaker/core@npm:35.8.1" dependencies: - "@gitbeaker/requester-utils": ^35.8.0 + "@gitbeaker/requester-utils": ^35.8.1 form-data: ^4.0.0 li: ^1.3.0 mime: ^3.0.0 query-string: ^7.0.0 xcase: ^2.0.1 - checksum: b894e1ac86dc8ac85f2db51d83d392899c10bb555b2448900f502ffeb49d9f36c1063c7151128ca96951ac472c11be6320584c4bec873501e96607bd7c25a37b + checksum: 8fc7b8d32a2162b70fd8e8ec4e019a3654da3fd1bcb7204b5030e8c9b4af52f4e7addafcd5503042e31dd4e4e3bdd7f8245dd963c77427d4471ab2e331266cf7 languageName: node linkType: hard -"@gitbeaker/node@npm:^35.1.0": - version: 35.8.0 - resolution: "@gitbeaker/node@npm:35.8.0" +"@gitbeaker/node@npm:^35.1.0, @gitbeaker/node@npm:^35.8.0": + version: 35.8.1 + resolution: "@gitbeaker/node@npm:35.8.1" dependencies: - "@gitbeaker/core": ^35.8.0 - "@gitbeaker/requester-utils": ^35.8.0 + "@gitbeaker/core": ^35.8.1 + "@gitbeaker/requester-utils": ^35.8.1 delay: ^5.0.0 got: ^11.8.3 xcase: ^2.0.1 - checksum: af75fa2348ec6fcdd1605f269df10c13bd7d53f9a5c42da7e013db920a1129075072de3a0ada97d800be732575bb838b8a462472faebcfaf9fe243b93d29a464 + checksum: b9439c8dadadc6c1c19c4528543226e18dffdff4bdb00904b18a0621af62f0449e203a500ec3f27f386c7a02adc373585e06a1f6e0f93b6b34a0be1ced857e92 languageName: node linkType: hard -"@gitbeaker/requester-utils@npm:^35.8.0": - version: 35.8.0 - resolution: "@gitbeaker/requester-utils@npm:35.8.0" +"@gitbeaker/requester-utils@npm:^35.8.1": + version: 35.8.1 + resolution: "@gitbeaker/requester-utils@npm:35.8.1" dependencies: form-data: ^4.0.0 qs: ^6.10.1 xcase: ^2.0.1 - checksum: 6bd49b821fb6f262c6306c06fc4812f41902c864a7d941b0d112381b352f680e50ebd6180840e21a89d761427cb1326d9829b74c98c95bf9fa2a5d53872a400a + checksum: c3c94ad90dab481887380f5bcff0416c1e1eee935fc3ca4f12d8db83d85c5f0d47f7f35cee6f2b05491bda99c03fb7eb88b849c986822eae3b1bfc26641ec899 languageName: node linkType: hard @@ -10080,14 +10111,14 @@ __metadata: linkType: hard "@google-cloud/firestore@npm:^6.0.0": - version: 6.4.3 - resolution: "@google-cloud/firestore@npm:6.4.3" + version: 6.5.0 + resolution: "@google-cloud/firestore@npm:6.5.0" dependencies: fast-deep-equal: ^3.1.1 functional-red-black-tree: ^1.0.1 - google-gax: ^3.5.3 + google-gax: ^3.5.7 protobufjs: ^7.0.0 - checksum: 8bbde2c9bad94459c231d41855e65866b2383f20e2741aa93d86204370172dd62af94e1eb66d977e000e0c7292c986eb25fe967db7ee847593fd9a68c9fb91e3 + checksum: dd9cf4eee263a976239232143d5caf213c34850a352c6b6cb15b7b17cfddc2c6bee5e72eed0d188f4317eb5cb6a898372d02c54be8a30bbdc7ffbd360e138cb7 languageName: node linkType: hard @@ -10174,8 +10205,8 @@ __metadata: linkType: hard "@graphql-codegen/cli@npm:^3.0.0": - version: 3.2.1 - resolution: "@graphql-codegen/cli@npm:3.2.1" + version: 3.2.2 + resolution: "@graphql-codegen/cli@npm:3.2.2" dependencies: "@babel/generator": ^7.18.13 "@babel/template": ^7.18.10 @@ -10196,12 +10227,12 @@ __metadata: "@whatwg-node/fetch": ^0.8.0 chalk: ^4.1.0 cosmiconfig: ^7.0.0 - cosmiconfig-typescript-loader: ^4.3.0 debounce: ^1.2.0 detect-indent: ^6.0.0 - graphql-config: ^4.4.0 + graphql-config: ^4.5.0 inquirer: ^8.0.0 is-glob: ^4.0.1 + jiti: ^1.17.1 json-to-pretty-yaml: ^1.2.2 listr2: ^4.0.5 log-symbols: ^4.0.0 @@ -10209,7 +10240,6 @@ __metadata: shell-quote: ^1.7.3 string-env-interpolation: ^1.0.1 ts-log: ^2.2.3 - ts-node: ^10.9.1 tslib: ^2.4.0 yaml: ^1.10.0 yargs: ^17.0.0 @@ -10220,7 +10250,7 @@ __metadata: graphql-code-generator: cjs/bin.js graphql-codegen: cjs/bin.js graphql-codegen-esm: esm/bin.js - checksum: b62e2a3cee866cb006163946272f25ba9cc59bb2d45b7b3df5d1b220096e79183929456a440e5c4980d6a5664d6b14d7870d7f1760eb250b9211f4743d2afad3 + checksum: b94284ac538a3504f96c7d507c140b7cfee30042209c4230ffc3068f05b6b27c75e1922b31c696363ab43e34e472ed194cc72996bbb10f59991cd2a4a35ff36e languageName: node linkType: hard @@ -10239,18 +10269,18 @@ __metadata: linkType: hard "@graphql-codegen/graphql-modules-preset@npm:^3.0.0": - version: 3.1.0 - resolution: "@graphql-codegen/graphql-modules-preset@npm:3.1.0" + version: 3.1.1 + resolution: "@graphql-codegen/graphql-modules-preset@npm:3.1.1" dependencies: "@graphql-codegen/plugin-helpers": ^4.1.0 - "@graphql-codegen/visitor-plugin-common": 3.0.1 + "@graphql-codegen/visitor-plugin-common": 3.0.2 "@graphql-tools/utils": ^9.0.0 change-case-all: 1.0.15 parse-filepath: ^1.0.2 tslib: ~2.5.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: cee2e7f8afbc0b0d81592abfc8894422b791f0eca6e878a789de980bf1710a3c726786ade296e653cc83f920b2618aa9f5c9dbb6934ee9da0122b2d10ef5bdb5 + checksum: f437590afa33ac308c075d214b501404ae2f99888cac8071d05cc2b8c7ceaea5aef8f86bb60e7a9a45902126dc99bd20d77e951c0beef665aaa31ac3c2217e26 languageName: node linkType: hard @@ -10284,39 +10314,39 @@ __metadata: linkType: hard "@graphql-codegen/typescript-resolvers@npm:^3.0.0": - version: 3.1.0 - resolution: "@graphql-codegen/typescript-resolvers@npm:3.1.0" + version: 3.1.1 + resolution: "@graphql-codegen/typescript-resolvers@npm:3.1.1" dependencies: "@graphql-codegen/plugin-helpers": ^4.1.0 - "@graphql-codegen/typescript": ^3.0.1 - "@graphql-codegen/visitor-plugin-common": 3.0.1 + "@graphql-codegen/typescript": ^3.0.2 + "@graphql-codegen/visitor-plugin-common": 3.0.2 "@graphql-tools/utils": ^9.0.0 auto-bind: ~4.0.0 tslib: ~2.5.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 05888a9dfd1556fe15465a524750c36881334c231297e2e89bccb536450bed61fde2ba182ba4e79e34be846ce2e2439f3f6b31a67e7437f03a4e4ace62e84dcd + checksum: 88faa1ca2335096aa9939101f3591007d9fa477836d969a3c622dbf67704505600387a2e9fbb416d61b5ef42dbd79a0d351003037c0756d8d0c7f32c7961e783 languageName: node linkType: hard -"@graphql-codegen/typescript@npm:^3.0.0, @graphql-codegen/typescript@npm:^3.0.1": - version: 3.0.1 - resolution: "@graphql-codegen/typescript@npm:3.0.1" +"@graphql-codegen/typescript@npm:^3.0.0, @graphql-codegen/typescript@npm:^3.0.2": + version: 3.0.2 + resolution: "@graphql-codegen/typescript@npm:3.0.2" dependencies: "@graphql-codegen/plugin-helpers": ^4.1.0 "@graphql-codegen/schema-ast": ^3.0.1 - "@graphql-codegen/visitor-plugin-common": 3.0.1 + "@graphql-codegen/visitor-plugin-common": 3.0.2 auto-bind: ~4.0.0 tslib: ~2.5.0 peerDependencies: graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 56a369237971cc4a5a4987628ec0fcceed66ec03a292b3d17b6ffb64279185cd085be351268c55be6b152634c430e885b9c584d816aaa25f067d91c6996c329a + checksum: e92dc54804b6ad45fb2499b91cb89743e455a984684e2b1df1b1a8f479a0bbffa5c625be97ccb55874ac8b7316a820b546e9e312b22eda78012acd5c27594a28 languageName: node linkType: hard -"@graphql-codegen/visitor-plugin-common@npm:3.0.1": - version: 3.0.1 - resolution: "@graphql-codegen/visitor-plugin-common@npm:3.0.1" +"@graphql-codegen/visitor-plugin-common@npm:3.0.2": + version: 3.0.2 + resolution: "@graphql-codegen/visitor-plugin-common@npm:3.0.2" dependencies: "@graphql-codegen/plugin-helpers": ^4.1.0 "@graphql-tools/optimize": ^1.3.0 @@ -10330,7 +10360,7 @@ __metadata: tslib: ~2.5.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 32bf553f73938581f634b1bbdf8616b1cb30cc85c73d7a8f6088d2a81a957e198c7c278edf6582c1eee7328a4463cea4725316b1743b87b26dc3e9fdd8318648 + checksum: c8f941df7f8304b722b492ceaf15dddcf33e3a69bc29b54970908ffa12b14d92276958005bd307648e0cdc55f9e243d0fb390862f73a17a26bd50f6484ac42d6 languageName: node linkType: hard @@ -10348,20 +10378,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/batch-execute@npm:8.5.1": - version: 8.5.1 - resolution: "@graphql-tools/batch-execute@npm:8.5.1" - dependencies: - "@graphql-tools/utils": 8.9.0 - dataloader: 2.1.0 - tslib: ^2.4.0 - value-or-promise: 1.0.11 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 56c3b9bbab7e3402710186df4de5ae716dc31caa16f3dc51434b5167f0a513881afc1cd835f3df8ff0536f80462394dbb12e5246cda999dcee043e9bf37bcbe2 - languageName: node - linkType: hard - "@graphql-tools/batch-execute@npm:8.5.14": version: 8.5.14 resolution: "@graphql-tools/batch-execute@npm:8.5.14" @@ -10376,6 +10392,20 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/batch-execute@npm:^8.5.18": + version: 8.5.18 + resolution: "@graphql-tools/batch-execute@npm:8.5.18" + dependencies: + "@graphql-tools/utils": 9.2.1 + dataloader: 2.2.2 + tslib: ^2.4.0 + value-or-promise: 1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 4a5b5dec502a91bd657a4ddad74965d050d3994c89f036225fac58657b5a275bb374224b20484e3ba773525e75a5552c4a5af7b6d52859ce3a3b32aec2412b6e + languageName: node + linkType: hard + "@graphql-tools/code-file-loader@npm:^7.3.17": version: 7.3.21 resolution: "@graphql-tools/code-file-loader@npm:7.3.21" @@ -10391,22 +10421,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/delegate@npm:8.8.1": - version: 8.8.1 - resolution: "@graphql-tools/delegate@npm:8.8.1" - dependencies: - "@graphql-tools/batch-execute": 8.5.1 - "@graphql-tools/schema": 8.5.1 - "@graphql-tools/utils": 8.9.0 - dataloader: 2.1.0 - tslib: ~2.4.0 - value-or-promise: 1.0.11 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 5246c63fbb42a22f881a1857bc36fdc6092a4f8c4b0f82d4113eca75aeb676305c42319f65c564816b8c4f4eef2a7b93ee709ff548ff78e5fb3e6c0845ac6d7e - languageName: node - linkType: hard - "@graphql-tools/delegate@npm:9.0.21": version: 9.0.21 resolution: "@graphql-tools/delegate@npm:9.0.21" @@ -10424,6 +10438,23 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/delegate@npm:9.0.28": + version: 9.0.28 + resolution: "@graphql-tools/delegate@npm:9.0.28" + dependencies: + "@graphql-tools/batch-execute": ^8.5.18 + "@graphql-tools/executor": ^0.0.15 + "@graphql-tools/schema": ^9.0.16 + "@graphql-tools/utils": ^9.2.1 + dataloader: ^2.2.2 + tslib: ^2.5.0 + value-or-promise: ^1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: e24c757ea15a2b654268194bbf76188fca6692486d1b019b0ad7d48c264f92b7b681a43c8a8355ace48a29f9dd566c20e8707b6cef281331a813f23ee1c94375 + languageName: node + linkType: hard + "@graphql-tools/executor-graphql-ws@npm:0.0.5": version: 0.0.5 resolution: "@graphql-tools/executor-graphql-ws@npm:0.0.5" @@ -10489,6 +10520,21 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/executor@npm:^0.0.15": + version: 0.0.15 + resolution: "@graphql-tools/executor@npm:0.0.15" + dependencies: + "@graphql-tools/utils": 9.2.1 + "@graphql-typed-document-node/core": 3.1.2 + "@repeaterjs/repeater": 3.0.4 + tslib: ^2.4.0 + value-or-promise: 1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 7a963d6fcd00bd9c2a42f35a33bc9178576a1eeac755ce69981aa1e2c61238953b7ab9c11ffcfc86e49fdcf4fc057698c6f7169d6be580298e286076276b1295 + languageName: node + linkType: hard + "@graphql-tools/git-loader@npm:^7.2.13": version: 7.2.13 resolution: "@graphql-tools/git-loader@npm:7.2.13" @@ -10608,30 +10654,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/merge@npm:8.2.10": - version: 8.2.10 - resolution: "@graphql-tools/merge@npm:8.2.10" - dependencies: - "@graphql-tools/utils": 8.6.9 - tslib: ~2.3.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 7059d9f68cfb9b7c04d6024f528e5638fab165e681b3307877a6bad0fc461686595d19375350875bb5f4f7572b21d10272a1e4b08a8af5b6a67950a4a950012b - languageName: node - linkType: hard - -"@graphql-tools/merge@npm:8.3.1": - version: 8.3.1 - resolution: "@graphql-tools/merge@npm:8.3.1" - dependencies: - "@graphql-tools/utils": 8.9.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 16af6be2249f4f500a4c2f5d3db2e0efd56ad69b5e10499649c6fc979c257af12e131112304a16699654b54daab37a80737e0538478bc45a0053b9bc859a7ac1 - languageName: node - linkType: hard - "@graphql-tools/merge@npm:8.3.14": version: 8.3.14 resolution: "@graphql-tools/merge@npm:8.3.14" @@ -10668,20 +10690,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/mock@npm:^8.1.2": - version: 8.6.8 - resolution: "@graphql-tools/mock@npm:8.6.8" - dependencies: - "@graphql-tools/schema": 8.3.10 - "@graphql-tools/utils": 8.6.9 - fast-json-stable-stringify: ^2.1.0 - tslib: ~2.3.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 594abfbb7766806e07910624d80e5c27cdf15e0b2d1a0eff4336b2d6c63bde3587ae6f7c889374217cb0893d8e9e87f696daf1cf1ce2fdae787dae22b8b4d228 - languageName: node - linkType: hard - "@graphql-tools/optimize@npm:^1.3.0": version: 1.3.0 resolution: "@graphql-tools/optimize@npm:1.3.0" @@ -10735,34 +10743,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/schema@npm:8.3.10": - version: 8.3.10 - resolution: "@graphql-tools/schema@npm:8.3.10" - dependencies: - "@graphql-tools/merge": 8.2.10 - "@graphql-tools/utils": 8.6.9 - tslib: ~2.3.0 - value-or-promise: 1.0.11 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 8b225f4ae87d3f1d8d9772df605a27dfde069a2372f2af0a1459859c4310c5fef8243c1276c1959e316420f1584d739b9f52c55dd230d2ad177cde1019155b81 - languageName: node - linkType: hard - -"@graphql-tools/schema@npm:8.5.1, @graphql-tools/schema@npm:^8.0.0, @graphql-tools/schema@npm:^8.3.1": - version: 8.5.1 - resolution: "@graphql-tools/schema@npm:8.5.1" - dependencies: - "@graphql-tools/merge": 8.3.1 - "@graphql-tools/utils": 8.9.0 - tslib: ^2.4.0 - value-or-promise: 1.0.11 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 91363cd4371e347af40ef66f7d903b5d4f5998bfaec9214768e6a795136ef6372f9f225e05e18daacd929e23695811f15e791c6cbe082bf5b5d03b16b1f874f8 - languageName: node - linkType: hard - "@graphql-tools/schema@npm:9.0.12": version: 9.0.12 resolution: "@graphql-tools/schema@npm:9.0.12" @@ -10791,7 +10771,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/schema@npm:^9.0.0": +"@graphql-tools/schema@npm:9.0.17, @graphql-tools/schema@npm:^9.0.0, @graphql-tools/schema@npm:^9.0.16": version: 9.0.17 resolution: "@graphql-tools/schema@npm:9.0.17" dependencies: @@ -10828,17 +10808,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/utils@npm:8.6.9": - version: 8.6.9 - resolution: "@graphql-tools/utils@npm:8.6.9" - dependencies: - tslib: ~2.3.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 73b9569a9c2409f86a6a9005f19026cfab6d136bf884dfbff436996a47fb0561ae24d3f6bb2abcfd600197aab85d6dfc177b9a0cbaba23905ba0c7591ef12110 - languageName: node - linkType: hard - "@graphql-tools/utils@npm:8.8.0": version: 8.8.0 resolution: "@graphql-tools/utils@npm:8.8.0" @@ -10894,7 +10863,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/utils@npm:9.2.1, @graphql-tools/utils@npm:^9.0.0, @graphql-tools/utils@npm:^9.1.1": +"@graphql-tools/utils@npm:9.2.1, @graphql-tools/utils@npm:^9.0.0, @graphql-tools/utils@npm:^9.1.1, @graphql-tools/utils@npm:^9.2.1": version: 9.2.1 resolution: "@graphql-tools/utils@npm:9.2.1" dependencies: @@ -10921,22 +10890,22 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/wrap@npm:^8.3.1": - version: 8.5.1 - resolution: "@graphql-tools/wrap@npm:8.5.1" +"@graphql-tools/wrap@npm:^9.0.0": + version: 9.3.8 + resolution: "@graphql-tools/wrap@npm:9.3.8" dependencies: - "@graphql-tools/delegate": 8.8.1 - "@graphql-tools/schema": 8.5.1 - "@graphql-tools/utils": 8.9.0 + "@graphql-tools/delegate": 9.0.28 + "@graphql-tools/schema": 9.0.17 + "@graphql-tools/utils": 9.2.1 tslib: ^2.4.0 - value-or-promise: 1.0.11 + value-or-promise: 1.0.12 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: bc9350015adde545208709584cf1a3c5b4bc3bbfd82062b93b4da253481e366d9f9caad49d7f2f0aaa7fe070167d15b99da7ee76e431c0c6bee815923aafdb29 + checksum: 1f280b939f1c8c33be8fbd92c0584e9125e30c59ce6f75f20657235d24e5a2c01eb3214eda9ae74d431d9da072cdfa6cedeafdc5b352dd33de439ba42402efcb languageName: node linkType: hard -"@graphql-typed-document-node/core@npm:3.1.1, @graphql-typed-document-node/core@npm:^3.1.0, @graphql-typed-document-node/core@npm:^3.1.1": +"@graphql-typed-document-node/core@npm:3.1.1": version: 3.1.1 resolution: "@graphql-typed-document-node/core@npm:3.1.1" peerDependencies: @@ -10945,6 +10914,15 @@ __metadata: languageName: node linkType: hard +"@graphql-typed-document-node/core@npm:3.1.2, @graphql-typed-document-node/core@npm:^3.1.0, @graphql-typed-document-node/core@npm:^3.1.1": + version: 3.1.2 + resolution: "@graphql-typed-document-node/core@npm:3.1.2" + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: a61afa025acdabd7833e4f654a5802fc1a526171f81e0c435c8e651050a5a0682499a2c7a51304ceb61fde36cd69fc7975ce5e1b16b9ba7ea474c649f33eea8b + languageName: node + linkType: hard + "@grpc/grpc-js@npm:~1.8.0": version: 1.8.9 resolution: "@grpc/grpc-js@npm:1.8.9" @@ -11096,7 +11074,7 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -11452,7 +11430,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.0.3": +"@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": version: 3.1.0 resolution: "@jridgewell/resolve-uri@npm:3.1.0" checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 @@ -11476,7 +11454,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13": +"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13": version: 1.4.14 resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 @@ -11493,13 +11471,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.0, @jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.14, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.15 - resolution: "@jridgewell/trace-mapping@npm:0.3.15" +"@jridgewell/trace-mapping@npm:^0.3.0, @jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.17 + resolution: "@jridgewell/trace-mapping@npm:0.3.17" dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: 38917e9c2b014d469a9f51c016ed506acbe44dd16ec2f6f99b553ebf3764d22abadbf992f2367b6d2b3511f3eae8ed3a8963f6c1030093fda23efd35ecab2bae + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339 languageName: node linkType: hard @@ -11798,7 +11776,7 @@ __metadata: languageName: node linkType: hard -"@material-ui/lab@npm:^4.0.0-alpha.57, @material-ui/lab@npm:^4.0.0-alpha.60, @material-ui/lab@npm:^4.0.0-alpha.61": +"@material-ui/lab@npm:4.0.0-alpha.61, @material-ui/lab@npm:^4.0.0-alpha.57, @material-ui/lab@npm:^4.0.0-alpha.60": version: 4.0.0-alpha.61 resolution: "@material-ui/lab@npm:4.0.0-alpha.61" dependencies: @@ -12533,9 +12511,9 @@ __metadata: languageName: node linkType: hard -"@octokit/oauth-app@npm:^4.0.4, @octokit/oauth-app@npm:^4.0.6": - version: 4.0.6 - resolution: "@octokit/oauth-app@npm:4.0.6" +"@octokit/oauth-app@npm:^4.0.4, @octokit/oauth-app@npm:^4.0.6, @octokit/oauth-app@npm:^4.2.0": + version: 4.2.0 + resolution: "@octokit/oauth-app@npm:4.2.0" dependencies: "@octokit/auth-oauth-app": ^5.0.0 "@octokit/auth-oauth-user": ^2.0.0 @@ -12544,13 +12522,9 @@ __metadata: "@octokit/oauth-authorization-url": ^5.0.0 "@octokit/oauth-methods": ^2.0.0 "@types/aws-lambda": ^8.10.83 - aws-lambda: ^1.0.7 fromentries: ^1.3.1 universal-user-agent: ^6.0.0 - dependenciesMeta: - aws-lambda: - optional: true - checksum: 0d7ceadda4668748a436f52f6c4ae3160a4a5c81a92592c0a6cfc75b0a065ed480880d8861efcabc6ca41b3ccf753d1c1044782a6c8d5fb481d6e8a0acf6d32e + checksum: 6cf5638d27e589daa577653177f2b135c0c346c8f74cc420d9fd0dc0f559a84040073eee147bd555a55bb5756bd0940e6dc4c3a6b3a508a818e3d5bee3837095 languageName: node linkType: hard @@ -12934,25 +12908,25 @@ __metadata: linkType: hard "@opentelemetry/api@npm:^1.0.1, @opentelemetry/api@npm:^1.3.0": - version: 1.4.0 - resolution: "@opentelemetry/api@npm:1.4.0" - checksum: 8dc522194e20d2e8aa6cac155dbce19d3fc9cfac59e953ece1064158c6348ccd9560ee99d2f2381e82c2f8c9a129b57fa7b640027383315504de1fa712b6d7f1 + version: 1.4.1 + resolution: "@opentelemetry/api@npm:1.4.1" + checksum: e783c40d1a518abf9c4c5d65223237c1392cd9a6c53ac6e2c3ef0c05ff7266e3dfc4fd9874316dae0dcb7a97950878deb513bcbadfaad653d48f0215f2a0911b languageName: node linkType: hard "@oriflame/backstage-plugin-score-card@npm:^0.6.0": - version: 0.6.2 - resolution: "@oriflame/backstage-plugin-score-card@npm:0.6.2" + version: 0.6.3 + resolution: "@oriflame/backstage-plugin-score-card@npm:0.6.3" dependencies: - "@backstage/catalog-model": ^1.1.3 - "@backstage/config": ^1.0.4 - "@backstage/core-components": ^0.12.0 - "@backstage/core-plugin-api": ^1.1.0 - "@backstage/plugin-catalog-common": ^1.0.8 - "@backstage/plugin-catalog-react": ^1.2.1 + "@backstage/catalog-model": ^1.1.5 + "@backstage/config": ^1.0.6 + "@backstage/core-components": ^0.12.3 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/plugin-catalog-common": ^1.0.10 + "@backstage/plugin-catalog-react": ^1.2.4 "@backstage/theme": ^0.2.16 - "@backstage/types": ^1.0.1 - "@backstage/version-bridge": ^1.0.2 + "@backstage/types": ^1.0.2 + "@backstage/version-bridge": ^1.0.3 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.11.2 "@material-ui/lab": ^4.0.0-alpha.57 @@ -12960,7 +12934,7 @@ __metadata: peerDependencies: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 - checksum: 6c8ca85981fde5af8e3951f0f5fc9c3873c890d286fd29067215246e9b8e9022ceea308c9caa8b0ccfe5380fe5640aaede48c9963a57c3c98f5c3b5feade9aae + checksum: cdf57bb0ea42b1ef3699b65e558c0d9f2483555fefd03bc3ff4e4d75524c904d723e4808987e8718eac63ab60da6257af82e7d45c70cd42fc00bb1a4c392578b languageName: node linkType: hard @@ -13152,6 +13126,13 @@ __metadata: languageName: node linkType: hard +"@remix-run/router@npm:1.4.0": + version: 1.4.0 + resolution: "@remix-run/router@npm:1.4.0" + checksum: 707dce35a2b8138005cf19e63f6fd3c4da05b4b892e9e9118e8b727c3b95953efe27307ca2df35084044df30fa1fc367cf0bbc98d1ded9020c82e61e6242caaf + languageName: node + linkType: hard + "@repeaterjs/repeater@npm:3.0.4": version: 3.0.4 resolution: "@repeaterjs/repeater@npm:3.0.4" @@ -13159,18 +13140,19 @@ __metadata: languageName: node linkType: hard -"@rjsf/core-v5@npm:@rjsf/core@5.1.0": - version: 5.1.0 - resolution: "@rjsf/core@npm:5.1.0" +"@rjsf/core-v5@npm:@rjsf/core@5.3.1": + version: 5.3.1 + resolution: "@rjsf/core@npm:5.3.1" dependencies: lodash: ^4.17.15 lodash-es: ^4.17.15 + markdown-to-jsx: ^7.1.9 nanoid: ^3.3.4 prop-types: ^15.7.2 peerDependencies: "@rjsf/utils": ^5.0.0 react: ^16.14.0 || >=17 - checksum: ff38046bb25de86b57e404c5d1ccea84b0485e916caf33a3cb25b030a38ed930a9b89a411671a7c29b047da38e0c682e20b43b13e61d77df770299385ba3c67a + checksum: e7f5c05a594db0549c5289f1dc570977fa37c9ca0f1fed47ec17fa49dd4b6b85ffc3844c9c11d36455a66ff17f898469b6a2dca159223de348f84bdadd28ae32 languageName: node linkType: hard @@ -13193,16 +13175,16 @@ __metadata: languageName: node linkType: hard -"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.1.0": - version: 5.1.0 - resolution: "@rjsf/material-ui@npm:5.1.0" +"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.3.1": + version: 5.3.1 + resolution: "@rjsf/material-ui@npm:5.3.1" peerDependencies: "@material-ui/core": ^4.12.3 "@material-ui/icons": ^4.11.2 "@rjsf/core": ^5.0.0 "@rjsf/utils": ^5.0.0 react: ^16.14.0 || >=17 - checksum: f8e2c486f33a60703cae5bb42ae82bc431b3d743c239868ca71907e7b4127a39d1688200820c0c8acdf3ecd3f5eaddef4ba47264695feead28e9b439d9be7ce8 + checksum: 169d78e3983742b38008de95ab320cdc1f52995dabf2e75d44052c09fb0b734ecb45c58fbdf51dea18bf8bd45130aec01dc0b4b75a2635e82ef5c489d1d35af1 languageName: node linkType: hard @@ -13218,9 +13200,9 @@ __metadata: languageName: node linkType: hard -"@rjsf/utils@npm:5.1.0": - version: 5.1.0 - resolution: "@rjsf/utils@npm:5.1.0" +"@rjsf/utils@npm:5.3.1": + version: 5.3.1 + resolution: "@rjsf/utils@npm:5.3.1" dependencies: json-schema-merge-allof: ^0.8.1 jsonpointer: ^5.0.1 @@ -13229,13 +13211,13 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: 76d7caf144f98b1547067bfdc2b1baecf452c63bd9d6f2cae6c162a99154bb4d2f5033f6abc0e26ab767dca9ea743f1f5a9d796696e90dd5ed1fdca5ee3c5280 + checksum: 400a17bf99a043557adbd4e0dc3651b9d1b47ab61a40acb8756c5b986d044a329bd26bf45263a667eb963acf51084d612c043c9409aeaac4e4c6ab66af0bb700 languageName: node linkType: hard -"@rjsf/validator-ajv8@npm:5.1.0": - version: 5.1.0 - resolution: "@rjsf/validator-ajv8@npm:5.1.0" +"@rjsf/validator-ajv8@npm:5.3.1": + version: 5.3.1 + resolution: "@rjsf/validator-ajv8@npm:5.3.1" dependencies: ajv: ^8.12.0 ajv-formats: ^2.1.1 @@ -13243,19 +13225,19 @@ __metadata: lodash-es: ^4.17.15 peerDependencies: "@rjsf/utils": ^5.0.0 - checksum: 3430a0aea8235deedd306b535ea3a62a9bcdd4dcf0bf1d022fe036041dceb5ca7c147b17ae50a0d25bb7c953729e987d96c68f5220f8fde4b56a89cf3f106a49 + checksum: b99e0d2df6b6431438ea81c2e31636aa5a1939d054153236851e5d8e8b06f8a1958c8c16887dd2babfd1608e18aa1ce3f1c0a778b3b3198028b92f0553e0383e languageName: node linkType: hard "@roadiehq/backstage-plugin-buildkite@npm:^2.0.8": - version: 2.1.6 - resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.6" + version: 2.1.7 + resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.7" dependencies: - "@backstage/catalog-model": ^1.2.0 - "@backstage/core-components": ^0.12.4 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/plugin-catalog-react": ^1.3.0 - "@backstage/theme": ^0.2.17 + "@backstage/catalog-model": ^1.2.1 + "@backstage/core-components": ^0.12.5 + "@backstage/core-plugin-api": ^1.5.0 + "@backstage/plugin-catalog-react": ^1.4.0 + "@backstage/theme": ^0.2.18 "@material-ui/core": ^4.12.1 "@material-ui/icons": ^4.11.2 "@material-ui/lab": 4.0.0-alpha.57 @@ -13267,20 +13249,20 @@ __metadata: react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 90d8ea1c3379f04e98a992e4192aeb46ea394a8970e50c9ffdf24171e731f4108b0117596b877ec0ff8d12434ca513ba566d957a71d9584cc12b2e097abb0b3f + checksum: 1b84acf97e22f3b481d4b4fbc1ccb1d184f811ec00998b92cc8ee6f4be95af2acebd9932ad4337c611d17ca15f8c34cd44310a44d775008a1d845fe1a197ae37 languageName: node linkType: hard "@roadiehq/backstage-plugin-github-insights@npm:^2.0.5": - version: 2.3.7 - resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.7" + version: 2.3.8 + resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.8" dependencies: - "@backstage/catalog-model": ^1.2.0 - "@backstage/core-components": ^0.12.4 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/integration-react": ^1.1.10 - "@backstage/plugin-catalog-react": ^1.3.0 - "@backstage/theme": ^0.2.17 + "@backstage/catalog-model": ^1.2.1 + "@backstage/core-components": ^0.12.5 + "@backstage/core-plugin-api": ^1.5.0 + "@backstage/integration-react": ^1.1.11 + "@backstage/plugin-catalog-react": ^1.4.0 + "@backstage/theme": ^0.2.18 "@date-io/core": 2.10.7 "@material-ui/core": ^4.11.0 "@material-ui/icons": ^4.9.1 @@ -13295,19 +13277,19 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: 0818a109c6ebbcc312f1a9f6575cd8d47f7adec6201d3555cfc1ad2d25c5f80ff08ad26eee692a40d059283c7b3dadbb5a6533802318a8ae5c781c1fcaaf077d + checksum: 0a9027a035d41e46344d88da361ec91fbf43adb018bb9e383e5659d4478b67951ef9e32381b020a2104bf16be5009ae7e97c07182dcbe04721d6385e93ec8ce2 languageName: node linkType: hard "@roadiehq/backstage-plugin-github-pull-requests@npm:^2.2.7": - version: 2.5.2 - resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.5.2" + version: 2.5.5 + resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.5.5" dependencies: - "@backstage/catalog-model": ^1.1.5 - "@backstage/core-components": ^0.12.3 - "@backstage/core-plugin-api": ^1.3.0 - "@backstage/plugin-catalog-react": ^1.2.4 - "@backstage/plugin-home": ^0.4.30 + "@backstage/catalog-model": ^1.2.1 + "@backstage/core-components": ^0.12.5 + "@backstage/core-plugin-api": ^1.5.0 + "@backstage/plugin-catalog-react": ^1.4.0 + "@backstage/plugin-home": ^0.4.32 "@material-ui/core": ^4.11.0 "@material-ui/icons": ^4.9.1 "@material-ui/lab": ^4.0.0-alpha.60 @@ -13324,19 +13306,19 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: dd8c3301867cd8ccaf094eb62c64b2923c4614e9ba384249c5ddb80b6375bc7f5e8828a7fc12f9e7785ca230948895e03a9c1521be45f69797f663b28cecc3c7 + checksum: 3a17a21665c397b3bd94c277e31b9f1005387b458a14b1c4c3bd28f6ef1400289fcf24e44bb8c54e07b99b59af49fe608c587f49e27d15cf01ef4d539cc25354 languageName: node linkType: hard "@roadiehq/backstage-plugin-travis-ci@npm:^2.0.5": - version: 2.1.6 - resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.6" + version: 2.1.7 + resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.7" dependencies: - "@backstage/catalog-model": ^1.2.0 - "@backstage/core-components": ^0.12.4 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/plugin-catalog-react": ^1.3.0 - "@backstage/theme": ^0.2.17 + "@backstage/catalog-model": ^1.2.1 + "@backstage/core-components": ^0.12.5 + "@backstage/core-plugin-api": ^1.5.0 + "@backstage/plugin-catalog-react": ^1.4.0 + "@backstage/theme": ^0.2.18 "@material-ui/core": ^4.11.3 "@material-ui/icons": ^4.11.2 "@material-ui/lab": 4.0.0-alpha.57 @@ -13350,7 +13332,7 @@ __metadata: react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 657e58579bdc9387edb61538f4541be4ba2b33f33fcac9129f533b35dc6d207d9930e0eae0937435def7ebf5e791118727417d818dd96de05126bda1041f15d1 + checksum: 1a00d0128e1bdacac93ffa7b1aa1534ec91b603899d40967ed387e3fd91f35bbc5f9babfc7b811279775d60e28db7747211fd5c0d368db23b5a184b054e918c1 languageName: node linkType: hard @@ -13866,90 +13848,455 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-arm64@npm:1.3.38" +"@swagger-api/apidom-ast@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-ast@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + stampit: =4.3.2 + unraw: =2.0.1 + checksum: 59625e7f3543766d901227d9afec0ebce0cc1368cc63d22ad5f348a9da0b3777ea83acce7eb0eecdbe6210022f3bf0fafdb46d59b0e90d630ad55c428ede14a2 + languageName: node + linkType: hard + +"@swagger-api/apidom-core@npm:=0.69.0, @swagger-api/apidom-core@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-core@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-ast": ^0.69.0 + "@types/ramda": =0.28.23 + minim: =0.23.8 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + short-unique-id: =4.4.4 + stampit: =4.3.2 + checksum: 036dc1198014fff9d7e879529186c4b0db423ae4c933eecec90650985e198cb3745638feff8681f85940f124703484d1b071dfca4eaf7b9457a4f99186c98972 + languageName: node + linkType: hard + +"@swagger-api/apidom-json-pointer@npm:=0.69.0, @swagger-api/apidom-json-pointer@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-json-pointer@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + checksum: 7930d938011c608d5c227c3b1cbfcb120eeebd32aedd447220219b079d030af6387a9a61e74461fe53578c06ba29aa78e5e5fdfcd561d5611d5a07ef5534ee49 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-api-design-systems@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-ns-api-design-systems@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + stampit: =4.3.2 + checksum: 1c3047d4081cd07bbbdce6fa19c62407d1c57f7bf05b85947fd1e9b3cc2c2792fb85a926a54d3376c761a123ce3b130b06e38830ca68743a20c684aae89275f1 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-asyncapi-2@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-json-schema-draft-7": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + stampit: =4.3.2 + checksum: c5b9161166ddce0be047a474e7257520a756ed3fe426b806c19122334535d07b48529be60638dd560ab6ff23899641cee1110932cad16b4bf93f8fbe8f52ca05 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-json-schema-draft-4@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + stampit: =4.3.2 + checksum: d308227f5849071be3481bd8d4a8dc16d0e9e99edb61250927da88ed34595d176d59792003a2a666a49585643ff659a16774826790aab718a316beda9ce617c3 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-json-schema-draft-6@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-json-schema-draft-4": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + stampit: =4.3.2 + checksum: df237753d0c9aa7d22029c22b5355310a14aa7a77aa484cc86d46850bd994db3f0901804510a6c62196e181c150e15fc7a031b97f0f45983b6f819fb7ed71ccb + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-json-schema-draft-7@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-json-schema-draft-6": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + stampit: =4.3.2 + checksum: a2059092cfb1797c90b15384270df65fadd6d1e8b469350082ab46d25a1840fd05ff0bea72a8005068f77ab277a049110962a15f1fbeeac63b9c0a34d21d78c2 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-openapi-3-0@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-json-schema-draft-4": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + stampit: =4.3.2 + checksum: e53bda9fada416e23a5220dd8987b3e4082b3020e3db40c5532fdd454aaa02953d4d72223fd0372897b0a6a73b321f89e83504d60bb8b52fa4fbcdfb5f097e59 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-openapi-3-1@npm:=0.69.0, @swagger-api/apidom-ns-openapi-3-1@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + stampit: =4.3.2 + checksum: 7f194ebb36891655fdcd8dfe88e664e70f6efcd713ac6defc75dadefb0087d3fd0358b656dec4920d876342d23c44ff1cee034fa32cfa1f8b3d49ceba9509dbb + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-api-design-systems": ^0.69.0 + "@swagger-api/apidom-parser-adapter-json": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + checksum: 68b43e19effd7b9c26e52381903a39fff7ef0990ad3cbcbf4aa7de01cf3454d915dc10d8f688aa0fa4405b11f1a6d8f49bc160e6b72c482fadb484bd787bdebd + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-api-design-systems": ^0.69.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + checksum: 6ded590b93087ad4b848ba4f742c6baeb35a572195d763a1ae0b479b8de4ae7d331175d5042116dab26684413ca6a58680080fb4b28ca5c66c7d72d6e624e174 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-asyncapi-2": ^0.69.0 + "@swagger-api/apidom-parser-adapter-json": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + checksum: c13b4ea5a603d7422ebf4dd87851a72a999c0036ff451b080cd37b96aa1b455f6483c447e4962303af52b44ac0fca3517573dfeeddbdb7f8d04cb7ff8796089f + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-asyncapi-2": ^0.69.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + checksum: f3415e86371f98e3677d22f432214f4b4e2267b80da2f505ed28d89c711fa32a627cea94040c6071e83d2ea3cf6aabc454331951d2fd3bcc138b091e78286423 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-json@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-parser-adapter-json@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-ast": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.0 + "@types/ramda": =0.28.23 + node-gyp: latest + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + stampit: =4.3.2 + tree-sitter: =0.20.1 + tree-sitter-json: =0.20.0 + web-tree-sitter: =0.20.7 + checksum: e640ffbf749285f70ea4d125cbb030ff9920b011e8694e3cd5c379b3a6f3f387805c9535af7786c2bed6f0f67bfd9f6daad6eb65a64ca76b48b45f283933f4d5 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.69.0 + "@swagger-api/apidom-parser-adapter-json": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + checksum: 50c61b46d16ed2a24816665ee810c295f6e82cad8a031ebc91d91aa3650bae92ddcede99ceea4346dcb69ca6edd811213018ebe8b23929012c08b425103a807d + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.69.0 + "@swagger-api/apidom-parser-adapter-json": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + checksum: 9c657b1eb82814958ed2b2c4e710a51378cbb11ca6957d0cc57ec544e0cba4a3bac412475f923e47c1fff8130f5a42cf8edcd99080703316150de8f1b30891b8 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.69.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + checksum: ee32fc65e053ccda7eae265ad1a43e5acd0688460620912363156ada3babf3115fbec0dd35423ca633aaf78e9e4ed71ee4be030385cfdcc9ed69e8438319cc19 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.69.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.0 + "@types/ramda": =0.28.23 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + checksum: c21f6ad4b149f64bb5af24d7d7ba5bd8342c2ab2e0e37d85617ca0d4d3333ee45a4603ce7cdca460d4dcb17c6d41b47f733390d3ef6754664ae11705a628fe9c + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-ast": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.0 + "@types/ramda": =0.28.23 + node-gyp: latest + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + stampit: =4.3.2 + tree-sitter: =0.20.1 + tree-sitter-yaml: =0.5.0 + web-tree-sitter: =0.20.7 + checksum: 6067347f6ab9d2cfbbe55f13345609c86b1660bebb7cea215c90739eab011498695d785bc7bb75fc95055ea98bafc765bbc0d304ad19f72647b72ee4308d249e + languageName: node + linkType: hard + +"@swagger-api/apidom-reference@npm:=0.69.0": + version: 0.69.0 + resolution: "@swagger-api/apidom-reference@npm:0.69.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-json-pointer": ^0.69.0 + "@swagger-api/apidom-ns-asyncapi-2": ^0.69.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.69.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.69.0 + "@swagger-api/apidom-parser-adapter-api-design-systems-json": ^0.69.0 + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": ^0.69.0 + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": ^0.69.0 + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": ^0.69.0 + "@swagger-api/apidom-parser-adapter-json": ^0.69.0 + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": ^0.69.0 + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": ^0.69.0 + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": ^0.69.0 + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": ^0.69.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.0 + "@types/ramda": =0.28.23 + axios: =1.3.4 + minimatch: =7.3.0 + process: =0.11.10 + ramda: =0.28.0 + ramda-adjunct: =3.4.0 + stampit: =4.3.2 + dependenciesMeta: + "@swagger-api/apidom-json-pointer": + optional: true + "@swagger-api/apidom-ns-asyncapi-2": + optional: true + "@swagger-api/apidom-ns-openapi-3-0": + optional: true + "@swagger-api/apidom-ns-openapi-3-1": + optional: true + "@swagger-api/apidom-parser-adapter-api-design-systems-json": + optional: true + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": + optional: true + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": + optional: true + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": + optional: true + "@swagger-api/apidom-parser-adapter-json": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": + optional: true + "@swagger-api/apidom-parser-adapter-yaml-1-2": + optional: true + checksum: f176e51e64377c09449e9f5bf50438be7a05fa63d4ff2f9ec5c45cf0722439537aafbe4804e2197661a652cec013c1aaa78f6a2a7ac4f6d63083aa07875c8671 + languageName: node + linkType: hard + +"@swc/core-darwin-arm64@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-darwin-arm64@npm:1.3.42" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-x64@npm:1.3.38" +"@swc/core-darwin-x64@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-darwin-x64@npm:1.3.42" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.38" +"@swc/core-linux-arm-gnueabihf@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.42" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.38" +"@swc/core-linux-arm64-gnu@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.42" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.38" +"@swc/core-linux-arm64-musl@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.42" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.38" +"@swc/core-linux-x64-gnu@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.42" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-musl@npm:1.3.38" +"@swc/core-linux-x64-musl@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-x64-musl@npm:1.3.42" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.38" +"@swc/core-win32-arm64-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.42" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.38" +"@swc/core-win32-ia32-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.42" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.38" +"@swc/core-win32-x64-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.42" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.38 - resolution: "@swc/core@npm:1.3.38" + version: 1.3.42 + resolution: "@swc/core@npm:1.3.42" dependencies: - "@swc/core-darwin-arm64": 1.3.38 - "@swc/core-darwin-x64": 1.3.38 - "@swc/core-linux-arm-gnueabihf": 1.3.38 - "@swc/core-linux-arm64-gnu": 1.3.38 - "@swc/core-linux-arm64-musl": 1.3.38 - "@swc/core-linux-x64-gnu": 1.3.38 - "@swc/core-linux-x64-musl": 1.3.38 - "@swc/core-win32-arm64-msvc": 1.3.38 - "@swc/core-win32-ia32-msvc": 1.3.38 - "@swc/core-win32-x64-msvc": 1.3.38 + "@swc/core-darwin-arm64": 1.3.42 + "@swc/core-darwin-x64": 1.3.42 + "@swc/core-linux-arm-gnueabihf": 1.3.42 + "@swc/core-linux-arm64-gnu": 1.3.42 + "@swc/core-linux-arm64-musl": 1.3.42 + "@swc/core-linux-x64-gnu": 1.3.42 + "@swc/core-linux-x64-musl": 1.3.42 + "@swc/core-win32-arm64-msvc": 1.3.42 + "@swc/core-win32-ia32-msvc": 1.3.42 + "@swc/core-win32-x64-msvc": 1.3.42 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -13971,7 +14318,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: c55d30e57638bcd21f788add8490c3f3e71bfe027aa5a8b153e1b1b9686ecddd6deeaaa6a6b17717c7eab4c1e2a232b465b6755b6c891506fc0d03139badfbf7 + checksum: 5c28c03ee6a4e1f630c4a519b56d7e23a0102f70fad977a3ab144a3da96231cf4849e473cdc9ee7be6b9266ba0838d0bc0b6b3575a75540f302befe96cc9606e languageName: node linkType: hard @@ -14005,18 +14352,18 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:4.24.10": - version: 4.24.10 - resolution: "@tanstack/query-core@npm:4.24.10" - checksum: 8268b9dca4a2ed39f8575976d8a3e2f839bb6f4fb821dc00ba8e2aeffffe2f73e23344bcc24b9cb6dae9dbfe3ba2b14c76a1e0a38b4064c83beb9aa607fd94bc +"@tanstack/query-core@npm:4.27.0": + version: 4.27.0 + resolution: "@tanstack/query-core@npm:4.27.0" + checksum: 914b4f01ac75632f4603b650e9105f64c739b79250baf76aad16cee216f7bad6060c04eda0c70838fe61a5f6c17883e19fcc3075b2433a906539da95ce785796 languageName: node linkType: hard "@tanstack/react-query@npm:^4.1.3": - version: 4.24.10 - resolution: "@tanstack/react-query@npm:4.24.10" + version: 4.28.0 + resolution: "@tanstack/react-query@npm:4.28.0" dependencies: - "@tanstack/query-core": 4.24.10 + "@tanstack/query-core": 4.27.0 use-sync-external-store: ^1.2.0 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -14027,7 +14374,7 @@ __metadata: optional: true react-native: optional: true - checksum: 576a2c73e98cf6a3c9584283989383d5ac63b01efe546cc7580ec7b1edf0c0cb8958a3071778cb0af908f5269d45c7516fa388e5f856e37f5b2d3c6110974cbe + checksum: 7baa70d22b55cfa22f8a1d92ba9f8379c5436ee81fce3f0e7df4a8c29bb26bfef4a83759cf10f752b40ae2940099fcce88ce91a773240f4999ae91136980c6e3 languageName: node linkType: hard @@ -14054,6 +14401,7 @@ __metadata: dockerode: ^3.3.1 find-process: ^1.4.5 fs-extra: ^10.0.1 + global-agent: ^3.0.0 http-proxy: ^1.18.1 nodemon: ^2.0.2 react-dev-utils: ^12.0.0-next.60 @@ -14177,15 +14525,15 @@ __metadata: languageName: node linkType: hard -"@trendyol-js/openstack-swift-sdk@npm:^0.0.5": - version: 0.0.5 - resolution: "@trendyol-js/openstack-swift-sdk@npm:0.0.5" +"@trendyol-js/openstack-swift-sdk@npm:^0.0.6": + version: 0.0.6 + resolution: "@trendyol-js/openstack-swift-sdk@npm:0.0.6" dependencies: agentkeepalive: ^4.1.4 axios: ^0.21.1 axios-cached-dns-resolve: 0.5.2 - file-type: 16.5.3 - checksum: 35a3c705aa9b3daa44bef590a8aad4ceda89106ca3368b0d1b574be5aa1f064d42fb0c26e0570481e57be2ad3296d416e27ad37303a3d95d2d65f3df0b2446df + file-type: ^16.5.4 + checksum: 999a1afa5f0dc2b1f41c1c13104f68d147c488b7ee5836581cc5acb485b9e963fb822177b6996a901339a06a9900dd8ff78ed7fd8b1d29f2c2f7809c5c54c62a languageName: node linkType: hard @@ -14236,15 +14584,6 @@ __metadata: languageName: node linkType: hard -"@types/accepts@npm:^1.3.5": - version: 1.3.5 - resolution: "@types/accepts@npm:1.3.5" - dependencies: - "@types/node": "*" - checksum: 590b7580570534a640510c071e09074cf63b5958b237a728f94322567350aea4d239f8a9d897a12b15c856b992ee4d7907e9812bb079886af2c00714e7fb3f60 - languageName: node - linkType: hard - "@types/ansi-regex@npm:^5.0.0": version: 5.0.0 resolution: "@types/ansi-regex@npm:5.0.0" @@ -14255,11 +14594,11 @@ __metadata: linkType: hard "@types/archiver@npm:^5.1.0, @types/archiver@npm:^5.3.1": - version: 5.3.1 - resolution: "@types/archiver@npm:5.3.1" + version: 5.3.2 + resolution: "@types/archiver@npm:5.3.2" dependencies: - "@types/glob": "*" - checksum: 1c6babc7f50acf5bf7fa3d5fa76bb68702e4463e6a412d259cdddff611dbbb9832ea4b2f41d675fd95ac1aa8b087daa882423073e41db9e296f14d41f2ea88e6 + "@types/readdir-glob": "*" + checksum: 9db5b4fdc1740fa07d08340ed827598cc6eda97406ac18a06a158670c7124d4120650a3b9cd660e9e39b42f033cf8f052566da32681e8ad91163473df88a3c4c languageName: node linkType: hard @@ -14343,7 +14682,7 @@ __metadata: languageName: node linkType: hard -"@types/body-parser@npm:*, @types/body-parser@npm:1.19.2, @types/body-parser@npm:^1.19.0": +"@types/body-parser@npm:*, @types/body-parser@npm:^1.19.0": version: 1.19.2 resolution: "@types/body-parser@npm:1.19.2" dependencies: @@ -14514,13 +14853,6 @@ __metadata: languageName: node linkType: hard -"@types/cors@npm:2.8.12": - version: 2.8.12 - resolution: "@types/cors@npm:2.8.12" - checksum: 8c45f112c7d1d2d831b4b266f2e6ed33a1887a35dcbfe2a18b28370751fababb7cd045e745ef84a523c33a25932678097bf79afaa367c6cb3fa0daa7a6438257 - languageName: node - linkType: hard - "@types/cors@npm:^2.8.6": version: 2.8.13 resolution: "@types/cors@npm:2.8.13" @@ -14531,12 +14863,12 @@ __metadata: linkType: hard "@types/cron@npm:^2.0.0": - version: 2.0.0 - resolution: "@types/cron@npm:2.0.0" + version: 2.0.1 + resolution: "@types/cron@npm:2.0.1" dependencies: "@types/luxon": "*" "@types/node": "*" - checksum: 392d2cfca51504140397533c30be8facd2196251074eb26ee09232a7e983144ff1d8364cd64922ed22d142686a4724934a70672fc8353b441fea729ac0ed0611 + checksum: 4268c784750a1373036b4de95cd1f35ab4fa5227c1639302eedb25a35900d7805271e33b557ad7ccccd6d1829944963df25cd0d9d0d603abf3bcdf148b69ea5d languageName: node linkType: hard @@ -14619,9 +14951,9 @@ __metadata: linkType: hard "@types/d3-selection@npm:*, @types/d3-selection@npm:^3.0.1": - version: 3.0.4 - resolution: "@types/d3-selection@npm:3.0.4" - checksum: b1e486db7f020610c854996a96b2f59a43b89d48bc7ac2ef9479f6f6e6324d3b21d7dfc8031a0b6d049a84b769b14eca65d73fc42613ab0044ef67973a9fe6ca + version: 3.0.5 + resolution: "@types/d3-selection@npm:3.0.5" + checksum: 77ea35c92273cd2d736355ab5a4cf6477086b064a1f608489a6fef4198ee6bc1d5440e5dfd880099265ac96c4f4b4fda659d89fbaaef37ba03708663196ba8ad languageName: node linkType: hard @@ -14686,9 +15018,9 @@ __metadata: linkType: hard "@types/diff@npm:^5.0.0": - version: 5.0.2 - resolution: "@types/diff@npm:5.0.2" - checksum: 8fbc419b5aca33f494026bf5f70e026f76367689677ef114f9c078ac738d7dbe96e6dda3fd8290e4a7c35281e2b60b034e3d7e3c968b850cf06a21279e7ddcbe + version: 5.0.3 + resolution: "@types/diff@npm:5.0.3" + checksum: d8a7d4de12f1aba0bd0c17b0b0d1e45c83824d3d6cc65763fbad371cd8315361a7e16fbae3f260a83bfdf30cebe1c876b42cec4518698055bc430fb09db1cbc8 languageName: node linkType: hard @@ -14703,12 +15035,12 @@ __metadata: linkType: hard "@types/dockerode@npm:^3.3.0, @types/dockerode@npm:^3.3.8": - version: 3.3.14 - resolution: "@types/dockerode@npm:3.3.14" + version: 3.3.15 + resolution: "@types/dockerode@npm:3.3.15" dependencies: "@types/docker-modem": "*" "@types/node": "*" - checksum: 6a8472622861fb0c97908963a8236d6e439c9feefc845b866326272ad0e5c33f537206fb4633424c5e3c8ec63559cb14bc737e2f88f0fcdf11496a9162d5b139 + checksum: b8fa13f86c761175a5813eb41fbd1e46d0646f008e5c84738b51c1aa82ce4f3758502efe8c3c583463e7cb7dc77e2faadfff91f4e6274e844e68a0ebf9deeae5 languageName: node linkType: hard @@ -14776,7 +15108,7 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.18, @types/express-serve-static-core@npm:^4.17.31, @types/express-serve-static-core@npm:^4.17.5": +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.30, @types/express-serve-static-core@npm:^4.17.33, @types/express-serve-static-core@npm:^4.17.5": version: 4.17.33 resolution: "@types/express-serve-static-core@npm:4.17.33" dependencies: @@ -14787,23 +15119,12 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:4.17.31": - version: 4.17.31 - resolution: "@types/express-serve-static-core@npm:4.17.31" - dependencies: - "@types/node": "*" - "@types/qs": "*" - "@types/range-parser": "*" - checksum: 009bfbe1070837454a1056aa710d0390ee5fb8c05dfe5a1691cc3e2ca88dc256f80e1ca27cb51a978681631d2f6431bfc9ec352ea46dd0c6eb183d0170bde5df - languageName: node - linkType: hard - "@types/express-session@npm:^1.17.2": - version: 1.17.6 - resolution: "@types/express-session@npm:1.17.6" + version: 1.17.7 + resolution: "@types/express-session@npm:1.17.7" dependencies: "@types/express": "*" - checksum: f5f2201d6b9568d8b9319735a4f6806b5ca144cee450274965aec54bc0a0331ba8bfffc1ad5addadf2e625769e13813a48cb5aea5b166fa05f474a12302dbb38 + checksum: 4764eafaf4e26842e891e83fa9fee30b92cc3724d91987aac3a658322f9a69fb544dae24fc3aba6e15fe9575ed862760ebecd7ff97a947afb695284967434a65 languageName: node linkType: hard @@ -14818,26 +15139,14 @@ __metadata: linkType: hard "@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.6": - version: 4.17.16 - resolution: "@types/express@npm:4.17.16" + version: 4.17.17 + resolution: "@types/express@npm:4.17.17" dependencies: "@types/body-parser": "*" - "@types/express-serve-static-core": ^4.17.31 + "@types/express-serve-static-core": ^4.17.33 "@types/qs": "*" "@types/serve-static": "*" - checksum: 43f3ed2cea6e5e83c7c1098c5152f644e975fd764443717ff9c812a1518416a9e7e9f824ffe852c118888cbfb994ed023cad08331f49b19ced469bb185cdd5cd - languageName: node - linkType: hard - -"@types/express@npm:4.17.14": - version: 4.17.14 - resolution: "@types/express@npm:4.17.14" - dependencies: - "@types/body-parser": "*" - "@types/express-serve-static-core": ^4.17.18 - "@types/qs": "*" - "@types/serve-static": "*" - checksum: 15c1af46d02de834e4a225eccaa9d85c0370fdbb3ed4e1bc2d323d24872309961542b993ae236335aeb3e278630224a6ea002078d39e651d78a3b0356b1eaa79 + checksum: 0196dacc275ac3ce89d7364885cb08e7fb61f53ca101f65886dbf1daf9b7eb05c0943e2e4bbd01b0cc5e50f37e0eea7e4cbe97d0304094411ac73e1b7998f4da languageName: node linkType: hard @@ -14908,7 +15217,7 @@ __metadata: languageName: node linkType: hard -"@types/hoist-non-react-statics@npm:^3.3.0": +"@types/hoist-non-react-statics@npm:^3.3.0, @types/hoist-non-react-statics@npm:^3.3.1": version: 3.3.1 resolution: "@types/hoist-non-react-statics@npm:3.3.1" dependencies: @@ -15336,7 +15645,7 @@ __metadata: languageName: node linkType: hard -"@types/node-fetch@npm:^2.5.0, @types/node-fetch@npm:^2.5.12, @types/node-fetch@npm:^2.5.7": +"@types/node-fetch@npm:^2.5.0, @types/node-fetch@npm:^2.5.12, @types/node-fetch@npm:^2.5.7, @types/node-fetch@npm:^2.6.1": version: 2.6.2 resolution: "@types/node-fetch@npm:2.6.2" dependencies: @@ -15369,13 +15678,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^10.1.0": - version: 10.17.60 - resolution: "@types/node@npm:10.17.60" - checksum: 2cdb3a77d071ba8513e5e8306fa64bf50e3c3302390feeaeff1fd325dd25c8441369715dfc8e3701011a72fed5958c7dfa94eb9239a81b3c286caa4d97db6eef - languageName: node - linkType: hard - "@types/node@npm:^12.7.1": version: 12.20.55 resolution: "@types/node@npm:12.20.55" @@ -15570,6 +15872,15 @@ __metadata: languageName: node linkType: hard +"@types/ramda@npm:=0.28.23": + version: 0.28.23 + resolution: "@types/ramda@npm:0.28.23" + dependencies: + ts-toolbelt: ^6.15.1 + checksum: 61d7416c0f4f189c6524e093c7546ca2f159553e54d7933836d46aac1332611aa7b02fd8c8bfa98c0865f262fd9e99e06e3d9538deba0bab1f6153cbcf841160 + languageName: node + linkType: hard + "@types/range-parser@npm:*": version: 1.2.3 resolution: "@types/range-parser@npm:1.2.3" @@ -15681,6 +15992,15 @@ __metadata: languageName: node linkType: hard +"@types/readdir-glob@npm:*": + version: 1.1.0 + resolution: "@types/readdir-glob@npm:1.1.0" + dependencies: + "@types/node": "*" + checksum: 98cabfac6beddd3aeb3624e05d57b8dd1354431e436e9e795aaf74ddf2f1c23342d7b8df7586cc3d1374ceeee0d7975638fae97cb1739572d8a4067ebebb91d9 + languageName: node + linkType: hard + "@types/recharts@npm:^1.8.14, @types/recharts@npm:^1.8.15": version: 1.8.23 resolution: "@types/recharts@npm:1.8.23" @@ -15781,11 +16101,11 @@ __metadata: linkType: hard "@types/sanitize-html@npm:^2.6.2": - version: 2.8.1 - resolution: "@types/sanitize-html@npm:2.8.1" + version: 2.9.0 + resolution: "@types/sanitize-html@npm:2.9.0" dependencies: htmlparser2: ^8.0.0 - checksum: 9c07d3a9d925e291472f74b097fb179b32659ea01834f728887811e5fc75cf2b17d844e32e97c0e583eba993af86a3f8250c82c8fa3152abf9ff2a8582972906 + checksum: b60f42b740bbfb1b1434ce8b43925a38ecc608b60aa654fd009d2e22e33f324b61d370768c55bd2fd98e03de08518ffa8911d61606c483526fb931bb8b59d1b0 languageName: node linkType: hard @@ -16050,6 +16370,13 @@ __metadata: languageName: node linkType: hard +"@types/use-sync-external-store@npm:^0.0.3": + version: 0.0.3 + resolution: "@types/use-sync-external-store@npm:0.0.3" + checksum: 161ddb8eec5dbe7279ac971531217e9af6b99f7783213566d2b502e2e2378ea19cf5e5ea4595039d730aa79d3d35c6567d48599f69773a02ffcff1776ec2a44e + languageName: node + linkType: hard + "@types/uuid@npm:^8.0.0": version: 8.3.4 resolution: "@types/uuid@npm:8.3.4" @@ -16347,9 +16674,9 @@ __metadata: languageName: node linkType: hard -"@uiw/codemirror-extensions-basic-setup@npm:4.19.9": - version: 4.19.9 - resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.19.9" +"@uiw/codemirror-extensions-basic-setup@npm:4.19.10": + version: 4.19.10 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.19.10" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/commands": ^6.0.0 @@ -16366,19 +16693,19 @@ __metadata: "@codemirror/search": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: f248d1623f33b88b61dd75955441d1b5925b2b2c78d595eac1d4603dc31f107d5973d9cff42c3ade4a2493828d679a8908e5dad03a570511e6095d0028089f85 + checksum: 2eca6545f29699bf938238f089a08c7134e04611473a338c7a59377ca1b0ebdfddb73402819921fc718c317fa52c0c473188e4dea20007e5ac68c83caaaa83f0 languageName: node linkType: hard "@uiw/react-codemirror@npm:^4.9.3": - version: 4.19.9 - resolution: "@uiw/react-codemirror@npm:4.19.9" + version: 4.19.10 + resolution: "@uiw/react-codemirror@npm:4.19.10" 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.19.9 + "@uiw/codemirror-extensions-basic-setup": 4.19.10 codemirror: ^6.0.0 peerDependencies: "@babel/runtime": ">=7.11.0" @@ -16388,7 +16715,7 @@ __metadata: codemirror: ">=6.0.0" react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: ed0d9a7b927df718535bccf553fa7cdabd2cb776f74e6ae75eab0ba321bc60468b5f1b8576a12543729770a11e5438fd4fc925f3f74643985c34a2184c5ae7f6 + checksum: 3210787e4ec717c1945ef31b8a7f066bc1b326da6e63f295f8bb790aa200359151e791ebc3420afbf9f615c03509a17fae62f4ab7eaeb1dec51f074a26ac9e08 languageName: node linkType: hard @@ -16611,6 +16938,33 @@ __metadata: languageName: node linkType: hard +"@wry/context@npm:^0.7.0": + version: 0.7.0 + resolution: "@wry/context@npm:0.7.0" + dependencies: + tslib: ^2.3.0 + checksum: f4ff78023a0b949122037aae766232b7d2284dc415204d22d9ea6d7969ff8f5f29b18128bc9a40e68dc054c8a12b1bf5868a357fdb50c398c447290c3a5b0496 + languageName: node + linkType: hard + +"@wry/equality@npm:^0.5.0": + version: 0.5.3 + resolution: "@wry/equality@npm:0.5.3" + dependencies: + tslib: ^2.3.0 + checksum: 7ea8ded51462911217183b93cc3ffbb4d18dc02a62d4a79e0d9983463739bf54106aaeb25649bf33168120bd044b61d135018bfcf4fefad8099c13eac9238aa6 + languageName: node + linkType: hard + +"@wry/trie@npm:^0.3.0": + version: 0.3.2 + resolution: "@wry/trie@npm:0.3.2" + dependencies: + tslib: ^2.3.0 + checksum: 151d06b519e1ff1c3acf6ee6846161b1d7d50bbecd4c48e5cd1b05f9e37c30602aff02e88f20105f6e6c54ae4123f9c4eb7715044d7fd927d4ba4ec3e755cd36 + languageName: node + linkType: hard + "@xmldom/xmldom@npm:^0.7.0, @xmldom/xmldom@npm:^0.7.5, @xmldom/xmldom@npm:^0.7.6": version: 0.7.9 resolution: "@xmldom/xmldom@npm:0.7.9" @@ -16700,7 +17054,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:^1.3.5, accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": +"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -17000,137 +17354,6 @@ __metadata: languageName: node linkType: hard -"apollo-datasource@npm:^3.3.2": - version: 3.3.2 - resolution: "apollo-datasource@npm:3.3.2" - dependencies: - "@apollo/utils.keyvaluecache": ^1.0.1 - apollo-server-env: ^4.2.1 - checksum: 70244e792655b357213b92e9dd0e8ca553724857847c9bedb53a1dbf7a92fc0d8b05a60d77203d6c30331599b44c5d7cc5f4d94c934465fa05b146b681ed2293 - languageName: node - linkType: hard - -"apollo-reporting-protobuf@npm:^3.3.1, apollo-reporting-protobuf@npm:^3.4.0": - version: 3.4.0 - resolution: "apollo-reporting-protobuf@npm:3.4.0" - dependencies: - "@apollo/protobufjs": 1.2.6 - checksum: 5bf50e9cecd3c2334cd12e0ebe59be6c4d7b1b9ee443c7d913011ea1b84513f57561fb6c3ceb66083321acb6d1c56f72e2ab0edf378cf742693409eb8dcdc46b - languageName: node - linkType: hard - -"apollo-server-core@npm:^3.12.0": - version: 3.12.0 - resolution: "apollo-server-core@npm:3.12.0" - dependencies: - "@apollo/utils.keyvaluecache": ^1.0.1 - "@apollo/utils.logger": ^1.0.0 - "@apollo/utils.usagereporting": ^1.0.0 - "@apollographql/apollo-tools": ^0.5.3 - "@apollographql/graphql-playground-html": 1.6.29 - "@graphql-tools/mock": ^8.1.2 - "@graphql-tools/schema": ^8.0.0 - "@josephg/resolvable": ^1.0.0 - apollo-datasource: ^3.3.2 - apollo-reporting-protobuf: ^3.4.0 - apollo-server-env: ^4.2.1 - apollo-server-errors: ^3.3.1 - apollo-server-plugin-base: ^3.7.2 - apollo-server-types: ^3.8.0 - async-retry: ^1.2.1 - fast-json-stable-stringify: ^2.1.0 - graphql-tag: ^2.11.0 - loglevel: ^1.6.8 - lru-cache: ^6.0.0 - node-abort-controller: ^3.0.1 - sha.js: ^2.4.11 - uuid: ^9.0.0 - whatwg-mimetype: ^3.0.0 - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: b7a37a78901d38a330c9df8fe870da3dcf512f43ab60fdf9ab0ba37be03977db5d4b72eabf51a830d2a9dcfb2974d7bfbc5aa8719e3afac113c8bd7222740b8f - languageName: node - linkType: hard - -"apollo-server-env@npm:^4.2.1": - version: 4.2.1 - resolution: "apollo-server-env@npm:4.2.1" - dependencies: - node-fetch: ^2.6.7 - checksum: 039c7eeed82aff072237f9943629ab24b7c62b97535d756a31178f9e7352187951ee654a377d49d775d2ac221fe024914d9989257ca8a7e65c8e5f438c044f18 - languageName: node - linkType: hard - -"apollo-server-errors@npm:^3.3.1": - version: 3.3.1 - resolution: "apollo-server-errors@npm:3.3.1" - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: d09b66e7ac3e2cbc60774280d30118ac4d98f945b5cc1013bb81b9970aae49c0717a550e161fe978d69d7039ec053aeba495890f6eebf452532a2c5e94071a80 - languageName: node - linkType: hard - -"apollo-server-express@npm:^3.0.0, apollo-server-express@npm:^3.12.0": - version: 3.12.0 - resolution: "apollo-server-express@npm:3.12.0" - dependencies: - "@types/accepts": ^1.3.5 - "@types/body-parser": 1.19.2 - "@types/cors": 2.8.12 - "@types/express": 4.17.14 - "@types/express-serve-static-core": 4.17.31 - accepts: ^1.3.5 - apollo-server-core: ^3.12.0 - apollo-server-types: ^3.8.0 - body-parser: ^1.19.0 - cors: ^2.8.5 - parseurl: ^1.3.3 - peerDependencies: - express: ^4.17.1 - graphql: ^15.3.0 || ^16.0.0 - checksum: bd4bc213f506e2aeb2be961961de51e431f8774344b349e9b02f475714a623703eb62423ad968a8f8b6859919ae0d1912c40cf15a4df24e6f81b4f4c5653e70b - languageName: node - linkType: hard - -"apollo-server-plugin-base@npm:^3.7.2": - version: 3.7.2 - resolution: "apollo-server-plugin-base@npm:3.7.2" - dependencies: - apollo-server-types: ^3.8.0 - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: d6ea6dbfad8bb82959286eae89878ccccbd09743c3df2b76bf790f470cbf5441ba06dcb6835a25f0bf32f4df05722cce157ae983ce32db4b69de8a72c9949e2e - languageName: node - linkType: hard - -"apollo-server-types@npm:^3.8.0": - version: 3.8.0 - resolution: "apollo-server-types@npm:3.8.0" - dependencies: - "@apollo/utils.keyvaluecache": ^1.0.1 - "@apollo/utils.logger": ^1.0.0 - apollo-reporting-protobuf: ^3.4.0 - apollo-server-env: ^4.2.1 - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: 20accd42b65ceb95819a1610c410488fbe548ee309227d7fa22fd17dd1205e557091ba9c9a20efa532192098a4193e34eb58fc91d762b55fdf31229ac9fc7133 - languageName: node - linkType: hard - -"apollo-server@npm:^3.0.0": - version: 3.12.0 - resolution: "apollo-server@npm:3.12.0" - dependencies: - "@types/express": 4.17.14 - apollo-server-core: ^3.12.0 - apollo-server-express: ^3.12.0 - express: ^4.17.1 - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: 6f3dade76f202f04a890b2385923a0319a859a0ab48121b1636e22d5eae83afe042d7a0a501aff3d8816e67de4f29f8efa598e350814a40f41d079610dee346e - languageName: node - linkType: hard - "aproba@npm:^1.0.3": version: 1.2.0 resolution: "aproba@npm:1.2.0" @@ -17519,20 +17742,6 @@ __metadata: languageName: node linkType: hard -"aws-lambda@npm:^1.0.7": - version: 1.0.7 - resolution: "aws-lambda@npm:1.0.7" - dependencies: - aws-sdk: ^2.814.0 - commander: ^3.0.2 - js-yaml: ^3.14.1 - watchpack: ^2.0.0-beta.10 - bin: - lambda: bin/lambda - checksum: 11316e87b5c4fc36e6bd0495742a3c0ed13befc9527a7b251a58180d141d9afd68b684f37aeb3b53d117d3c2f96747eace31826b683543f1edddc03f392865fd - languageName: node - linkType: hard - "aws-os-connection@npm:^0.2.0": version: 0.2.0 resolution: "aws-os-connection@npm:0.2.0" @@ -17546,25 +17755,25 @@ __metadata: linkType: hard "aws-sdk-client-mock-jest@npm:^2.0.0": - version: 2.1.0 - resolution: "aws-sdk-client-mock-jest@npm:2.1.0" + version: 2.1.1 + resolution: "aws-sdk-client-mock-jest@npm:2.1.1" dependencies: "@types/jest": ^28.1.3 tslib: ^2.1.0 peerDependencies: - aws-sdk-client-mock: 2.1.0 - checksum: 567e2084d71c90f71e5bfa82f2a4b592fec5ea818cb4edf3586f922454cee4fec1403d4161d3d91a3db3ccebe1db5babe069754d76204c7f6986ab71bafb1084 + aws-sdk-client-mock: 2.1.1 + checksum: 4b5ca96bbcaa60ea3ea947821c7ff1f073c1342a12ce5c778b70832bdcc6106e10591e98e09b22c5b0d83dfc6fe554e8a08d5df5cf067a7eaadb804087b891ed languageName: node linkType: hard "aws-sdk-client-mock@npm:^2.0.0": - version: 2.1.0 - resolution: "aws-sdk-client-mock@npm:2.1.0" + version: 2.1.1 + resolution: "aws-sdk-client-mock@npm:2.1.1" dependencies: "@types/sinon": ^10.0.10 sinon: ^14.0.2 tslib: ^2.1.0 - checksum: c6179c5528709ff1ad7e7308d03c74850fb5b973ca3d63836ca9973ca70de0c3dd7846fcbd3fd02bf4dabe6cae1095683b38c4202878458c8369e7e837962cd2 + checksum: 8330b88cdaeae401390ece094344ed727db0b007369d862a88afc0a29249828b95cce809faa0c2289c1af99528af0e765b4aba8156b948d01a12299390195cea languageName: node linkType: hard @@ -17579,7 +17788,7 @@ __metadata: languageName: node linkType: hard -"aws-sdk@npm:^2.1231.0, aws-sdk@npm:^2.814.0, aws-sdk@npm:^2.840.0, aws-sdk@npm:^2.948.0": +"aws-sdk@npm:^2.1231.0, aws-sdk@npm:^2.840.0, aws-sdk@npm:^2.948.0": version: 2.1279.0 resolution: "aws-sdk@npm:2.1279.0" dependencies: @@ -17641,6 +17850,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:=1.3.4": + version: 1.3.4 + resolution: "axios@npm:1.3.4" + dependencies: + follow-redirects: ^1.15.0 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: 7440edefcf8498bc3cdf39de00443e8101f249972c83b739c6e880d9d669fea9486372dbe8739e88b3bf8bb1ad15f6106693f206f078f4516fe8fd47b1c3093c + languageName: node + linkType: hard + "axios@npm:^0.21.1": version: 0.21.4 resolution: "axios@npm:0.21.4" @@ -18001,13 +18221,13 @@ __metadata: linkType: hard "better-sqlite3@npm:^8.0.0": - version: 8.1.0 - resolution: "better-sqlite3@npm:8.1.0" + version: 8.2.0 + resolution: "better-sqlite3@npm:8.2.0" dependencies: bindings: ^1.5.0 node-gyp: latest prebuild-install: ^7.1.0 - checksum: 7e6b4c33142f4b2ee2e60d3926b4db682feb0d09554efdaf7bea53cd5bef406ca0a5115ab9b411458daa45ba14973252ebd6853a3cdf94e4fd49cc8291730ade + checksum: ab8a00bcc33c4a7467f78fcbb103c784705cf170ecc9c8eb1149a89a2153c03a7f65681064667eb214fa7f555797abd8183380a0396ce04eaf36efef921ce103 languageName: node linkType: hard @@ -18127,7 +18347,7 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.1, body-parser@npm:^1.19.0": +"body-parser@npm:1.20.1": version: 1.20.1 resolution: "body-parser@npm:1.20.1" dependencies: @@ -18147,6 +18367,26 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:^1.20.0": + version: 1.20.2 + resolution: "body-parser@npm:1.20.2" + dependencies: + bytes: 3.1.2 + content-type: ~1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: ~1.6.18 + unpipe: 1.0.0 + checksum: 14d37ec638ab5c93f6099ecaed7f28f890d222c650c69306872e00b9efa081ff6c596cd9afb9930656aae4d6c4e1c17537bea12bb73c87a217cb3cfea8896737 + languageName: node + linkType: hard + "bonjour-service@npm:^1.0.11": version: 1.0.11 resolution: "bonjour-service@npm:1.0.11" @@ -18749,6 +18989,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:5.2.0": + version: 5.2.0 + resolution: "chalk@npm:5.2.0" + checksum: 03d8060277de6cf2fd567dc25fcf770593eb5bb85f460ce443e49255a30ff1242edd0c90a06a03803b0466ff0687a939b41db1757bec987113e83de89a003caa + languageName: node + linkType: hard + "chalk@npm:^3.0.0": version: 3.0.0 resolution: "chalk@npm:3.0.0" @@ -19430,10 +19677,10 @@ __metadata: languageName: node linkType: hard -"commander@npm:*, commander@npm:^9.1.0, commander@npm:^9.4.1, commander@npm:^9.5.0": - version: 9.5.0 - resolution: "commander@npm:9.5.0" - checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade +"commander@npm:*, commander@npm:^10.0.0": + version: 10.0.0 + resolution: "commander@npm:10.0.0" + checksum: 9f6495651f878213005ac744dd87a85fa3d9f2b8b90d1c19d0866d666bda7f735adfd7c2f10dfff345782e2f80ea258f98bb4efcef58e4e502f25f883940acfd languageName: node linkType: hard @@ -19451,20 +19698,13 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.20.0, commander@npm:^2.20.3, commander@npm:^2.7.1": +"commander@npm:^2.20.0, commander@npm:^2.7.1": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e languageName: node linkType: hard -"commander@npm:^3.0.2": - version: 3.0.2 - resolution: "commander@npm:3.0.2" - checksum: 6d14ad030d1904428139487ed31febcb04c1604db2b8d9fae711f60ee6718828dc0e11602249e91c8a97b0e721e9c6d53edbc166bad3cde1596851d59a8f824d - languageName: node - linkType: hard - "commander@npm:^4.0.0": version: 4.1.1 resolution: "commander@npm:4.1.1" @@ -19486,6 +19726,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^9.1.0, commander@npm:^9.5.0": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade + languageName: node + linkType: hard + "common-ancestor-path@npm:^1.0.1": version: 1.0.1 resolution: "common-ancestor-path@npm:1.0.1" @@ -19738,10 +19985,10 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4": - version: 1.0.4 - resolution: "content-type@npm:1.0.4" - checksum: 3d93585fda985d1554eca5ebd251994327608d2e200978fdbfba21c0c679914d5faf266d17027de44b34a72c7b0745b18584ecccaa7e1fdfb6a68ac7114f12e0 +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 languageName: node linkType: hard @@ -19825,10 +20072,10 @@ __metadata: languageName: node linkType: hard -"core-js-pure@npm:^3.20.2, core-js-pure@npm:^3.23.3, core-js-pure@npm:^3.6.5": - version: 3.25.5 - resolution: "core-js-pure@npm:3.25.5" - checksum: e48799a8ab28f00ef3db18377142ff2c578574ab2b18ebddde6cbf12823e0181a57c80e3caa6046ce2a2e439d603a252be767583ddc54248e3d1060bc5012127 +"core-js-pure@npm:^3.23.3, core-js-pure@npm:^3.25.1, core-js-pure@npm:^3.6.5": + version: 3.29.1 + resolution: "core-js-pure@npm:3.29.1" + checksum: 2ed91f79c13f23c1b70c31edf4224aca99a9ac3db38c79127798c294a36faac0ea0b21070218621741057cf84b3dadff595475580c1fac3a43e02cae575dc27b languageName: node linkType: hard @@ -19847,9 +20094,9 @@ __metadata: linkType: hard "core-js@npm:^3.6.5": - version: 3.28.0 - resolution: "core-js@npm:3.28.0" - checksum: 3155fd0ec16d0089106b145e9595280a4ea4bde0d7ff26aa14364cd4f1c203baf6620c3025acd284f363d08b9f21104101692766ca9a36ffeee7307bdf3e1881 + version: 3.29.1 + resolution: "core-js@npm:3.29.1" + checksum: b38446dbfcfd3887b3d4922990da487e2c95044cb4c5717aaf95e786a4c6b218f05c056c7ed6c699169b9794a49fec890e402659d54661fc56965a0eb717e7bd languageName: node linkType: hard @@ -19870,18 +20117,6 @@ __metadata: languageName: node linkType: hard -"cosmiconfig-typescript-loader@npm:^4.3.0": - version: 4.3.0 - resolution: "cosmiconfig-typescript-loader@npm:4.3.0" - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=7" - ts-node: ">=10" - typescript: ">=3" - checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb - languageName: node - linkType: hard - "cosmiconfig@npm:8.0.0": version: 8.0.0 resolution: "cosmiconfig@npm:8.0.0" @@ -20004,20 +20239,20 @@ __metadata: linkType: hard "cron@npm:^2.0.0": - version: 2.2.0 - resolution: "cron@npm:2.2.0" + version: 2.3.0 + resolution: "cron@npm:2.3.0" dependencies: luxon: ^3.2.1 - checksum: 53905d0f55e052742cf4fed34598a4ebfc311f4f9143c90384225bb4376fa639cd12f485cbf5d3dca00db377bf5117f27a1cae405f15e4745d1f69808e4fb9ac + checksum: 70b220f3fc4b6bcd594f7f2c690bbf7a3a03b0e081eb0119f8e3ca21635f2da07d89e038d561d4c0742c8b0dd04977f25e307d0608455ef9f527a556b2da92fc languageName: node linkType: hard "cronstrue@npm:^2.2.0": - version: 2.23.0 - resolution: "cronstrue@npm:2.23.0" + version: 2.24.0 + resolution: "cronstrue@npm:2.24.0" bin: cronstrue: bin/cli.js - checksum: 050140ac6452468d6f9032f18038f41b16968502d411a996efd5d42243cfd882271ff20ed4a3cdb25c45bf8f88beeb0579e45e974a11987401e9d383af2641a8 + checksum: 2c7d4cfe43bec7b57b1824772641271bb5f5ed0209336ea53796f97b17966dd95cf15ae890f7c2494f639ba489d225bfb882950cda0ec7e5453fa7bf236842dd languageName: node linkType: hard @@ -20175,6 +20410,19 @@ __metadata: languageName: node linkType: hard +"css-select@npm:^5.1.0": + version: 5.1.0 + resolution: "css-select@npm:5.1.0" + dependencies: + boolbase: ^1.0.0 + css-what: ^6.1.0 + domhandler: ^5.0.2 + domutils: ^3.0.1 + nth-check: ^2.0.1 + checksum: 2772c049b188d3b8a8159907192e926e11824aea525b8282981f72ba3f349cf9ecd523fdf7734875ee2cb772246c22117fc062da105b6d59afe8dcd5c99c9bda + languageName: node + linkType: hard + "css-to-react-native@npm:^3.0.0": version: 3.0.0 resolution: "css-to-react-native@npm:3.0.0" @@ -20229,6 +20477,13 @@ __metadata: languageName: node linkType: hard +"css-what@npm:^6.1.0": + version: 6.1.0 + resolution: "css-what@npm:6.1.0" + checksum: b975e547e1e90b79625918f84e67db5d33d896e6de846c9b584094e529f0c63e2ab85ee33b9daffd05bff3a146a1916bec664e18bb76dd5f66cbff9fc13b2bbe + languageName: node + linkType: hard + "css.escape@npm:1.5.1, css.escape@npm:^1.5.1": version: 1.5.1 resolution: "css.escape@npm:1.5.1" @@ -20245,13 +20500,6 @@ __metadata: languageName: node linkType: hard -"cssfilter@npm:0.0.10": - version: 0.0.10 - resolution: "cssfilter@npm:0.0.10" - checksum: bc2c52bbb3426c3f2e4832edb6f8573e6cfa65b40b540932762d1e018f0f0157725e2991b77344bbc8266c6bbf4daa2803b0707cfb1bd0877505bf83a68e4b04 - languageName: node - linkType: hard - "cssnano-preset-default@npm:^5.1.7": version: 5.1.7 resolution: "cssnano-preset-default@npm:5.1.7" @@ -20702,7 +20950,7 @@ __metadata: languageName: node linkType: hard -"dataloader@npm:^2.0.0": +"dataloader@npm:2.2.2, dataloader@npm:^2.0.0, dataloader@npm:^2.2.2": version: 2.2.2 resolution: "dataloader@npm:2.2.2" checksum: 4dabd247089c29f194e94d5434d504f99156c5c214a03463c20f3f17f40398d7e179edee69a27c16e315519ac8739042a810090087ae26449a0e685156a02c65 @@ -20899,10 +21147,10 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.2.2, deepmerge@npm:~4.2.2": - version: 4.2.2 - resolution: "deepmerge@npm:4.2.2" - checksum: a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b +"deepmerge@npm:^4.2.2, deepmerge@npm:~4.3.0": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 languageName: node linkType: hard @@ -21211,13 +21459,13 @@ __metadata: linkType: hard "dockerode@npm:^3.3.1": - version: 3.3.4 - resolution: "dockerode@npm:3.3.4" + version: 3.3.5 + resolution: "dockerode@npm:3.3.5" dependencies: "@balena/dockerignore": ^1.0.2 docker-modem: ^3.0.0 tar-fs: ~2.0.1 - checksum: 6cb4b9d1c42feb3acfa77daf103b070cc412351dc7dc0a1553cc774ccd1be1a1412a87f8aa13c3155c63ec5c61a7cadc833b4248c4d8342814bbf708f795b952 + checksum: 7f6650422b07fa7ea9d5801f04b1a432634446b5fe37b995b8302b953b64e93abf1bb4596c2fb574ba47aafee685ef2ab959cc86c9654add5a26d09541bbbcc6 languageName: node linkType: hard @@ -21354,9 +21602,9 @@ __metadata: linkType: hard "dompurify@npm:^2.2.7, dompurify@npm:^2.2.9, dompurify@npm:^2.3.6": - version: 2.4.3 - resolution: "dompurify@npm:2.4.3" - checksum: b440981f2a38cada2085759cc3d1e2f94571afc34343d011a8a6aa1ad91ae6abf651adbfa4994b0e2283f0ce81f7891cdb04b67d0b234c8d190cb70e9691f026 + version: 2.4.5 + resolution: "dompurify@npm:2.4.5" + checksum: d6d3c3b320f15cdb5b26aa1902c3275a3ab2c3705a9df4420bb94691d7c4df67959ec7b91e486c308320791b0ee000456f042734c45d76721e61c2768eac706e languageName: node linkType: hard @@ -21524,8 +21772,8 @@ __metadata: linkType: hard "elastic-builder@npm:^2.16.0": - version: 2.17.3 - resolution: "elastic-builder@npm:2.17.3" + version: 2.18.1 + resolution: "elastic-builder@npm:2.18.1" dependencies: lodash.has: ^4.5.2 lodash.hasin: ^4.5.2 @@ -21535,7 +21783,7 @@ __metadata: lodash.isobject: ^3.0.2 lodash.isstring: ^4.0.1 lodash.omit: ^4.5.0 - checksum: b1e47ad4d36e9974a1075e9e4f455e2d120eebc16d9e5c7e7219e89fcb64bcacd3015afddeae479a79f6b4cd92c4528f3e8535c9c9ca8d644286b9bb49635cdc + checksum: 54093daadc1fc3666ac8eef0a268267761e92a3fbb524e51936cf944ceeaeb231a269fc8ae9fb902ca41c976c76c0c037da692a34577d705da301ed727bd8e07 languageName: node linkType: hard @@ -22037,31 +22285,31 @@ __metadata: linkType: hard "esbuild@npm:^0.17.0": - version: 0.17.11 - resolution: "esbuild@npm:0.17.11" + version: 0.17.14 + resolution: "esbuild@npm:0.17.14" dependencies: - "@esbuild/android-arm": 0.17.11 - "@esbuild/android-arm64": 0.17.11 - "@esbuild/android-x64": 0.17.11 - "@esbuild/darwin-arm64": 0.17.11 - "@esbuild/darwin-x64": 0.17.11 - "@esbuild/freebsd-arm64": 0.17.11 - "@esbuild/freebsd-x64": 0.17.11 - "@esbuild/linux-arm": 0.17.11 - "@esbuild/linux-arm64": 0.17.11 - "@esbuild/linux-ia32": 0.17.11 - "@esbuild/linux-loong64": 0.17.11 - "@esbuild/linux-mips64el": 0.17.11 - "@esbuild/linux-ppc64": 0.17.11 - "@esbuild/linux-riscv64": 0.17.11 - "@esbuild/linux-s390x": 0.17.11 - "@esbuild/linux-x64": 0.17.11 - "@esbuild/netbsd-x64": 0.17.11 - "@esbuild/openbsd-x64": 0.17.11 - "@esbuild/sunos-x64": 0.17.11 - "@esbuild/win32-arm64": 0.17.11 - "@esbuild/win32-ia32": 0.17.11 - "@esbuild/win32-x64": 0.17.11 + "@esbuild/android-arm": 0.17.14 + "@esbuild/android-arm64": 0.17.14 + "@esbuild/android-x64": 0.17.14 + "@esbuild/darwin-arm64": 0.17.14 + "@esbuild/darwin-x64": 0.17.14 + "@esbuild/freebsd-arm64": 0.17.14 + "@esbuild/freebsd-x64": 0.17.14 + "@esbuild/linux-arm": 0.17.14 + "@esbuild/linux-arm64": 0.17.14 + "@esbuild/linux-ia32": 0.17.14 + "@esbuild/linux-loong64": 0.17.14 + "@esbuild/linux-mips64el": 0.17.14 + "@esbuild/linux-ppc64": 0.17.14 + "@esbuild/linux-riscv64": 0.17.14 + "@esbuild/linux-s390x": 0.17.14 + "@esbuild/linux-x64": 0.17.14 + "@esbuild/netbsd-x64": 0.17.14 + "@esbuild/openbsd-x64": 0.17.14 + "@esbuild/sunos-x64": 0.17.14 + "@esbuild/win32-arm64": 0.17.14 + "@esbuild/win32-ia32": 0.17.14 + "@esbuild/win32-x64": 0.17.14 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -22109,7 +22357,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: febf218155513bb9c9c970508c03ec58e0aacfdc23394f425836a09f1da0dae0afa12949274adfd382782eef097f86b2d6b3032293062291f2f471de204f77ec + checksum: 8f4c05f5d3da04f05c48d65f60f3c6422253f406cd56a7ab7a898f0971b0366c454635a6340172874950771dc005a9928dd999b732a6d4caa504b537bfcbf2ff languageName: node linkType: hard @@ -22271,13 +22519,13 @@ __metadata: linkType: hard "eslint-config-prettier@npm:^8.3.0": - version: 8.6.0 - resolution: "eslint-config-prettier@npm:8.6.0" + version: 8.8.0 + resolution: "eslint-config-prettier@npm:8.8.0" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: ff0d0dfc839a556355422293428637e8d35693de58dabf8638bf0b6529131a109d0b2ade77521aa6e54573bb842d7d9d322e465dd73dd61c7590fa3834c3fa81 + checksum: 1e94c3882c4d5e41e1dcfa2c368dbccbfe3134f6ac7d40101644d3bfbe3eb2f2ffac757f3145910b5eacf20c0e85e02b91293d3126d770cbf3dc390b3564681c languageName: node linkType: hard @@ -22831,7 +23079,7 @@ __metadata: "@internal/plugin-catalog-customized": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 + "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 "@oriflame/backstage-plugin-score-card": ^0.6.0 "@roadiehq/backstage-plugin-buildkite": ^2.0.8 @@ -22870,6 +23118,12 @@ __metadata: "@backstage/plugin-app-backend": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/plugin-search-backend": "workspace:^" + "@backstage/plugin-search-backend-module-catalog": "workspace:^" + "@backstage/plugin-search-backend-module-explore": "workspace:^" + "@backstage/plugin-search-backend-module-techdocs": "workspace:^" + "@backstage/plugin-search-backend-node": "workspace:^" + "@backstage/plugin-techdocs-backend": "workspace:^" "@backstage/plugin-todo-backend": "workspace:^" languageName: unknown linkType: soft @@ -22978,20 +23232,20 @@ __metadata: languageName: node linkType: hard -"execa@npm:^6.1.0": - version: 6.1.0 - resolution: "execa@npm:6.1.0" +"execa@npm:^7.0.0": + version: 7.0.0 + resolution: "execa@npm:7.0.0" dependencies: cross-spawn: ^7.0.3 get-stream: ^6.0.1 - human-signals: ^3.0.1 + human-signals: ^4.3.0 is-stream: ^3.0.0 merge-stream: ^2.0.0 npm-run-path: ^5.1.0 onetime: ^6.0.0 signal-exit: ^3.0.7 strip-final-newline: ^3.0.0 - checksum: 1a4af799839134f5c72eb63d525b87304c1114a63aa71676c91d57ccef2e26f2f53e14c11384ab11c4ec479be1efa83d11c8190e00040355c2c5c3364327fa8e + checksum: be7c7b6d1e5473f628e46888b0cf8279da483c1a6000dd494a2059cc26591ded57ba46be1c9bdde1ec895e7eb8b18911174aba425cd971d41d140a9405da9a02 languageName: node linkType: hard @@ -23447,14 +23701,14 @@ __metadata: languageName: node linkType: hard -"file-type@npm:16.5.3": - version: 16.5.3 - resolution: "file-type@npm:16.5.3" +"file-type@npm:^16.5.4": + version: 16.5.4 + resolution: "file-type@npm:16.5.4" dependencies: readable-web-to-node-stream: ^3.0.0 strtok3: ^6.2.4 token-types: ^4.1.1 - checksum: 38a4443d0f7b9b3de8a44a1d75d441f9ddb544a1adbf22ec7bc07d135452c3464000c64daa51220ffec6a38ceec7565a1290337bd81aab2e6273c79db5ed9ef3 + checksum: d983c0f36491c57fcb6cc70fcb02c36d6b53f312a15053263e1924e28ca8314adf0db32170801ad777f09432c32155f31715ceaee66310947731588120d7ec27 languageName: node linkType: hard @@ -23660,7 +23914,7 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.14.9": +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.0": version: 1.15.2 resolution: "follow-redirects@npm:1.15.2" peerDependenciesMeta: @@ -24228,7 +24482,7 @@ __metadata: languageName: node linkType: hard -"git-url-parse@npm:^13.0.0": +"git-url-parse@npm:^13.0.0, git-url-parse@npm:^13.1.0": version: 13.1.0 resolution: "git-url-parse@npm:13.1.0" dependencies: @@ -24444,7 +24698,7 @@ __metadata: languageName: node linkType: hard -"google-gax@npm:^3.5.2, google-gax@npm:^3.5.3": +"google-gax@npm:^3.5.2, google-gax@npm:^3.5.7": version: 3.5.7 resolution: "google-gax@npm:3.5.7" dependencies: @@ -24556,9 +24810,9 @@ __metadata: languageName: node linkType: hard -"graphql-config@npm:^4.4.0": - version: 4.4.0 - resolution: "graphql-config@npm:4.4.0" +"graphql-config@npm:^4.5.0": + version: 4.5.0 + resolution: "graphql-config@npm:4.5.0" dependencies: "@graphql-tools/graphql-file-loader": ^7.3.7 "@graphql-tools/json-file-loader": ^7.3.7 @@ -24567,14 +24821,17 @@ __metadata: "@graphql-tools/url-loader": ^7.9.7 "@graphql-tools/utils": ^9.0.0 cosmiconfig: 8.0.0 - minimatch: 4.2.1 + jiti: 1.17.1 + minimatch: 4.2.3 string-env-interpolation: 1.0.1 tslib: ^2.4.0 peerDependencies: cosmiconfig-toml-loader: ^1.0.0 - cosmiconfig-typescript-loader: ^4.0.0 graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 2f8cbb4710a7c0a411074eb843317bc66e5602fdab7eefa9765812d986d4b04fc2d285d3c0811ed0efaef12ea58351676561d704e79880f5848ed970badab500 + peerDependenciesMeta: + cosmiconfig-toml-loader: + optional: true + checksum: 8ab1a3ce3534598ddac2df213b6af2eecd9ebcca2268d39cc3e87a6e55749483389a6df222e9e0acd638dd2479378a5c8e8d90f980e6a54e700c4c4ae3522123 languageName: node linkType: hard @@ -24593,16 +24850,16 @@ __metadata: linkType: hard "graphql-modules@npm:^2.0.0": - version: 2.1.0 - resolution: "graphql-modules@npm:2.1.0" + version: 2.1.2 + resolution: "graphql-modules@npm:2.1.2" dependencies: - "@graphql-tools/schema": ^8.3.1 - "@graphql-tools/wrap": ^8.3.1 + "@graphql-tools/schema": ^9.0.0 + "@graphql-tools/wrap": ^9.0.0 "@graphql-typed-document-node/core": ^3.1.0 ramda: ^0.28.0 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: a57b63007815a8958ec49ecc14a640d559f8fd164968c123ffc3efdbcf35778d1c99f3570660a1dac4a523c986eeaf0c8834dfe0ed721de5111cedbce0ed6790 + checksum: 3a4732c54acb707350b7249d96952b5bb1e5a2c054090181d4e4f8adcd66d4d0675208d06f873bca75b924833df9a2c5bc7ce90aeb04b2d9e256605313a6080a languageName: node linkType: hard @@ -24620,7 +24877,7 @@ __metadata: languageName: node linkType: hard -"graphql-tag@npm:^2.11.0": +"graphql-tag@npm:^2.11.0, graphql-tag@npm:^2.12.6": version: 2.12.6 resolution: "graphql-tag@npm:2.12.6" dependencies: @@ -24661,7 +24918,7 @@ __metadata: languageName: node linkType: hard -"graphql-ws@npm:5.11.2, graphql-ws@npm:^5.4.1, graphql-ws@npm:^5.9.0": +"graphql-ws@npm:5.11.2": version: 5.11.2 resolution: "graphql-ws@npm:5.11.2" peerDependencies: @@ -24670,6 +24927,15 @@ __metadata: languageName: node linkType: hard +"graphql-ws@npm:^5.4.1, graphql-ws@npm:^5.9.0": + version: 5.12.0 + resolution: "graphql-ws@npm:5.12.0" + peerDependencies: + graphql: ">=0.11 <=16" + checksum: 5c683e2d5bdadfcfec0639eda69b8a66ef275e68e64f662bd75da6779a87b34395cbce8e37cb66830a9febca1871f7dc2575e6814f6f6e899904fe72e245f216 + languageName: node + linkType: hard + "graphql@npm:^15.0.0 || ^16.0.0, graphql@npm:^16.0.0": version: 16.6.0 resolution: "graphql@npm:16.6.0" @@ -24900,7 +25166,7 @@ __metadata: languageName: node linkType: hard -"he@npm:^1.2.0": +"he@npm:1.2.0, he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" bin: @@ -25287,10 +25553,10 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^3.0.1": - version: 3.0.1 - resolution: "human-signals@npm:3.0.1" - checksum: f252a7769c8094a5c9dc6772816bdb417b188820b04c8b42d0fc468e03a0ba905b1dd07afabe9385cc83504af1ccc2b985cd1e4aeeeb8e0029896c5af2e6f354 +"human-signals@npm:^4.3.0": + version: 4.3.0 + resolution: "human-signals@npm:4.3.0" + checksum: 662b976b1063a8afb8fd7fa50bde6975997e17ea6ceba2aad54aacf1dc239a2cd7d14d27b3ceca0c6288627f4b45c56c2c89618455ff52cd9377c02d6328cd7c languageName: node linkType: hard @@ -25423,9 +25689,9 @@ __metadata: linkType: hard "immer@npm:^9.0.1, immer@npm:^9.0.7": - version: 9.0.19 - resolution: "immer@npm:9.0.19" - checksum: f02ee53989989c287cd548a3d817fccf0bfe56db919755ee94a72ea3ae78a00363fba93ee6c010fe54a664380c29c53d44ed4091c6a86cae60957ad2cfabc010 + version: 9.0.21 + resolution: "immer@npm:9.0.21" + checksum: 70e3c274165995352f6936695f0ef4723c52c92c92dd0e9afdfe008175af39fa28e76aafb3a2ca9d57d1fb8f796efc4dd1e1cc36f18d33fa5b74f3dfb0375432 languageName: node linkType: hard @@ -26511,8 +26777,8 @@ __metadata: linkType: hard "isomorphic-git@npm:^1.8.0": - version: 1.21.0 - resolution: "isomorphic-git@npm:1.21.0" + version: 1.23.0 + resolution: "isomorphic-git@npm:1.23.0" dependencies: async-lock: ^1.1.0 clean-git-ref: ^2.0.1 @@ -26527,7 +26793,7 @@ __metadata: simple-get: ^4.0.1 bin: isogit: cli.cjs - checksum: afbdf98000c586fdcb96f84c054d6ada392b0d2422a7b7baad89e5f5881a79426f8555bdadeebe25202be18bb8eaee3881f8c04b6a289d04b916790bdd5dd5df + checksum: a733c1183855a90edd6d82cfdccd467886045fa98af211a50df7cbb2d3088e122542b9eef0f79ebe9d5e127a81c62dfa0ff561d906f0c9d4e5eb7a0c1f13f56f languageName: node linkType: hard @@ -27201,6 +27467,24 @@ __metadata: languageName: node linkType: hard +"jiti@npm:1.17.1": + version: 1.17.1 + resolution: "jiti@npm:1.17.1" + bin: + jiti: bin/jiti.js + checksum: 56c6d8488e7e9cc6ee66a0f0d5e18db6669cb12b2e93364f393442289a9bc75a8e8c796249f59015e01c3ebdf9478e2ca8b76c30e29072c678ee00d39de757c7 + languageName: node + linkType: hard + +"jiti@npm:^1.17.1": + version: 1.17.2 + resolution: "jiti@npm:1.17.2" + bin: + jiti: bin/jiti.js + checksum: 51941fea3622d1ff80d914ec6ec95ae463ede598a4a2317f1e8ff018823212eba6b9ea1c638c97c18f681870b1c2b9f49fbb13021b7c2415c46c8a3b1910f1e3 + languageName: node + linkType: hard + "jju@npm:~1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" @@ -27302,7 +27586,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^3.10.0, js-yaml@npm:^3.13.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.1, js-yaml@npm:^3.6.1, js-yaml@npm:^3.8.3": +"js-yaml@npm:^3.10.0, js-yaml@npm:^3.13.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.6.1, js-yaml@npm:^3.8.3": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: @@ -28065,9 +28349,9 @@ __metadata: linkType: hard "kafkajs@npm:^2.0.0": - version: 2.2.3 - resolution: "kafkajs@npm:2.2.3" - checksum: 30f17de75da852942334b6069c5c515e2531a7b610997f0e4c6088281f16588df45ac920218411d9ae995c09af1f69186ed4d73cbe0e5f1247ec756dd9c7678e + version: 2.2.4 + resolution: "kafkajs@npm:2.2.4" + checksum: 83e9e8bc50a09b142f4ff79f6a2bd88ecc21b83bcefe6621ab1716118d624886befb7371731274f67812ce35dd50b53140ff3b49a06e5d9169fe6b164d72fea5 languageName: node linkType: hard @@ -28188,6 +28472,16 @@ __metadata: languageName: node linkType: hard +"launch-editor@npm:^2.6.0": + version: 2.6.0 + resolution: "launch-editor@npm:2.6.0" + dependencies: + picocolors: ^1.0.0 + shell-quote: ^1.7.3 + checksum: 48e4230643e8fdb5c14c11314706d58d9f3fbafe2606be3d6e37da1918ad8bfe39dd87875c726a1b59b9f4da99d87ec3e36d4c528464f0b820f9e91e5cb1c02d + languageName: node + linkType: hard + "lazy-ass@npm:1.6.0, lazy-ass@npm:^1.6.0": version: 1.6.0 resolution: "lazy-ass@npm:1.6.0" @@ -28301,10 +28595,10 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:2.0.6, lilconfig@npm:^2.0.3": - version: 2.0.6 - resolution: "lilconfig@npm:2.0.6" - checksum: 40a3cd72f103b1be5975f2ac1850810b61d4053e20ab09be8d3aeddfe042187e1ba70b4651a7e70f95efa1642e7dc8b2ae395b317b7d7753b241b43cef7c0f7d +"lilconfig@npm:2.1.0, lilconfig@npm:^2.0.3": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 languageName: node linkType: hard @@ -28344,25 +28638,25 @@ __metadata: linkType: hard "lint-staged@npm:^13.0.0": - version: 13.1.2 - resolution: "lint-staged@npm:13.1.2" + version: 13.2.0 + resolution: "lint-staged@npm:13.2.0" dependencies: + chalk: 5.2.0 cli-truncate: ^3.1.0 - colorette: ^2.0.19 - commander: ^9.4.1 + commander: ^10.0.0 debug: ^4.3.4 - execa: ^6.1.0 - lilconfig: 2.0.6 - listr2: ^5.0.5 + execa: ^7.0.0 + lilconfig: 2.1.0 + listr2: ^5.0.7 micromatch: ^4.0.5 normalize-path: ^3.0.0 - object-inspect: ^1.12.2 + object-inspect: ^1.12.3 pidtree: ^0.6.0 string-argv: ^0.3.1 - yaml: ^2.1.3 + yaml: ^2.2.1 bin: lint-staged: bin/lint-staged.js - checksum: f854ad5c88542b8f06e27f3b4046927a4f3d4a451a04e079526559d819a325762268f65bd2df7156bcc0cb5f531f621c42cdb824b403f537c78305adc9e56a54 + checksum: dcaa8fbbde567eb8ac27230a18b3a22f30c278c524c0e27cf7d4110d662d5d33ed68a585a2e1b05075ef1c262e853f557a5ae046188b723603246d63e6b9f07b languageName: node linkType: hard @@ -28408,16 +28702,16 @@ __metadata: languageName: node linkType: hard -"listr2@npm:^5.0.5": - version: 5.0.5 - resolution: "listr2@npm:5.0.5" +"listr2@npm:^5.0.7": + version: 5.0.7 + resolution: "listr2@npm:5.0.7" dependencies: cli-truncate: ^2.1.0 colorette: ^2.0.19 log-update: ^4.0.0 p-map: ^4.0.0 rfdc: ^1.3.0 - rxjs: ^7.5.6 + rxjs: ^7.8.0 through: ^2.3.8 wrap-ansi: ^7.0.0 peerDependencies: @@ -28425,7 +28719,7 @@ __metadata: peerDependenciesMeta: enquirer: optional: true - checksum: 71c44eb648405d2725f248747ef8d5e192dd16938ec81df854c4a7e74ff1b3f4c3149461b1cff31c761bfbdf110f7f2603c9957c908294a1c6db299c9168608c + checksum: 5c2cb6ba3f7a5cfd548f89405febe73dc937acb6060227198c05da0ed5d5285a8107c61fcc4e33884e3bbdd447411aff7580af396bd22b6a11047ceab4950fab languageName: node linkType: hard @@ -28721,7 +29015,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.17.21, lodash@npm:^4.17.10, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0, lodash@npm:~4.17.0, lodash@npm:~4.17.15": +"lodash@npm:4.17.21, lodash@npm:^4.15.0, lodash@npm:^4.17.10, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0, lodash@npm:~4.17.0, lodash@npm:~4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -28866,10 +29160,10 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.10.1, lru-cache@npm:^7.7.1": - version: 7.10.1 - resolution: "lru-cache@npm:7.10.1" - checksum: e8b190d71ed0fcd7b29c71a3e9b01f851c92d1ef8865ff06b5581ca991db1e5e006920ed4da8b56da1910664ed51abfd76c46fb55e82ac252ff6c970ff910d72 +"lru-cache@npm:^7.10.1, lru-cache@npm:^7.14.1, lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 languageName: node linkType: hard @@ -29073,12 +29367,21 @@ __metadata: languageName: node linkType: hard +"markdown-to-jsx@npm:^7.1.9": + version: 7.2.0 + resolution: "markdown-to-jsx@npm:7.2.0" + peerDependencies: + react: ">= 0.14.0" + checksum: ea417e684d7eec9f1beebc9423aba377116ef77c3cd83a2d622df1b9030ffef99aa9b3f431192b94f3237943a33560e6dda9be8a4c1d25187518d09986dad22f + languageName: node + linkType: hard + "marked@npm:^4.0.10, marked@npm:^4.0.14": - version: 4.2.12 - resolution: "marked@npm:4.2.12" + version: 4.3.0 + resolution: "marked@npm:4.3.0" bin: marked: bin/marked.js - checksum: bd551cd61028ee639d4ca2ccdfcc5a6ba4227c1b143c4538f3cde27f569dcb57df8e6313560394645b418b84a7336c07ab1e438b89b6324c29d7d8cdd3102d63 + checksum: 0db6817893952c3ec710eb9ceafb8468bf5ae38cb0f92b7b083baa13d70b19774674be04db5b817681fa7c5c6a088f61300815e4dd75a59696f4716ad69f6260 languageName: node linkType: hard @@ -29886,6 +30189,15 @@ __metadata: languageName: node linkType: hard +"minim@npm:=0.23.8": + version: 0.23.8 + resolution: "minim@npm:0.23.8" + dependencies: + lodash: ^4.15.0 + checksum: 98e19a431189cee4dfad766e19948fb65b3607780bda2dc3f76b7bb35f9a468f372fb1b4c4b2ebfe348191e09f2b981579967b29cf02038798efe4eab326ffca + languageName: node + linkType: hard + "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" @@ -29909,12 +30221,21 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:4.2.1": - version: 4.2.1 - resolution: "minimatch@npm:4.2.1" +"minimatch@npm:4.2.3": + version: 4.2.3 + resolution: "minimatch@npm:4.2.3" dependencies: brace-expansion: ^1.1.7 - checksum: 2b1514e3d0f29a549912f0db7ae7b82c5cab4a8f2dd0369f1c6451a325b3f12b2cf473c95873b6157bb8df183d6cf6db82ff03614b6adaaf1d7e055beccdfd01 + checksum: 3392388e3ef7de7ae9a3a48d48a27a323934452f4af81b925dfbe85ce2dc07da855e3dbcc69229888be4e5118f6c0b79847d30f3e7c0e0017b25e423c11c0409 + languageName: node + linkType: hard + +"minimatch@npm:=7.3.0": + version: 7.3.0 + resolution: "minimatch@npm:7.3.0" + dependencies: + brace-expansion: ^2.0.1 + checksum: c4d9af992958339d5fc593c9ce496f4b9615597e57cdd663e57bd3a745ebd208c2bba19c3290c25ed8dcf259586fa1f68e4e1acf304f8694927b84c5381167d0 languageName: node linkType: hard @@ -30198,8 +30519,8 @@ __metadata: linkType: hard "msw@npm:^1.0.0, msw@npm:^1.0.1": - version: 1.0.1 - resolution: "msw@npm:1.0.1" + version: 1.2.0 + resolution: "msw@npm:1.2.0" dependencies: "@mswjs/cookies": ^0.2.2 "@mswjs/interceptors": ^0.17.5 @@ -30221,13 +30542,13 @@ __metadata: type-fest: ^2.19.0 yargs: ^17.3.1 peerDependencies: - typescript: ">= 4.4.x <= 4.9.x" + typescript: ">= 4.4.x <= 5.0.x" peerDependenciesMeta: typescript: optional: true bin: msw: cli/index.js - checksum: e5d6cbe67067ca46f42aaa33011f53a4e5a873abcf81c52a6996536b3c41a88f522821d3a4cf589658252581506afddb58fd8c3dfd79a5cbf06e26e14f9570b6 + checksum: 2cea7fe0f2ebb59b11534896cbaa91dca65f4fb2272402549079cc4190847fc42f5367f331c552d576d59a3521f498da0384d53cf4960beaebd6165bbc44593b languageName: node linkType: hard @@ -30299,7 +30620,7 @@ __metadata: languageName: node linkType: hard -"nan@npm:^2.14.1, nan@npm:^2.15.0, nan@npm:^2.17.0": +"nan@npm:^2.14.0, nan@npm:^2.14.1, nan@npm:^2.15.0, nan@npm:^2.17.0": version: 2.17.0 resolution: "nan@npm:2.17.0" dependencies: @@ -30423,6 +30744,15 @@ __metadata: languageName: node linkType: hard +"node-abi@npm:^2.21.0": + version: 2.30.1 + resolution: "node-abi@npm:2.30.1" + dependencies: + semver: ^5.4.1 + checksum: 3f4b0c912ce4befcd7ceab4493ba90b51d60dfcc90f567c93f731d897ef8691add601cb64c181683b800f21d479d68f9a6e15d8ab8acd16a5706333b9e30a881 + languageName: node + linkType: hard + "node-abi@npm:^3.3.0": version: 3.8.0 resolution: "node-abi@npm:3.8.0" @@ -30432,10 +30762,10 @@ __metadata: languageName: node linkType: hard -"node-abort-controller@npm:^3.0.1": - version: 3.0.1 - resolution: "node-abort-controller@npm:3.0.1" - checksum: 2b3d75c65249fea99e8ba22da3a8bc553f034f44dd12f5f4b38b520f718b01c88718c978f0c24c2a460fc01de9a80b567028f547b94440cb47adeacfeb82c2ee +"node-abort-controller@npm:^3.0.1, node-abort-controller@npm:^3.1.1": + version: 3.1.1 + resolution: "node-abort-controller@npm:3.1.1" + checksum: 2c340916af9710328b11c0828223fc65ba320e0d082214a211311bf64c2891028e42ef276b9799188c4ada9e6e1c54cf7a0b7c05dd9d59fcdc8cd633304c8047 languageName: node linkType: hard @@ -30598,6 +30928,25 @@ __metadata: languageName: node linkType: hard +"node-html-markdown@npm:^1.3.0": + version: 1.3.0 + resolution: "node-html-markdown@npm:1.3.0" + dependencies: + node-html-parser: ^6.1.1 + checksum: 303affd75bf11e92f004047e283aa05da5c8ae8696c1f28f811e9f61762c55b4480e0e5986a9a4b399791485b835380af8ab0554ebf867d6cf9be362abedcf5d + languageName: node + linkType: hard + +"node-html-parser@npm:^6.1.1": + version: 6.1.5 + resolution: "node-html-parser@npm:6.1.5" + dependencies: + css-select: ^5.1.0 + he: 1.2.0 + checksum: b54257b31954be17d473c86a2fede53d5e238708f3d88577c98881c28ab66013fd37044903f6f3cd662b56d882681fb511bca75a80a80b62f7111b32b39eebae + languageName: node + linkType: hard + "node-int64@npm:^0.4.0": version: 0.4.0 resolution: "node-int64@npm:0.4.0" @@ -30644,8 +30993,8 @@ __metadata: linkType: hard "nodemon@npm:^2.0.2": - version: 2.0.21 - resolution: "nodemon@npm:2.0.21" + version: 2.0.22 + resolution: "nodemon@npm:2.0.22" dependencies: chokidar: ^3.5.2 debug: ^3.2.7 @@ -30659,7 +31008,7 @@ __metadata: undefsafe: ^2.0.5 bin: nodemon: bin/nodemon.js - checksum: 0b9fe2d11fd95c51b66d61bd1ee85cddf579c9e674c9429752a74f445f1b98576235ae860858783728baa3666c87e4ef938ab67167cc34fe4bb8fcec74d6885b + checksum: 9c987e139748f5b5c480c6c9080bdc97304ee7d29172b7b3da1a7db590b1323ad57b96346304e9b522b0e445c336dc393ccd3f9f45c73b20d476d2347890dcd0 languageName: node linkType: hard @@ -30862,7 +31211,7 @@ __metadata: languageName: node linkType: hard -"npmlog@npm:^4.1.2": +"npmlog@npm:^4.0.1, npmlog@npm:^4.1.2": version: 4.1.2 resolution: "npmlog@npm:4.1.2" dependencies: @@ -30898,12 +31247,12 @@ __metadata: languageName: node linkType: hard -"nth-check@npm:^2.0.0": - version: 2.0.1 - resolution: "nth-check@npm:2.0.1" +"nth-check@npm:^2.0.0, nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" dependencies: boolbase: ^1.0.0 - checksum: 5386d035c48438ff304fe687704d93886397349d1bed136de97aeae464caba10e8ffac55a04b215b86b3bc8897f33e0a5aa1045a9d8b2f251ae61b2a3ad3e450 + checksum: 5afc3dafcd1573b08877ca8e6148c52abd565f1d06b1eb08caf982e3fa289a82f2cae697ffb55b5021e146d60443f1590a5d6b944844e944714a5b549675bcd3 languageName: node linkType: hard @@ -30981,10 +31330,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": - version: 1.12.2 - resolution: "object-inspect@npm:1.12.2" - checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 +"object-inspect@npm:^1.12.2, object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db languageName: node linkType: hard @@ -31210,6 +31559,16 @@ __metadata: languageName: node linkType: hard +"optimism@npm:^0.16.1": + version: 0.16.2 + resolution: "optimism@npm:0.16.2" + dependencies: + "@wry/context": ^0.7.0 + "@wry/trie": ^0.3.0 + checksum: a98ed9a0b8ee2b031010222099b60860d52860bf8182889f2695a7cf2185f21aca59020f78e2b47c0ae7697843caa576798d792967314ff59f6aa7c5d9de7f3a + languageName: node + linkType: hard + "optionator@npm:^0.8.1": version: 0.8.3 resolution: "optionator@npm:0.8.3" @@ -31642,7 +32001,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:^1.3.3, parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": +"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 @@ -31728,7 +32087,7 @@ __metadata: languageName: node linkType: hard -"passport-oauth2@npm:1.6.1, passport-oauth2@npm:1.x.x, passport-oauth2@npm:^1.1.2, passport-oauth2@npm:^1.4.0, passport-oauth2@npm:^1.6.0, passport-oauth2@npm:^1.6.1": +"passport-oauth2@npm:1.6.1": version: 1.6.1 resolution: "passport-oauth2@npm:1.6.1" dependencies: @@ -31741,6 +32100,19 @@ __metadata: languageName: node linkType: hard +"passport-oauth2@npm:1.x.x, passport-oauth2@npm:^1.1.2, passport-oauth2@npm:^1.4.0, passport-oauth2@npm:^1.6.0, passport-oauth2@npm:^1.6.1": + version: 1.7.0 + resolution: "passport-oauth2@npm:1.7.0" + dependencies: + base64url: 3.x.x + oauth: 0.9.x + passport-strategy: 1.x.x + uid2: 0.0.x + utils-merge: 1.x.x + checksum: 9e93f1f47ad5c22ef119932e03f383b503f692012352f27d2a416cc45ca5448c5a97f726da51753fff9a2ec2b6255ac27f1e68c4b44538530d2a8de682f17d42 + languageName: node + linkType: hard + "passport-oauth@npm:1.0.0, passport-oauth@npm:^1.0.0": version: 1.0.0 resolution: "passport-oauth@npm:1.0.0" @@ -32050,12 +32422,12 @@ __metadata: languageName: node linkType: hard -"pg-pool@npm:^3.5.2": - version: 3.5.2 - resolution: "pg-pool@npm:3.5.2" +"pg-pool@npm:^3.6.0": + version: 3.6.0 + resolution: "pg-pool@npm:3.6.0" peerDependencies: pg: ">=8.0" - checksum: a5d029200257671f0c17ca54b9ab6213e2060e64e5cc792b78edd50ab471a26cd364890d05d546d9296949e079e943821cf2ceb4d488f4e6a6789fb781a628bf + checksum: f3fe050fbfe27406369340c4c26efcbe21a388ace085a876453de0ea496a315c38b2dc739ac97d4767a359e911da2ec4810467f72601eeec8ad540e58b27987c languageName: node linkType: hard @@ -32080,13 +32452,13 @@ __metadata: linkType: hard "pg@npm:^8.3.0, pg@npm:^8.4.0": - version: 8.9.0 - resolution: "pg@npm:8.9.0" + version: 8.10.0 + resolution: "pg@npm:8.10.0" dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 pg-connection-string: ^2.5.0 - pg-pool: ^3.5.2 + pg-pool: ^3.6.0 pg-protocol: ^1.6.0 pg-types: ^2.1.0 pgpass: 1.x @@ -32095,7 +32467,7 @@ __metadata: peerDependenciesMeta: pg-native: optional: true - checksum: dfd158955318f9ffb9428eaada29f3ee98b9eb07e87ed4b56589a19984d109f23bb8f88db78b7d7f870553e5b75ca0d58d0ed55755a8c6aed5df44e038c1d529 + checksum: c6be78f2e823f2ae3c618c8e54a6622592dd71b556fb665d7eaedcbcc2fa5d210a8bcf519401e72526a65b9d797f19b772f48f29b9d9f31e98dd526fd27d61e0 languageName: node linkType: hard @@ -32768,6 +33140,29 @@ __metadata: languageName: node linkType: hard +"prebuild-install@npm:^6.0.1": + version: 6.1.4 + resolution: "prebuild-install@npm:6.1.4" + dependencies: + detect-libc: ^1.0.3 + expand-template: ^2.0.3 + github-from-package: 0.0.0 + minimist: ^1.2.3 + mkdirp-classic: ^0.5.3 + napi-build-utils: ^1.0.1 + node-abi: ^2.21.0 + npmlog: ^4.0.1 + pump: ^3.0.0 + rc: ^1.2.7 + simple-get: ^3.0.3 + tar-fs: ^2.0.0 + tunnel-agent: ^0.6.0 + bin: + prebuild-install: bin.js + checksum: de4313eda821305912af922700a2db04bb8e77fe8aa9c2788550f1000c026cbefc82da468ec0c0a37764c5417bd8169dbd540928535fb38d00bb9bbd673dd217 + languageName: node + linkType: hard + "prebuild-install@npm:^7.1.0, prebuild-install@npm:^7.1.1": version: 7.1.1 resolution: "prebuild-install@npm:7.1.1" @@ -32824,11 +33219,11 @@ __metadata: linkType: hard "prettier@npm:^2.2.1, prettier@npm:^2.7.1": - version: 2.8.4 - resolution: "prettier@npm:2.8.4" + version: 2.8.7 + resolution: "prettier@npm:2.8.7" bin: prettier: bin-prettier.js - checksum: c173064bf3df57b6d93d19aa98753b9b9dd7657212e33b41ada8e2e9f9884066bb9ca0b4005b89b3ab137efffdf8fbe0b462785aba20364798ff4303aadda57e + checksum: fdc8f2616f099f5f0d685907f4449a70595a0fc1d081a88919604375989e0d5e9168d6121d8cc6861f21990b31665828e00472544d785d5940ea08a17660c3a6 languageName: node linkType: hard @@ -32913,7 +33308,7 @@ __metadata: languageName: node linkType: hard -"process@npm:^0.11.10": +"process@npm:=0.11.10, process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 @@ -32928,11 +33323,11 @@ __metadata: linkType: hard "prom-client@npm:^14.0.1": - version: 14.1.1 - resolution: "prom-client@npm:14.1.1" + version: 14.2.0 + resolution: "prom-client@npm:14.2.0" dependencies: tdigest: ^0.1.1 - checksum: 7ff3e85636b1f0ca590b38ad7c7c5f9998b985c06a1c572ffffc69f052d5b4baf84c9124923e3824c63f78b5e8400081c6472173d04382ca296ebdf36d774a88 + checksum: d4c04e57616c72643dd02862d0d4bde09cf8869a19d0aef5e7b785e6e27d02439b66cdc165e3492f62d579fa91579183820870cc757a09b99399d2d02f46b9f1 languageName: node linkType: hard @@ -33136,7 +33531,7 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:1.1.0": +"proxy-from-env@npm:1.1.0, proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 @@ -33332,7 +33727,16 @@ __metadata: languageName: node linkType: hard -"ramda@npm:^0.28.0": +"ramda-adjunct@npm:=3.4.0": + version: 3.4.0 + resolution: "ramda-adjunct@npm:3.4.0" + peerDependencies: + ramda: ">= 0.28.0 <= 0.28.0" + checksum: 05d4daa44a28879dafc75adba6d0b660f8fc0280c03ad62c51ba779d93b11fdaa28a039b28f7ea4a8ca42fdb0a2a750b793fa073125bcc74799630e58cd4770f + languageName: node + linkType: hard + +"ramda@npm:=0.28.0, ramda@npm:^0.28.0": version: 0.28.0 resolution: "ramda@npm:0.28.0" checksum: 44ea6e5010bba70151b6a92d8114a91915e8b5a16105cce65fae58c9d7386b812c429645e35f21141d7087568550ce383bc10ee1a65cdec951f4b69ea457e6a4 @@ -33401,7 +33805,7 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:^2.4.1": +"raw-body@npm:2.5.2, raw-body@npm:^2.4.1": version: 2.5.2 resolution: "raw-body@npm:2.5.2" dependencies: @@ -33696,8 +34100,8 @@ __metadata: linkType: hard "react-markdown@npm:^8.0.0": - version: 8.0.5 - resolution: "react-markdown@npm:8.0.5" + version: 8.0.6 + resolution: "react-markdown@npm:8.0.6" dependencies: "@types/hast": ^2.0.0 "@types/prop-types": ^15.0.0 @@ -33717,11 +34121,11 @@ __metadata: peerDependencies: "@types/react": ">=16" react: ">=16" - checksum: 9d11b7aba16216d590e56b4744e05d2925141bfb0f5885b3d9400ccf006cd24b79ce3b3d20af8a083a01324215b58fa4c5979e44f69d54123ff1dd5dacb0dc89 + checksum: 59fd5dcd089df0cd9098755e3063d8fcf4b4635b1ac2d5e05fcda9923769724476396abdf2afb80fb8e7589a951deac50d6f89c4740d5ec6decd34076122c80c languageName: node linkType: hard -"react-redux@npm:^7.1.1, react-redux@npm:^7.2.4": +"react-redux@npm:^7.1.1": version: 7.2.5 resolution: "react-redux@npm:7.2.5" dependencies: @@ -33742,6 +34146,38 @@ __metadata: languageName: node linkType: hard +"react-redux@npm:^8.0.5": + version: 8.0.5 + resolution: "react-redux@npm:8.0.5" + dependencies: + "@babel/runtime": ^7.12.1 + "@types/hoist-non-react-statics": ^3.3.1 + "@types/use-sync-external-store": ^0.0.3 + hoist-non-react-statics: ^3.3.2 + react-is: ^18.0.0 + use-sync-external-store: ^1.0.0 + peerDependencies: + "@types/react": ^16.8 || ^17.0 || ^18.0 + "@types/react-dom": ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + react-native: ">=0.59" + redux: ^4 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + react-dom: + optional: true + react-native: + optional: true + redux: + optional: true + checksum: a108f4f7ead6ac005e656d46051474a2bbdb31ede481bbbb3d8d779c1a35e1940b8655577cc5021313411864d305f67fc719aa48d6e5ed8288cf9cbe8b7042e4 + languageName: node + linkType: hard + "react-refresh@npm:^0.14.0": version: 0.14.0 resolution: "react-refresh@npm:0.14.0" @@ -33789,7 +34225,7 @@ __metadata: languageName: node linkType: hard -"react-router-dom-stable@npm:react-router-dom@^6.3.0, react-router-dom@npm:^6.3.0": +"react-router-dom-stable@npm:react-router-dom@^6.3.0": version: 6.8.1 resolution: "react-router-dom@npm:6.8.1" dependencies: @@ -33802,6 +34238,19 @@ __metadata: languageName: node linkType: hard +"react-router-dom@npm:^6.3.0": + version: 6.9.0 + resolution: "react-router-dom@npm:6.9.0" + dependencies: + "@remix-run/router": 1.4.0 + react-router: 6.9.0 + peerDependencies: + react: ">=16.8" + react-dom: ">=16.8" + checksum: 4d593491ab8db5611feda70002c62902baebb84d5c1c5e5b6172496f31f91130deee132bf4240dea634a88cb86c76d6da348f15b9cd5e5197be455efd88edf72 + languageName: node + linkType: hard + "react-router-stable@npm:react-router@^6.3.0, react-router@npm:6.8.1": version: 6.8.1 resolution: "react-router@npm:6.8.1" @@ -33813,6 +34262,17 @@ __metadata: languageName: node linkType: hard +"react-router@npm:6.9.0": + version: 6.9.0 + resolution: "react-router@npm:6.9.0" + dependencies: + "@remix-run/router": 1.4.0 + peerDependencies: + react: ">=16.8" + checksum: b2a5f42e042bee7a7f116ca7817b0e58359e5353d84887c9fe7a633d7490c03b1e0ae37cd01830c2a381e3d1e7d501bb4751e53cc3d491e25f36582d3f6e0546 + languageName: node + linkType: hard + "react-side-effect@npm:^2.1.0": version: 2.1.0 resolution: "react-side-effect@npm:2.1.0" @@ -34328,7 +34788,7 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.13.11, regenerator-runtime@npm:^0.13.4": +"regenerator-runtime@npm:^0.13.11": version: 0.13.11 resolution: "regenerator-runtime@npm:0.13.11" checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 @@ -34749,6 +35209,13 @@ __metadata: languageName: node linkType: hard +"response-iterator@npm:^0.2.6": + version: 0.2.6 + resolution: "response-iterator@npm:0.2.6" + checksum: b0db3c0665a0d698d65512951de9623c086b9c84ce015a76076d4bd0bf733779601d0b41f0931d16ae38132fba29e1ce291c1f8e6550fc32daaa2dc3ab4f338d + languageName: node + linkType: hard + "responselike@npm:^2.0.0": version: 2.0.0 resolution: "responselike@npm:2.0.0" @@ -35093,7 +35560,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.0.0, rxjs@npm:^7.2.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.5.6, rxjs@npm:^7.8.0": +"rxjs@npm:^7.0.0, rxjs@npm:^7.2.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.8.0": version: 7.8.0 resolution: "rxjs@npm:7.8.0" dependencies: @@ -35412,12 +35879,12 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.0": - version: 6.0.0 - resolution: "serialize-javascript@npm:6.0.0" +"serialize-javascript@npm:^6.0.1": + version: 6.0.1 + resolution: "serialize-javascript@npm:6.0.1" dependencies: randombytes: ^2.1.0 - checksum: 56f90b562a1bdc92e55afb3e657c6397c01a902c588c0fe3d4c490efdcc97dcd2a3074ba12df9e94630f33a5ce5b76a74784a7041294628a6f4306e0ec84bf93 + checksum: 3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f languageName: node linkType: hard @@ -35613,6 +36080,16 @@ __metadata: languageName: node linkType: hard +"short-unique-id@npm:=4.4.4": + version: 4.4.4 + resolution: "short-unique-id@npm:4.4.4" + bin: + short-unique-id: bin/short-unique-id + suid: bin/short-unique-id + checksum: 3507f2e97326e49180dd4edbf41dd762a76c591df3fd5b7c1e7592bfb0c2f5724d63e626cc6f581c717d3111374811ca1d77a728ac07b0b9041b2355700124d4 + languageName: node + linkType: hard + "shx@npm:^0.3.2": version: 0.3.4 resolution: "shx@npm:0.3.4" @@ -35772,9 +36249,9 @@ __metadata: linkType: hard "slugify@npm:^1.6.4": - version: 1.6.5 - resolution: "slugify@npm:1.6.5" - checksum: a955a1b600201030f4c1daa9bb74a17d4402a0693fc40978bbd17e44e64fd72dad3bac4037422aa8aed55b5170edd57f3f4cd8f59ba331f5cf0f10f1a7795609 + version: 1.6.6 + resolution: "slugify@npm:1.6.6" + checksum: 04773c2d3b7aea8d2a61fa47cc7e5d29ce04e1a96cbaec409da57139df906acb3a449fac30b167d203212c806e73690abd4ff94fbad0a9a7b7ea109a2a638ae9 languageName: node linkType: hard @@ -36215,6 +36692,13 @@ __metadata: languageName: node linkType: hard +"stampit@npm:=4.3.2": + version: 4.3.2 + resolution: "stampit@npm:4.3.2" + checksum: 731dfe564b98371293bb5e7cb76bb195336dd3589af4e448d1478ac6c99091fd302fd7f41a255daa4b0ec2c1f14ea4f0cc0a2f05cd3d786b29ba531850ad7f62 + languageName: node + linkType: hard + "standard-as-callback@npm:^2.1.0": version: 2.1.0 resolution: "standard-as-callback@npm:2.1.0" @@ -36641,11 +37125,11 @@ __metadata: linkType: hard "style-loader@npm:^3.3.1": - version: 3.3.1 - resolution: "style-loader@npm:3.3.1" + version: 3.3.2 + resolution: "style-loader@npm:3.3.2" peerDependencies: webpack: ^5.0.0 - checksum: 470feef680f59e2fce4d6601b5c55b88c01ad8d1dd693c528ffd591ff5fd7c01a4eff3bdbe62f26f847d6bd2430c9ab594be23307cfe7a3446ab236683f0d066 + checksum: 5ee5ce2dc885369eccb55d429376e83d02570d473ac5edeb69fd65ee894847f1e51429cf078351f617bd04516ece8a1dd967f9f40464bd8fa76d903c6b2a6f08 languageName: node linkType: hard @@ -36722,8 +37206,8 @@ __metadata: linkType: hard "sucrase@npm:^3.20.2": - version: 3.29.0 - resolution: "sucrase@npm:3.29.0" + version: 3.30.0 + resolution: "sucrase@npm:3.30.0" dependencies: commander: ^4.0.0 glob: 7.1.6 @@ -36734,7 +37218,7 @@ __metadata: bin: sucrase: bin/sucrase sucrase-node: bin/sucrase-node - checksum: fc8f04c34f29c0e9ca63109815df138182d62663dbe9565fcd94161b77a88a639f40c46559d0bb84d7acf9346ce23ea102476fd9168ec279330c7faecefb81eb + checksum: 9d53ee132f8063573c9f336c2dbc00a1f91fb976a4ad4dca29a15a898d361e6d4a06ada086c6881fe63389d96392cbd761d790a8175a6ecb184eaa337d58f363 languageName: node linkType: hard @@ -36832,14 +37316,18 @@ __metadata: languageName: node linkType: hard -"swagger-client@npm:^3.18.5": - version: 3.18.5 - resolution: "swagger-client@npm:3.18.5" +"swagger-client@npm:^3.19.1": + version: 3.19.2 + resolution: "swagger-client@npm:3.19.2" dependencies: - "@babel/runtime-corejs3": ^7.11.2 + "@babel/runtime-corejs3": ^7.20.13 + "@swagger-api/apidom-core": =0.69.0 + "@swagger-api/apidom-json-pointer": =0.69.0 + "@swagger-api/apidom-ns-openapi-3-1": =0.69.0 + "@swagger-api/apidom-reference": =0.69.0 cookie: ~0.5.0 cross-fetch: ^3.1.5 - deepmerge: ~4.2.2 + deepmerge: ~4.3.0 fast-json-patch: ^3.0.0-1 form-data-encoder: ^1.4.3 formdata-node: ^4.0.0 @@ -36849,16 +37337,16 @@ __metadata: qs: ^6.10.2 traverse: ~0.6.6 url: ~0.11.0 - checksum: 804260814abffbb97266b23be20ef8503cf21143684fb81f134ce4f7e0287e6b47b403f0fc0d9e2121bedb1309af6d50f76701ee4bf3390365558d82f4b40786 + checksum: 9613387191b6e72afbe1e551d70646b7c74a136160d2a69ac3220cf23007175c500d3035b0c9ebf1ef0b49769a65d54cf343eb3b0c0d260c5797338776c872ba languageName: node linkType: hard "swagger-ui-react@npm:^4.11.1": - version: 4.15.5 - resolution: "swagger-ui-react@npm:4.15.5" + version: 4.18.1 + resolution: "swagger-ui-react@npm:4.18.1" dependencies: "@babel/runtime-corejs3": ^7.18.9 - "@braintree/sanitize-url": =6.0.0 + "@braintree/sanitize-url": =6.0.2 base64-js: ^1.5.1 classnames: ^2.3.1 css.escape: 1.5.1 @@ -36878,7 +37366,7 @@ __metadata: react-immutable-proptypes: 2.2.0 react-immutable-pure-component: ^2.2.0 react-inspector: ^6.0.1 - react-redux: ^7.2.4 + react-redux: ^8.0.5 react-syntax-highlighter: ^15.5.0 redux: ^4.1.2 redux-immutable: ^4.0.0 @@ -36886,7 +37374,7 @@ __metadata: reselect: ^4.1.5 serialize-error: ^8.1.0 sha.js: ^2.4.11 - swagger-client: ^3.18.5 + swagger-client: ^3.19.1 url-parse: ^1.5.8 xml: =1.0.1 xml-but-prettier: ^1.0.1 @@ -36894,7 +37382,7 @@ __metadata: peerDependencies: react: ">=17.0.0" react-dom: ">=17.0.0" - checksum: 22a72947da865ebfa9269f66b42c2b50105b6285bcb6546f8f356cf73961f76e397b7d79003641c9569bfb2163ea98e2f3f73a27b5b66843d308786c37362e1c + checksum: 183e15d7ccab2ef9197b3695029b66fe1e0556c48bab10f63150feabc304492ae87529a1f1b3e0ee689d19f8b3645a168dff0f3edf421737ac7e8a2d320d26c4 languageName: node linkType: hard @@ -36918,13 +37406,13 @@ __metadata: linkType: hard "swr@npm:^2.0.0": - version: 2.1.0 - resolution: "swr@npm:2.1.0" + version: 2.1.1 + resolution: "swr@npm:2.1.1" dependencies: use-sync-external-store: ^1.2.0 peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 - checksum: 7de1799f319c7ebfb996cb843279169144b7087215ce7318dd6011590908341ac7d5bca93a197666557c2450b0297d9efbc610fd069b82dc3387130c619965fc + checksum: 77a7854f87c2a3244b4047eca5d88a0f5db6cb47f783fd13b8a38f5a611940142645c943e105fbfa64aac51e642361180366107ade0454744a80d6dedbe350db languageName: node linkType: hard @@ -36935,6 +37423,13 @@ __metadata: languageName: node linkType: hard +"symbol-observable@npm:^4.0.0": + version: 4.0.0 + resolution: "symbol-observable@npm:4.0.0" + checksum: 212c7edce6186634d671336a88c0e0bbd626c2ab51ed57498dc90698cce541839a261b969c2a1e8dd43762133d47672e8b62e0b1ce9cf4157934ba45fd172ba8 + languageName: node + linkType: hard + "symbol-tree@npm:^3.2.4": version: 3.2.4 resolution: "symbol-tree@npm:3.2.4" @@ -37095,14 +37590,14 @@ __metadata: linkType: hard "terser-webpack-plugin@npm:*, terser-webpack-plugin@npm:^5.1.3": - version: 5.3.6 - resolution: "terser-webpack-plugin@npm:5.3.6" + version: 5.3.7 + resolution: "terser-webpack-plugin@npm:5.3.7" dependencies: - "@jridgewell/trace-mapping": ^0.3.14 + "@jridgewell/trace-mapping": ^0.3.17 jest-worker: ^27.4.5 schema-utils: ^3.1.1 - serialize-javascript: ^6.0.0 - terser: ^5.14.1 + serialize-javascript: ^6.0.1 + terser: ^5.16.5 peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -37112,13 +37607,13 @@ __metadata: optional: true uglify-js: optional: true - checksum: 8f3448d7fdb0434ce6a0c09d95c462bfd2f4a5a430233d854163337f734a7f5c07c74513d16081e06d4ca33d366d5b1a36f5444219bc41a7403afd6162107bad + checksum: 095e699fdeeb553cdf2c6f75f983949271b396d9c201d7ae9fc633c45c1c1ad14c7257ef9d51ccc62213dd3e97f875870ba31550f6d4f1b6674f2615562da7f7 languageName: node linkType: hard -"terser@npm:^5.10.0, terser@npm:^5.14.1": - version: 5.14.2 - resolution: "terser@npm:5.14.2" +"terser@npm:^5.10.0, terser@npm:^5.16.5": + version: 5.16.6 + resolution: "terser@npm:5.16.6" dependencies: "@jridgewell/source-map": ^0.3.2 acorn: ^8.5.0 @@ -37126,7 +37621,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: cabb50a640d6c2cfb351e4f43dc7bf7436f649755bb83eb78b2cacda426d5e0979bd44e6f92d713f3ca0f0866e322739b9ced888ebbce6508ad872d08de74fcc + checksum: f763a7bcc7b98cb2bfc41434f7b92bfe8a701a12c92ea6049377736c8e6de328240d654a20dfe15ce170fd783491b9873fad9f4cd8fee4f6c6fb8ca407859dee languageName: node linkType: hard @@ -37483,6 +37978,37 @@ __metadata: languageName: node linkType: hard +"tree-sitter-json@npm:=0.20.0": + version: 0.20.0 + resolution: "tree-sitter-json@npm:0.20.0" + dependencies: + nan: ^2.14.1 + node-gyp: latest + checksum: 820e27b644e3ec62d8753976572660fbc314b0ffb10178384ae0d187187797c3d87223bec6b034e602445e4095484a28fb89ca67653a1d4f41fa13dd6adad0d2 + languageName: node + linkType: hard + +"tree-sitter-yaml@npm:=0.5.0": + version: 0.5.0 + resolution: "tree-sitter-yaml@npm:0.5.0" + dependencies: + nan: ^2.14.0 + node-gyp: latest + checksum: 7962aea3784dd67098daff4ae984145189eb49b8f981f5a9e72bac97b77859a75030580d199712d671cdced5326599192b3549a428e162e9858a3bbb4cb2fff6 + languageName: node + linkType: hard + +"tree-sitter@npm:=0.20.1": + version: 0.20.1 + resolution: "tree-sitter@npm:0.20.1" + dependencies: + nan: ^2.14.0 + node-gyp: latest + prebuild-install: ^6.0.1 + checksum: a33bf01f9dc558aa0075c9634d06743ed9b7fbf273d2acfbe96daf83f48aec46be7dc42d80d2423c36593d36d3bf189d3fa023d6ce389e20ff9527fae118b215 + languageName: node + linkType: hard + "treeverse@npm:^1.0.4": version: 1.0.4 resolution: "treeverse@npm:1.0.4" @@ -37532,6 +38058,15 @@ __metadata: languageName: node linkType: hard +"ts-invariant@npm:^0.10.3": + version: 0.10.3 + resolution: "ts-invariant@npm:0.10.3" + dependencies: + tslib: ^2.1.0 + checksum: bb07d56fe4aae69d8860e0301dfdee2d375281159054bc24bf1e49e513fb0835bf7f70a11351344d213a79199c5e695f37ebbf5a447188a377ce0cd81d91ddb5 + languageName: node + linkType: hard + "ts-log@npm:^2.2.3": version: 2.2.3 resolution: "ts-log@npm:2.2.3" @@ -37587,6 +38122,13 @@ __metadata: languageName: node linkType: hard +"ts-toolbelt@npm:^6.15.1": + version: 6.15.5 + resolution: "ts-toolbelt@npm:6.15.5" + checksum: 24ad00cfd9ce735c76c873a9b1347eac475b94e39ebbdf100c9019dce88dd5f4babed52884cf82bb456a38c28edd0099ab6f704b84b2e5e034852b618472c1f3 + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.14.1": version: 3.14.1 resolution: "tsconfig-paths@npm:3.14.1" @@ -37606,7 +38148,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.3.1, tslib@npm:~2.3.0": +"tslib@npm:2.3.1": version: 2.3.1 resolution: "tslib@npm:2.3.1" checksum: de17a98d4614481f7fcb5cd53ffc1aaf8654313be0291e1bfaee4b4bb31a20494b7d218ff2e15017883e8ea9626599b3b0e0229c18383ba9dce89da2adf15cb9 @@ -37620,7 +38162,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:~2.5.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.5.0, tslib@npm:~2.5.0": version: 2.5.0 resolution: "tslib@npm:2.5.0" checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 @@ -38142,6 +38684,13 @@ __metadata: languageName: node linkType: hard +"unraw@npm:=2.0.1": + version: 2.0.1 + resolution: "unraw@npm:2.0.1" + checksum: af9a9d2f6e420cb4f52fe2f1f5982e6b0be95da640d6ae8d6d9ff631d864771793cb9fe7e2a16ef1ce631b94065f4438e7bd7f1701076fc69296edc4e704d42f + languageName: node + linkType: hard + "untildify@npm:^4.0.0": version: 4.0.0 resolution: "untildify@npm:4.0.0" @@ -38279,7 +38828,7 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.2.0": +"use-sync-external-store@npm:^1.0.0, use-sync-external-store@npm:^1.2.0": version: 1.2.0 resolution: "use-sync-external-store@npm:1.2.0" peerDependencies: @@ -38488,7 +39037,7 @@ __metadata: languageName: node linkType: hard -"value-or-promise@npm:1.0.12, value-or-promise@npm:^1.0.11": +"value-or-promise@npm:1.0.12, value-or-promise@npm:^1.0.11, value-or-promise@npm:^1.0.12": version: 1.0.12 resolution: "value-or-promise@npm:1.0.12" checksum: f53a66c75b7447c90bbaf946a757ca09c094629cb80ba742f59c980ec3a69be0a385a0e75505dedb4e757862f1a994ca4beaf083a831f24d3ffb3d4bb18cd1e1 @@ -38694,7 +39243,7 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.0.0-beta.10, watchpack@npm:^2.4.0": +"watchpack@npm:^2.4.0": version: 2.4.0 resolution: "watchpack@npm:2.4.0" dependencies: @@ -38749,6 +39298,13 @@ __metadata: languageName: node linkType: hard +"web-tree-sitter@npm:=0.20.7": + version: 0.20.7 + resolution: "web-tree-sitter@npm:0.20.7" + checksum: f2949a679bbca5ecb225ab26a67ff99e6e3907fa905c6bd62bfe6d2cfa216347f8cc481efcd32f181cb6b964bc03c42f9611e16da0825bff43de389b17ff9f7f + languageName: node + linkType: hard + "webcrypto-core@npm:^1.7.4": version: 1.7.5 resolution: "webcrypto-core@npm:1.7.5" @@ -38806,8 +39362,8 @@ __metadata: linkType: hard "webpack-dev-server@npm:^4.7.3": - version: 4.11.1 - resolution: "webpack-dev-server@npm:4.11.1" + version: 4.13.1 + resolution: "webpack-dev-server@npm:4.13.1" dependencies: "@types/bonjour": ^3.5.9 "@types/connect-history-api-fallback": ^1.3.5 @@ -38828,6 +39384,7 @@ __metadata: html-entities: ^2.3.2 http-proxy-middleware: ^2.0.3 ipaddr.js: ^2.0.1 + launch-editor: ^2.6.0 open: ^8.0.9 p-retry: ^4.5.0 rimraf: ^3.0.2 @@ -38837,15 +39394,17 @@ __metadata: sockjs: ^0.3.24 spdy: ^4.0.2 webpack-dev-middleware: ^5.3.1 - ws: ^8.4.2 + ws: ^8.13.0 peerDependencies: webpack: ^4.37.0 || ^5.0.0 peerDependenciesMeta: + webpack: + optional: true webpack-cli: optional: true bin: webpack-dev-server: bin/webpack-dev-server.js - checksum: b7601a39ee0f413988259e29a36835b0a68522cfaa161de5b7ec99b3399acdd99d44189add4aaf4a5191258bb130f9cf3e68919324a1955c7557f5fe6ab0d96c + checksum: f70611544b7d964a31eb3d934d7c2b376b97e6927a89e03b2e21cfa5812bb639625cd18fd350de1604ba6c455b324135523a894032f28c69d90d90682e4f3b7d languageName: node linkType: hard @@ -38874,8 +39433,8 @@ __metadata: linkType: hard "webpack@npm:^5, webpack@npm:^5.70.0": - version: 5.74.0 - resolution: "webpack@npm:5.74.0" + version: 5.76.3 + resolution: "webpack@npm:5.76.3" dependencies: "@types/eslint-scope": ^3.7.3 "@types/estree": ^0.0.51 @@ -38906,7 +39465,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 320c41369a75051b19e18c63f408b3dcc481852e992f83d311771c5ec0f05f2946385e8ebef62030cf3587f0a3d2f12779ffdb191569a966847289ba7313f946 + checksum: 363f536b56971d056e34ab4cffa4cbc630b220e51be1a8c3adea87d9f0b51c49cfc7c3720d6614a1fd2c8c63f1ab3100db916fe8367c8bb9299327ff8c3f856d languageName: node linkType: hard @@ -39250,9 +39809,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.11.0, ws@npm:^8.4.2, ws@npm:^8.8.0": - version: 8.12.0 - resolution: "ws@npm:8.12.0" +"ws@npm:^8.11.0, ws@npm:^8.13.0, ws@npm:^8.8.0": + version: 8.13.0 + resolution: "ws@npm:8.13.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -39261,7 +39820,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 818ff3f8749c172a95a114cceb8b89cedd27e43a82d65c7ad0f7882b1e96a2ee6709e3746a903c3fa88beec0c8bae9a9fcd75f20858b32a166dfb7519316a5d7 + checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c languageName: node linkType: hard @@ -39385,18 +39944,6 @@ __metadata: languageName: node linkType: hard -"xss@npm:^1.0.8": - version: 1.0.10 - resolution: "xss@npm:1.0.10" - dependencies: - commander: ^2.20.3 - cssfilter: 0.0.10 - bin: - xss: bin/xss - checksum: 0dbc70a716020d854569610d5bc949ba9d3b7f530b7af5508ffe84edaea228c34a4e1227f71cb3a4741373b1c49c3cb691f69dddefda45a594a31f112ae6a738 - languageName: node - linkType: hard - "xtend@npm:^4.0.0": version: 4.0.2 resolution: "xtend@npm:4.0.2" @@ -39460,10 +40007,10 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.1.3": - version: 2.1.3 - resolution: "yaml@npm:2.1.3" - checksum: 91316062324a93f9cb547469092392e7d004ff8f70c40fecb420f042a4870b2181557350da56c92f07bd44b8f7a252b0be26e6ade1f548e1f4351bdd01c9d3c7 +"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.2.1": + version: 2.2.1 + resolution: "yaml@npm:2.2.1" + checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23 languageName: node linkType: hard @@ -39708,7 +40255,7 @@ __metadata: languageName: node linkType: hard -"zen-observable-ts@npm:^1.1.0": +"zen-observable-ts@npm:^1.1.0, zen-observable-ts@npm:^1.2.5": version: 1.2.5 resolution: "zen-observable-ts@npm:1.2.5" dependencies: @@ -39749,12 +40296,19 @@ __metadata: languageName: node linkType: hard -"zod-to-json-schema@npm:~3.18.0": - version: 3.18.2 - resolution: "zod-to-json-schema@npm:3.18.2" +"zod-to-json-schema@npm:^3.20.4": + version: 3.20.4 + resolution: "zod-to-json-schema@npm:3.20.4" peerDependencies: - zod: ^3.18.0 - checksum: 10e84864a3ccc2e04500b9bc81369ed7c5b3ec068ea582a13369175ed40e785091a63ae7fa86ebb4ddf1bccd55c3dab32f4d3070bbcc3296e68305ff787c9df3 + zod: ^3.20.0 + checksum: 55bc649dbc82ce25fbfbfdd42ca530d883d83be5d02cb81e89f6401d54bca151fc6b8cc57999c75eb6a3dcaa3f000697315fbd4f505637472621570ed52784d8 + languageName: node + linkType: hard + +"zod@npm:^3.21.4": + version: 3.21.4 + resolution: "zod@npm:3.21.4" + checksum: f185ba87342ff16f7a06686767c2b2a7af41110c7edf7c1974095d8db7a73792696bcb4a00853de0d2edeb34a5b2ea6a55871bc864227dace682a0a28de33e1f languageName: node linkType: hard