diff --git a/.changeset/beige-chairs-repair.md b/.changeset/beige-chairs-repair.md
new file mode 100644
index 0000000000..20cad7be6e
--- /dev/null
+++ b/.changeset/beige-chairs-repair.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch
+---
+
+Refresh (potentially) updated catalog files on `repo:push` more efficiently.
diff --git a/.changeset/blue-chefs-know.md b/.changeset/blue-chefs-know.md
new file mode 100644
index 0000000000..fa06f52caa
--- /dev/null
+++ b/.changeset/blue-chefs-know.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-azure-devops-backend': patch
+---
+
+Updated installation documentation
diff --git a/.changeset/clean-seals-whisper.md b/.changeset/clean-seals-whisper.md
new file mode 100644
index 0000000000..8891d75f8f
--- /dev/null
+++ b/.changeset/clean-seals-whisper.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-search-react': minor
+---
+
+The `value` of a search analytics event is now set as the total number of search results (when available)
diff --git a/.changeset/create-app-1669720399.md b/.changeset/create-app-1669720399.md
new file mode 100644
index 0000000000..b50d431d4b
--- /dev/null
+++ b/.changeset/create-app-1669720399.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': patch
+---
+
+Bumped create-app version.
diff --git a/.changeset/dry-melons-listen.md b/.changeset/dry-melons-listen.md
new file mode 100644
index 0000000000..07342fb88e
--- /dev/null
+++ b/.changeset/dry-melons-listen.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-search-backend': minor
+'@backstage/plugin-search-backend-module-elasticsearch': minor
+'@backstage/plugin-search-backend-node': minor
+---
+
+numberOfResults is now provided alongside the query result
diff --git a/.changeset/dry-radios-live.md b/.changeset/dry-radios-live.md
new file mode 100644
index 0000000000..057d3d0050
--- /dev/null
+++ b/.changeset/dry-radios-live.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-explore': patch
+---
+
+Update search links to only have header as linkable text
diff --git a/.changeset/eight-tables-hunt.md b/.changeset/eight-tables-hunt.md
new file mode 100644
index 0000000000..bd1be0047f
--- /dev/null
+++ b/.changeset/eight-tables-hunt.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Optimize `Stitcher` process to be more memory efficient
diff --git a/.changeset/famous-cobras-suffer.md b/.changeset/famous-cobras-suffer.md
new file mode 100644
index 0000000000..d09948f876
--- /dev/null
+++ b/.changeset/famous-cobras-suffer.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-github': patch
+---
+
+Added the githubCredentialsProvider property to the GithubLocationAnalyzerOptions to be able to override the GithubCredentialsProvider.
diff --git a/.changeset/fifty-news-stare.md b/.changeset/fifty-news-stare.md
new file mode 100644
index 0000000000..24ad2e20e7
--- /dev/null
+++ b/.changeset/fifty-news-stare.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-catalog-backend': patch
+'@backstage/plugin-catalog-node': minor
+---
+
+Make it possible for entity providers to supply only entity refs, instead of full entities, in `delta` mutation deletions.
diff --git a/.changeset/four-buttons-clean.md b/.changeset/four-buttons-clean.md
new file mode 100644
index 0000000000..41af42b45e
--- /dev/null
+++ b/.changeset/four-buttons-clean.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Handle refresh entity error in `AboutCard`.
diff --git a/.changeset/fresh-news-push.md b/.changeset/fresh-news-push.md
new file mode 100644
index 0000000000..a77b7a256b
--- /dev/null
+++ b/.changeset/fresh-news-push.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-bazaar': patch
+---
+
+`HomePageBazaarInfoCard` is now displaying `title` instead of `name`. Title is a string that doesn't have to be URL friendly.
+The BazaarOverviewCard have the new property `fullHeight`. Link in `BazaarOverviewCard`is moved to header in card.
diff --git a/.changeset/healthy-crabs-collect.md b/.changeset/healthy-crabs-collect.md
new file mode 100644
index 0000000000..5dc90f9b80
--- /dev/null
+++ b/.changeset/healthy-crabs-collect.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-kafka-backend': patch
+---
+
+Internal tweak to adapt to `kafkajs` 2.2.3
diff --git a/.changeset/hip-wasps-yell.md b/.changeset/hip-wasps-yell.md
new file mode 100644
index 0000000000..1cdea4e84d
--- /dev/null
+++ b/.changeset/hip-wasps-yell.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-bazaar': patch
+---
+
+Add `title` as optional parameter to `BazaarOverviewCard`
diff --git a/.changeset/kind-walls-share.md b/.changeset/kind-walls-share.md
new file mode 100644
index 0000000000..5df03999b1
--- /dev/null
+++ b/.changeset/kind-walls-share.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': patch
+---
+
+exported KubernetesContainerRunner, KubernetesContainerRunnerOptions, KubernetesContainerRunnerMountBase
diff --git a/.changeset/light-snakes-exercise.md b/.changeset/light-snakes-exercise.md
new file mode 100644
index 0000000000..45bd37cf27
--- /dev/null
+++ b/.changeset/light-snakes-exercise.md
@@ -0,0 +1,16 @@
+---
+'@backstage/backend-common': minor
+'@backstage/backend-tasks': minor
+'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
+'@backstage/plugin-search-backend-node': patch
+---
+
+Changed to use native `AbortController` and `AbortSignal` from Node.js, instead
+of the one from `node-abort-controller`. This is possible now that the minimum
+supported Node.js version of the project is 16.
+
+Note that their interfaces are very slightly different, but typically not in a
+way that matters to consumers. If you see any typescript errors as a direct
+result from this, they are compatible with each other in the ways that we
+interact with them, and should be possible to type-cast across without ill
+effects.
diff --git a/.changeset/light-turtles-yawn.md b/.changeset/light-turtles-yawn.md
new file mode 100644
index 0000000000..3f42fb0524
--- /dev/null
+++ b/.changeset/light-turtles-yawn.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Fixed deprecated use of `substr` into `substring`.
diff --git a/.changeset/modern-jokes-attack.md b/.changeset/modern-jokes-attack.md
new file mode 100644
index 0000000000..3cb3143f05
--- /dev/null
+++ b/.changeset/modern-jokes-attack.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-components': patch
+---
+
+Made AlertDisplay not crash on undefined messages
diff --git a/.changeset/nasty-melons-build.md b/.changeset/nasty-melons-build.md
new file mode 100644
index 0000000000..35fb520a5e
--- /dev/null
+++ b/.changeset/nasty-melons-build.md
@@ -0,0 +1,12 @@
+---
+'@backstage/plugin-events-backend-module-github': patch
+---
+
+Add `createGithubSignatureValidator(config)` which can be used
+to create a validator used at an ingress for topic `github`.
+
+On top, there is a new `githubWebhookEventsModule` for the new backend plugin API
+which auto-registers the `HttpPostIngress` for topic `github` incl. the validator.
+
+Please find more information at
+https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-github/README.md.
diff --git a/.changeset/nervous-mice-flow.md b/.changeset/nervous-mice-flow.md
new file mode 100644
index 0000000000..c3a25b9f3d
--- /dev/null
+++ b/.changeset/nervous-mice-flow.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-jenkins-backend': patch
+---
+
+Remove unnecessary dependency promise-any-polyfill
diff --git a/.changeset/old-bulldogs-fry.md b/.changeset/old-bulldogs-fry.md
new file mode 100644
index 0000000000..9c8eef67ad
--- /dev/null
+++ b/.changeset/old-bulldogs-fry.md
@@ -0,0 +1,14 @@
+---
+'@backstage/plugin-catalog-backend-module-github': patch
+---
+
+Handle GitHub `push` events at the `GithubEntityProvider` by subscribing to the topic `github.push.`
+
+Implements `EventSubscriber` to receive events for the topic `github.push`.
+
+On `github.push`, the affected repository will be refreshed.
+This includes adding new Location entities, refreshing existing ones,
+and removing obsolete ones.
+
+Please find more information at
+https://backstage.io/docs/integrations/github/discovery#installation-with-events-support
diff --git a/.changeset/old-tips-cough.md b/.changeset/old-tips-cough.md
new file mode 100644
index 0000000000..bcf6de6a53
--- /dev/null
+++ b/.changeset/old-tips-cough.md
@@ -0,0 +1,9 @@
+---
+'@backstage/plugin-adr': patch
+'@backstage/plugin-catalog': patch
+'@backstage/plugin-search-react': patch
+'@backstage/plugin-stack-overflow': patch
+'@backstage/plugin-techdocs': patch
+---
+
+Update search links to only have header as linkable text
diff --git a/.changeset/pre.json b/.changeset/pre.json
index 136b807fdf..8c78c0f0b3 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -187,7 +187,10 @@
"@backstage/plugin-user-settings-backend": "0.1.2",
"@backstage/plugin-vault": "0.1.5",
"@backstage/plugin-vault-backend": "0.2.4",
- "@backstage/plugin-xcmetrics": "0.2.31"
+ "@backstage/plugin-xcmetrics": "0.2.31",
+ "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.0.0",
+ "@backstage/plugin-explore-backend": "0.0.0",
+ "@backstage/plugin-explore-common": "0.0.0"
},
"changesets": [
"angry-dingos-lick",
@@ -197,38 +200,76 @@
"clever-pillows-drive",
"clever-rivers-obey",
"create-app-1669131574",
+ "create-app-1669720399",
"early-hairs-switch",
"early-parrots-guess",
+ "eight-spiders-know",
+ "eight-tables-hunt",
"fair-walls-talk",
+ "famous-cobras-suffer",
"fast-lies-remain",
"fluffy-walls-approve",
+ "forty-baboons-burn",
"four-adults-provide",
+ "four-buttons-clean",
+ "fresh-news-push",
"funny-numbers-compete",
"gold-icons-cheat",
+ "gold-yaks-join",
"gorgeous-hairs-applaud",
+ "healthy-crabs-collect",
+ "hip-chairs-tap",
"hip-stingrays-kneel",
"itchy-walls-boil",
+ "kind-walls-share",
+ "light-snakes-exercise",
+ "light-turtles-yawn",
+ "loud-rockets-reply",
"modern-mugs-shout",
+ "nasty-melons-build",
+ "nervous-mice-flow",
"new-bugs-march",
"nine-ears-whisper",
+ "old-bulldogs-fry",
"old-keys-leave",
+ "old-tips-cough",
+ "pretty-eagles-matter",
+ "pretty-melons-taste",
+ "quick-horses-cry",
"renovate-3fe8460",
"renovate-4bb70f3",
+ "renovate-50ee0c3",
"renovate-778b2fa",
+ "renovate-a5f7839",
+ "rich-balloons-leave",
"rich-garlics-play",
+ "rude-pugs-deny",
+ "rude-sloths-cross",
"search-heavy-frogs-confess",
"search-om-manniskan-ginge",
+ "search-tofu-panaeng",
"serious-windows-occur",
"silly-wolves-remember",
"slow-dragons-promise",
+ "slow-eggs-grab",
+ "slow-flies-marinate",
+ "slow-flies-marry",
+ "smart-radios-change",
"soft-nails-arrive",
"sour-flowers-care",
"sour-plums-grow",
+ "sour-queens-wait",
+ "stupid-clocks-return",
+ "stupid-gifts-serve",
+ "tender-colts-greet",
"tender-parrots-cover",
"thin-donuts-join",
"twelve-meals-smell",
"twenty-dodos-wash",
+ "warm-parents-notice",
"weak-ears-jam",
+ "wicked-games-search",
+ "yellow-forks-knock",
"young-turkeys-relax"
]
}
diff --git a/.changeset/pretty-eagles-matter.md b/.changeset/pretty-eagles-matter.md
new file mode 100644
index 0000000000..64eabd9ce6
--- /dev/null
+++ b/.changeset/pretty-eagles-matter.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-bazaar-backend': patch
+---
+
+Column `title` has replaced column `name` for `BazaarProject` in database
diff --git a/.changeset/pretty-melons-taste.md b/.changeset/pretty-melons-taste.md
new file mode 100644
index 0000000000..9c2a7a13da
--- /dev/null
+++ b/.changeset/pretty-melons-taste.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+JSX and React Fast Refresh transforms are no longer enabled when bundling backend code.
diff --git a/.changeset/quick-horses-cry.md b/.changeset/quick-horses-cry.md
new file mode 100644
index 0000000000..8b40c92b41
--- /dev/null
+++ b/.changeset/quick-horses-cry.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-org': patch
+---
+
+Update `UserProfileCard` and `GroupProfileCard` to not render links unless the `showLinks` prop is set. The primary component for rendering links are the `EntityLinksCard` from plugin-catalog.
diff --git a/.changeset/renovate-1e2853d.md b/.changeset/renovate-1e2853d.md
new file mode 100644
index 0000000000..9378786e80
--- /dev/null
+++ b/.changeset/renovate-1e2853d.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Updated dependency `minimatch` to `5.1.1` and switch version range to `^`.
diff --git a/.changeset/renovate-4cbe4f9.md b/.changeset/renovate-4cbe4f9.md
new file mode 100644
index 0000000000..90d7faa801
--- /dev/null
+++ b/.changeset/renovate-4cbe4f9.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Updated dependency `@rollup/plugin-commonjs` to `^23.0.0`.
diff --git a/.changeset/renovate-50ee0c3.md b/.changeset/renovate-50ee0c3.md
new file mode 100644
index 0000000000..3cdd142cf6
--- /dev/null
+++ b/.changeset/renovate-50ee0c3.md
@@ -0,0 +1,17 @@
+---
+'@backstage/core-app-api': patch
+'@backstage/core-components': patch
+'@backstage/core-plugin-api': patch
+'@backstage/dev-utils': patch
+'@backstage/test-utils': patch
+'@backstage/types': patch
+'@backstage/plugin-catalog-react': patch
+'@backstage/plugin-catalog': patch
+'@backstage/plugin-config-schema': patch
+'@backstage/plugin-scaffolder-backend': patch
+'@backstage/plugin-scaffolder': patch
+'@backstage/plugin-shortcuts': patch
+'@backstage/plugin-user-settings': patch
+---
+
+Updated dependency `zen-observable` to `^0.10.0`.
diff --git a/.changeset/renovate-61ad428.md b/.changeset/renovate-61ad428.md
new file mode 100644
index 0000000000..95e4e27baf
--- /dev/null
+++ b/.changeset/renovate-61ad428.md
@@ -0,0 +1,8 @@
+---
+'@backstage/core-components': patch
+'@backstage/plugin-gcp-projects': patch
+'@backstage/plugin-scaffolder': patch
+'@backstage/plugin-techdocs-module-addons-contrib': patch
+---
+
+Updated dependency `@react-hookz/web` to `^19.0.0`.
diff --git a/.changeset/renovate-ceb9248.md b/.changeset/renovate-ceb9248.md
new file mode 100644
index 0000000000..d1cfe1775e
--- /dev/null
+++ b/.changeset/renovate-ceb9248.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Updated dependency `@rollup/plugin-json` to `^5.0.0`.
diff --git a/.changeset/rude-pugs-deny.md b/.changeset/rude-pugs-deny.md
new file mode 100644
index 0000000000..b877d96285
--- /dev/null
+++ b/.changeset/rude-pugs-deny.md
@@ -0,0 +1,27 @@
+---
+'@backstage/plugin-catalog-backend': minor
+---
+
+The catalog no longer stops after the first processor `validateEntityKind`
+method returns `true` when validating entity kind shapes. Instead, it continues
+through all registered processors that have this method, and requires that _at
+least one_ of them returned true.
+
+The old behavior of stopping early made it harder to extend existing core kinds
+with additional fields, since the `BuiltinKindsEntityProcessor` is always
+present at the top of the processing chain and ensures that your additional
+validation code would never be run.
+
+This is technically a breaking change, although it should not affect anybody
+under normal circumstances, except if you had problematic validation code that
+you were unaware that it was not being run. That code may now start to exhibit
+those problems.
+
+If you need to disable this new behavior, `CatalogBuilder` as used in your
+`packages/backend/src/plugins/catalog.ts` file now has a
+`useLegacySingleProcessorValidation()` method to go back to the old behavior.
+
+```diff
+ const builder = await CatalogBuilder.create(env);
++builder.useLegacySingleProcessorValidation();
+```
diff --git a/.changeset/rude-sloths-cross.md b/.changeset/rude-sloths-cross.md
new file mode 100644
index 0000000000..8d3fc486e8
--- /dev/null
+++ b/.changeset/rude-sloths-cross.md
@@ -0,0 +1,14 @@
+---
+'@backstage/plugin-explore': patch
+'@backstage/plugin-explore-backend': patch
+'@backstage/plugin-explore-common': patch
+'@backstage/plugin-explore-react': patch
+---
+
+Added new `@backstage/plugin-explore-backend` & `@backstage/plugin-explore-common` packages.
+
+This deprecates the `ExploreToolsConfig` API (in `@backstage/plugin-explore-react`) which is replaced by the `ExploreApi` & `ExploreClient`. The list of `ExploreTool` data can now be provided on the backend by either using the supplied `StaticExploreToolProvider` or by implementing a custom `ExploreToolProvider`. See the [explore-backend README](https://github.com/backstage/backstage/blob/master/plugins/explore-backend/README.md) for full details.
+
+NOTE: Existing installations that have customized the `ExploreToolConfig` will continue to work through the new `ExploreClient`. However, existing data should be migrated over to new `explore-backend` plugin as `ExploreToolConfig` will be removed in the future.
+
+BREAKING CHANGE: If you have previously installed the `explore` plugin, but not yet customized the `ExploreToolConfig` API in your `packages/app`, this will result in an empty list of tools.
diff --git a/.changeset/search-tofu-panaeng.md b/.changeset/search-tofu-panaeng.md
new file mode 100644
index 0000000000..1f8bbf6a7b
--- /dev/null
+++ b/.changeset/search-tofu-panaeng.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-search-backend-node': patch
+---
+
+Use of `TestPipeline.withSubject()` is now deprecated. Instead, use the `fromCollator`, `fromDecorator`, or `fromIndexer` static methods to instantiate a test pipeline. You may also use the class' `withCollator`, `withDecorator`, and `withIndexer` instance methods to build test pipelines that consist of multiple test subjects.
diff --git a/.changeset/shy-cycles-add.md b/.changeset/shy-cycles-add.md
new file mode 100644
index 0000000000..2c70f2a8eb
--- /dev/null
+++ b/.changeset/shy-cycles-add.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-graph': patch
+---
+
+Set the default `maxDepth` prop for `EntityRelationsGraph` to a smaller value to provide better readability.
diff --git a/.changeset/silver-rats-rest.md b/.changeset/silver-rats-rest.md
new file mode 100644
index 0000000000..52bb9acd6f
--- /dev/null
+++ b/.changeset/silver-rats-rest.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-search-common': minor
+---
+
+numberOfResults (total number of results for a given query) can now be provided by each search engine and consumed as part of the search results response
diff --git a/.changeset/slow-eggs-grab.md b/.changeset/slow-eggs-grab.md
new file mode 100644
index 0000000000..e4c537687f
--- /dev/null
+++ b/.changeset/slow-eggs-grab.md
@@ -0,0 +1,8 @@
+---
+'@backstage/repo-tools': minor
+---
+
+Api reference documentation improvements
+
+- breadcrumbs links semantics as code spans
+- new `@config` annotation to describe related config keys
diff --git a/.changeset/slow-flies-marinate.md b/.changeset/slow-flies-marinate.md
new file mode 100644
index 0000000000..42d0de5f44
--- /dev/null
+++ b/.changeset/slow-flies-marinate.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-events-backend-module-aws-sqs': patch
+---
+
+Upgrade to AWS SDK for Javascript v3
diff --git a/.changeset/slow-flies-marry.md b/.changeset/slow-flies-marry.md
new file mode 100644
index 0000000000..7882707d32
--- /dev/null
+++ b/.changeset/slow-flies-marry.md
@@ -0,0 +1,8 @@
+---
+'@backstage/plugin-techdocs-node': patch
+---
+
+Upgrade to AWS SDK for Javascript v3
+
+Techdocs support for AWS S3 now requires defining the AWS region to connect to.
+If `techdocs.publisher.awsS3.region` is missing from the config, the AWS environment variable `AWS_REGION` will be used.
diff --git a/.changeset/slow-lies-jam.md b/.changeset/slow-lies-jam.md
new file mode 100644
index 0000000000..a9d7a90b95
--- /dev/null
+++ b/.changeset/slow-lies-jam.md
@@ -0,0 +1,11 @@
+---
+'@backstage/backend-common': patch
+'@backstage/cli': patch
+'@backstage/cli-common': patch
+'@backstage/core-app-api': patch
+'@backstage/core-components': patch
+'@backstage/dev-utils': patch
+'@techdocs/cli': patch
+---
+
+Tweaked wording to use inclusive terminology
diff --git a/.changeset/smart-radios-change.md b/.changeset/smart-radios-change.md
new file mode 100644
index 0000000000..1c7393829d
--- /dev/null
+++ b/.changeset/smart-radios-change.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': patch
+---
+
+Fixed `SingleHostDiscovery` so that it properly handles single-string `backend.listen` configurations such as `:80`.
diff --git a/.changeset/sour-queens-wait.md b/.changeset/sour-queens-wait.md
new file mode 100644
index 0000000000..87231a1eb0
--- /dev/null
+++ b/.changeset/sour-queens-wait.md
@@ -0,0 +1,5 @@
+---
+'@backstage/repo-tools': patch
+---
+
+add the command type-deps to the repo tool package.
diff --git a/.changeset/strange-rocks-hide.md b/.changeset/strange-rocks-hide.md
new file mode 100644
index 0000000000..e171a277fb
--- /dev/null
+++ b/.changeset/strange-rocks-hide.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': minor
+---
+
+The search table also holds the original entity value now and the facets endpoint fetches the filtered entity data from the search table.
diff --git a/.changeset/stupid-clocks-return.md b/.changeset/stupid-clocks-return.md
new file mode 100644
index 0000000000..84b061334f
--- /dev/null
+++ b/.changeset/stupid-clocks-return.md
@@ -0,0 +1,12 @@
+---
+'@backstage/plugin-events-backend-module-gitlab': patch
+---
+
+Add `createGitlabTokenValidator(config)` which can be used
+to create a validator used at an ingress for topic `gitlab`.
+
+On top, there is a new `gitlabWebhookEventsModule` for the new backend plugin API
+which auto-registers the `HttpPostIngress` for topic `gitlab` incl. the validator.
+
+Please find more information at
+https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-gitlab/README.md.
diff --git a/.changeset/warm-parents-notice.md b/.changeset/warm-parents-notice.md
new file mode 100644
index 0000000000..0084a968a1
--- /dev/null
+++ b/.changeset/warm-parents-notice.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-proxy-backend': patch
+---
+
+Documented the `createRouter` method.
diff --git a/.changeset/wicked-games-search.md b/.changeset/wicked-games-search.md
new file mode 100644
index 0000000000..5264995a2d
--- /dev/null
+++ b/.changeset/wicked-games-search.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-cost-insights': patch
+---
+
+added an optional config entry `costInsights.engineerThreshold` to allow users to control the threshold value for the 'negligible' change in costs.
diff --git a/.github/renovate.json5 b/.github/renovate.json5
index 93e0471fd3..b58c0beb05 100644
--- a/.github/renovate.json5
+++ b/.github/renovate.json5
@@ -21,5 +21,10 @@
groupName: 'SVGR monorepo packages',
rangeStrategy: 'replace',
},
+ // We update yarn packages manually as it's gzip'd and we don't want to pollute the repository too much.
+ {
+ matchSourceUrls: ['https://github.com/yarnpkg/berry'],
+ enabled: false,
+ },
],
}
diff --git a/.github/workflows/automate_merge_message.yml b/.github/workflows/automate_merge_message.yml
index c376f7d0f3..9fed796aa5 100644
--- a/.github/workflows/automate_merge_message.yml
+++ b/.github/workflows/automate_merge_message.yml
@@ -27,8 +27,8 @@ jobs:
with:
ref: '${{ github.event.pull_request.merge_commit_sha }}'
- - name: fetch base
- run: git fetch --depth 1 origin ${{ github.event.pull_request.base.sha }}
+ - name: fetch head & base
+ run: git fetch --depth 1 origin ${{ github.event.pull_request.head.sha }} ${{ github.event.pull_request.base.sha }}
# We avoid using the in-source script since this workflow has elevated permissions that we don't want to expose
- name: Generate Message
diff --git a/.github/workflows/automate_stale.yml b/.github/workflows/automate_stale.yml
index 12fccdc7ed..1d8aa525a9 100644
--- a/.github/workflows/automate_stale.yml
+++ b/.github/workflows/automate_stale.yml
@@ -8,7 +8,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- - uses: actions/stale@v5
+ - uses: actions/stale@v6
id: stale
with:
stale-issue-message: >
diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml
index 1ee10e83d3..bebe24d0f6 100644
--- a/.github/workflows/deploy_packages.yml
+++ b/.github/workflows/deploy_packages.yml
@@ -12,6 +12,7 @@ jobs:
needs_release: ${{ steps.release_check.outputs.needs_release }}
strategy:
+ fail-fast: false
matrix:
node-version: [16.x, 18.x]
diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml
index 8d59d15899..59c8d9f7cc 100644
--- a/.github/workflows/verify_e2e-techdocs.yml
+++ b/.github/workflows/verify_e2e-techdocs.yml
@@ -26,7 +26,9 @@ jobs:
steps:
- uses: actions/checkout@v3
- - uses: actions/setup-python@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.9'
- name: install dependencies
run: yarn install --immutable
diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml
index fc29c1f03b..8a49b8fe31 100644
--- a/.github/workflows/verify_e2e-windows.yml
+++ b/.github/workflows/verify_e2e-windows.yml
@@ -49,7 +49,7 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
- name: Add msbuild to PATH
- uses: microsoft/setup-msbuild@v1.0.3
+ uses: microsoft/setup-msbuild@v1.1.3
- name: setup chrome
uses: browser-actions/setup-chrome@latest
- name: yarn install
diff --git a/app-config.yaml b/app-config.yaml
index ef133491af..dd72051189 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -373,6 +373,7 @@ auth:
development: {}
costInsights:
engineerCost: 200000
+ engineerThreshold: 0.5
products:
computeEngine:
name: Compute Engine
diff --git a/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md b/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md
index 3cedf5634b..1bdf9cc367 100644
--- a/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md
+++ b/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md
@@ -48,7 +48,7 @@ Once you've saved the action, you should see an authentication flow be triggered
### Frontend
The Backstage App needs a SignInPage when authentication is required.
-When using ALB authentication Backstage will only be loaded once the user has successfully authenticated; we won't need to display a SignIn page, however we will need to create a dummy SignIn component that can refresh the token.
+When using ALB authentication Backstage will only be loaded once the user has successfully authenticated; we won't need to display a SignIn page, however we will need to create a placeholder SignIn component that can refresh the token.
- edit `packages/app/src/App.tsx`
- import the following two additional definitions from `@backstage/core-plugin-api`: `useApi`, `configApiRef`; these will be used to check whether Backstage is running locally or behind an ALB
@@ -59,7 +59,7 @@ import React from 'react';
import { UserIdentity } from '@backstage/core-components';
import { SignInPageProps } from '@backstage/core-app-api';
-const DummySignInComponent: any = (props: SignInPageProps) => {
+const SampleSignInComponent: any = (props: SignInPageProps) => {
const [error, setError] = React.useState();
const config = useApi(configApiRef);
React.useEffect(() => {
@@ -102,13 +102,13 @@ const DummySignInComponent: any = (props: SignInPageProps) => {
};
```
-- add `DummySignInComponent` as `SignInPage`:
+- add `SampleSignInComponent` as `SignInPage`:
```ts
const app = createApp({
...
components: {
- SignInPage: DummySignInComponent,
+ SignInPage: SampleSignInComponent,
...
},
...
diff --git a/docs/FAQ.md b/docs/FAQ.md
index f695a59410..fcd5542f74 100644
--- a/docs/FAQ.md
+++ b/docs/FAQ.md
@@ -54,7 +54,7 @@ begun work on various aspects of all three phases. Looking at the
[milestones for active issues](https://github.com/backstage/backstage/milestones)
will also give you a sense of our progress.
-### My company doesn't have thousands of developers or services. Is Backstage overkill?
+### My company doesn't have thousands of developers or services. Is using Backstage excessive for our needs?
Not at all! A core reason to adopt Backstage is to standardize how software is
built at your company. It's easier to decide on those standards as a small
diff --git a/docs/architecture-decisions/adr010-luxon-date-library.md b/docs/architecture-decisions/adr010-luxon-date-library.md
index 65cabd256c..a7b287ae0d 100644
--- a/docs/architecture-decisions/adr010-luxon-date-library.md
+++ b/docs/architecture-decisions/adr010-luxon-date-library.md
@@ -10,7 +10,7 @@ description: Architecture Decision Record (ADR) for Luxon Date Library
Date formatting (e.g. `a day ago`) and calculations are common within Backstage.
Some of these useful features are not supported by the standard JavaScript
`Date` object. The popular [Moment.js](https://momentjs.com/) library has been
-commonly used to fill this gap but suffers from large bundle sizes and mutable
+commonly used to fill this gap but is affected by large bundle sizes and mutable
state issues. On top of this, `momentjs` is
[being sunset](https://momentjs.com/docs/#/-project-status/) and the project
recommends using one of the more modern alternative libraries.
diff --git a/docs/auth/cloudflare/access.md b/docs/auth/cloudflare/access.md
index c7db308438..d47495180a 100644
--- a/docs/auth/cloudflare/access.md
+++ b/docs/auth/cloudflare/access.md
@@ -63,7 +63,7 @@ export default async function createPlugin(
// and the access token and produces the Backstage token with the
// relevant user info.
async resolver({ profile, result }, ctx) {
- // Somehow compute the Backstage token claims. Just some dummy code
+ // Somehow compute the Backstage token claims. Just some sample code
// shown here, but you may want to query your LDAP server, or
// https://.cloudflareaccess.com/cdn-cgi/access/get-identity
// https://developers.cloudflare.com/cloudflare-one/identity/users/validating-json/#groups-within-a-jwt
diff --git a/docs/auth/google/gcp-iap-auth.md b/docs/auth/google/gcp-iap-auth.md
index 90d267b327..d6303ced6f 100644
--- a/docs/auth/google/gcp-iap-auth.md
+++ b/docs/auth/google/gcp-iap-auth.md
@@ -70,7 +70,7 @@ export default async function createPlugin(
// and the IAP token and produces the Backstage token with the
// relevant user info.
async resolver({ profile, result: { iapToken } }, ctx) {
- // Somehow compute the Backstage token claims. Just some dummy code
+ // Somehow compute the Backstage token claims. Just some sample code
// shown here, but you may want to query your LDAP server, or
// GSuite or similar, based on the IAP token sub/email claims
const id = iapToken.email.split('@')[0];
diff --git a/docs/deployment/k8s.md b/docs/deployment/k8s.md
index a80ba1816e..b0218c8657 100644
--- a/docs/deployment/k8s.md
+++ b/docs/deployment/k8s.md
@@ -256,7 +256,7 @@ bash-5.1# exit
The database pod is running, but how does another pod connect to it?
-Kubernetes pods are transient - they can be killed, restarted, or created
+Kubernetes pods are transient - they can be stopped, restarted, or created
dynamically. Therefore we don't want to try to connect to pods directly, but
rather create a Kubernetes Service. Services keep track of pods and direct
traffic to the right place.
diff --git a/docs/features/search/getting-started.md b/docs/features/search/getting-started.md
index 726d1557d0..e13401a8e3 100644
--- a/docs/features/search/getting-started.md
+++ b/docs/features/search/getting-started.md
@@ -279,6 +279,8 @@ an example:
```
+> For more advanced customization of the Search frontend, also see how to guides such as [How to implement your own Search API](./how-to-guides.md#how-to-implement-your-own-search-api) and [How to customize search results highlighting styling](./how-to-guides.md#how-to-customize-search-results-highlighting-styling)
+
### Backend
Backstage Search isn't a search engine itself, rather, it provides an interface
@@ -380,3 +382,5 @@ indexBuilder.addCollator({
}),
});
```
+
+> For more advanced customization of the Search backend, also see how to guides such as [How to index TechDocs documents](./how-to-guides.md#how-to-index-techdocs-documents) and [How to limit what can be searched in the Software Catalog](./how-to-guides.md#how-to-limit-what-can-be-searched-in-the-software-catalog)
diff --git a/docs/features/software-catalog/system-model.md b/docs/features/software-catalog/system-model.md
index 8a7e0cd30a..409f3e8450 100644
--- a/docs/features/software-catalog/system-model.md
+++ b/docs/features/software-catalog/system-model.md
@@ -50,7 +50,7 @@ components need to be in a known machine-readable format so we can build further
tooling and analysis on top.
APIs have a visibility: they are either public (making them available for any
-other component to consume), restricted (only available to a whitelisted set of
+other component to consume), restricted (only available to an allowlisted set of
consumers), or private (only available within their system). As public APIs are
going to be the primary way interaction between components, Backstage supports
documenting, indexing and searching all APIs so we can browse them as
diff --git a/docs/features/software-catalog/well-known-relations.md b/docs/features/software-catalog/well-known-relations.md
index 6fb7ae2fea..bfcbcb780a 100644
--- a/docs/features/software-catalog/well-known-relations.md
+++ b/docs/features/software-catalog/well-known-relations.md
@@ -76,6 +76,9 @@ an entity to function. It can for example be used to express that a website
component needs a library component as part of its build, or that a service
component uses a persistent storage resource.
+This relation is commonly generated based on `spec.dependsOn` of the component
+or resource in question.
+
### `parentOf` and `childOf`
A parent/child relation to build up a tree, used for example to describe the
diff --git a/docs/features/techdocs/cli.md b/docs/features/techdocs/cli.md
index dc89f1718b..06eb83dfca 100644
--- a/docs/features/techdocs/cli.md
+++ b/docs/features/techdocs/cli.md
@@ -235,7 +235,7 @@ details.
You need to make sure that your environment is able to authenticate with the
target cloud provider. `techdocs-cli` uses the official Node.js clients provided
-by AWS (v2), Google Cloud and Azure. You can authenticate using environment
+by AWS (v3), Google Cloud and Azure. You can authenticate using environment
variables and/or by other means (`~/.aws/credentials`, `~/.config/gcloud` etc.)
Refer to the Authentication section of the following documentation depending
diff --git a/docs/features/techdocs/configuration.md b/docs/features/techdocs/configuration.md
index 8a54d76ed0..4e806296e5 100644
--- a/docs/features/techdocs/configuration.md
+++ b/docs/features/techdocs/configuration.md
@@ -108,8 +108,8 @@ techdocs:
# (Optional) An API key is required to write to a storage bucket.
# If not set, environment variables or aws config file will be used to authenticate.
- # https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/loading-node-credentials-environment.html
- # https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/loading-node-credentials-shared.html
+ # https://www.npmjs.com/package/@aws-sdk/credential-provider-node
+ # https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
credentials:
accessKeyId: ${TECHDOCS_AWSS3_ACCESS_KEY_ID_CREDENTIAL}
secretAccessKey: ${TECHDOCS_AWSS3_SECRET_ACCESS_KEY_CREDENTIAL}
@@ -121,7 +121,7 @@ techdocs:
# (Optional) Endpoint URI to send requests to.
# If not set, the default endpoint is built from the configured region.
- # https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#constructor-property
+ # https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/s3clientconfig.html#endpoint
endpoint: ${AWS_ENDPOINT}
# (Optional) Whether to use path style URLs when communicating with S3.
diff --git a/docs/features/techdocs/configuring-ci-cd.md b/docs/features/techdocs/configuring-ci-cd.md
index 642fd4ab77..75800c48ca 100644
--- a/docs/features/techdocs/configuring-ci-cd.md
+++ b/docs/features/techdocs/configuring-ci-cd.md
@@ -145,6 +145,8 @@ jobs:
- uses: actions/setup-node@v3
- uses: actions/setup-python@v4
+ with:
+ python-version: '3.9'
# the 2 steps below can be removed if you aren't using plantuml in your documentation
- name: setup java
diff --git a/docs/features/techdocs/using-cloud-storage.md b/docs/features/techdocs/using-cloud-storage.md
index 66b4f09596..3ea57edc6b 100644
--- a/docs/features/techdocs/using-cloud-storage.md
+++ b/docs/features/techdocs/using-cloud-storage.md
@@ -219,22 +219,19 @@ If the environment variables
- `AWS_REGION`
are set and can be used to access the bucket you created in step 2, they will be
-used by the AWS SDK V2 Node.js client for authentication.
-[Refer to the official documentation for loading credentials in Node.js from environment variables](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-environment.html).
+used by the AWS SDK V3 Node.js client for authentication.
+[Refer to the official documentation for loading credentials in Node.js from environment variables](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/loading-node-credentials-environment.html).
If the environment variables are missing, the AWS SDK tries to read the
`~/.aws/credentials` file for credentials.
-[Refer to the official documentation.](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-shared.html)
+[Refer to the official documentation.](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/loading-node-credentials-shared.html)
-If you are using Amazon EC2 instance to deploy Backstage, you do not need to
-obtain the access keys separately. They can be made available in the environment
-automatically by defining appropriate IAM role with access to the bucket. Read
-more in
+If you are deploying Backstage to Amazon EC2, Amazon ECS, or Amazon EKS, you do
+not need to obtain the access keys separately. They can be made available in the
+environment automatically by defining appropriate IAM role with access to the
+bucket. Read more in the
[official AWS documentation for using IAM roles.](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html#use-roles).
-The AWS Region of the bucket is optional since TechDocs uses AWS SDK V2 and not
-V3.
-
**4b. Authentication using app-config.yaml**
AWS credentials and region can be provided to the AWS SDK via `app-config.yaml`.
@@ -254,7 +251,7 @@ techdocs:
```
Refer to the
-[official AWS documentation for obtaining the credentials](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/getting-your-credentials.html).
+[official AWS documentation for obtaining the credentials](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html).
**4c. Authentication using an assumed role** Users with multiple AWS accounts
may want to use a role for S3 storage that is in a different AWS account. Using
diff --git a/docs/getting-started/contributors.md b/docs/getting-started/contributors.md
index 1bf3d6bc7d..cda53f8a54 100644
--- a/docs/getting-started/contributors.md
+++ b/docs/getting-started/contributors.md
@@ -29,8 +29,9 @@ After you have cloned the Backstage repository, you should run the following
commands once to set things up for development:
```bash
-$ yarn install # fetch dependency packages - may take a while
+$ cd backstage # change to root directory of project
+$ yarn install # fetch dependency packages - may take a while
$ yarn tsc # does a first run of type generation and checks
```
diff --git a/docs/getting-started/homepage.md b/docs/getting-started/homepage.md
index eac76b5fdc..2d34998013 100644
--- a/docs/getting-started/homepage.md
+++ b/docs/getting-started/homepage.md
@@ -78,7 +78,7 @@ const routes = (
)
```
-### 4. Update sidebar items
+#### 4. Update sidebar items
Let's update the route for "Home" in the Backstage sidebar to point to the new homepage. We'll also add a Sidebar item to quickly open Catalog.
diff --git a/docs/integrations/github/discovery.md b/docs/integrations/github/discovery.md
index 4f032901a9..bbbe86a834 100644
--- a/docs/integrations/github/discovery.md
+++ b/docs/integrations/github/discovery.md
@@ -14,7 +14,7 @@ organization and register entities matching the configured path. This can be
useful as an alternative to static locations or manually adding things to the
catalog. This is the preferred method for ingesting entities into the catalog.
-## Installation
+## Installation without Events Support
You will have to add the provider in the catalog initialization code of your
backend. They are not installed by default, therefore you have to add a
@@ -53,6 +53,52 @@ And then add the entity provider to your catalog builder:
}
```
+## Installation with Events Support
+
+Please follow the installation instructions at
+
+- https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md
+- https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-github/README.md
+
+Additionally, you need to decide how you want to receive events from external sources like
+
+- [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md)
+- [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md)
+
+Set up your provider
+
+```diff
+// packages/backend/src/plugins/catalogEventBasedProviders.ts
++import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github';
+ import { EntityProvider } from '@backstage/plugin-catalog-node';
+ import { EventSubscriber } from '@backstage/plugin-events-node';
+ import { PluginEnvironment } from '../types';
+ export default async function createCatalogEventBasedProviders(
+- _: PluginEnvironment,
++ env: PluginEnvironment,
+ ): Promise> {
+ const providers: Array<
+ (EntityProvider & EventSubscriber) | Array
+ > = [];
+- // add your event-based entity providers here
++ providers.push(
++ GithubEntityProvider.fromConfig(env.config, {
++ logger: env.logger,
++ // optional: alternatively, use scheduler with schedule defined in app-config.yaml
++ schedule: env.scheduler.createScheduledTaskRunner({
++ frequency: { minutes: 30 },
++ timeout: { minutes: 3 },
++ }),
++ // optional: alternatively, use schedule
++ scheduler: env.scheduler,
++ }),
++ );
+ return providers.flat();
+ }
+```
+
+You can check the official docs to [configure your webhook](https://docs.github.com/en/developers/webhooks-and-events/webhooks/creating-webhooks) and to [secure your request](https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks). The webhook will need to be configured to forward `push` events.
+
## Configuration
To use the discovery provider, you'll need a GitHub integration
diff --git a/docs/overview/architecture-overview.md b/docs/overview/architecture-overview.md
index 384ab6cf32..3ba3f4ba0b 100644
--- a/docs/overview/architecture-overview.md
+++ b/docs/overview/architecture-overview.md
@@ -260,7 +260,7 @@ development dependency only.
It can sometimes be difficult to decide where to place your plugin code. For example
should it go directly in the `-backend` plugin package or in the `-node` package?
-As a rule of thumb you should try to keep the exposure of your code as low
+As a general guideline you should try to keep the exposure of your code as low
as possible. If it doesn't need to be public API, it's best to avoid. If you don't
need it to be used by other plugins, then keep it directly in the plugin packages.
diff --git a/docs/plugins/analytics.md b/docs/plugins/analytics.md
index 46e1d354df..e04cb9c5c6 100644
--- a/docs/plugins/analytics.md
+++ b/docs/plugins/analytics.md
@@ -52,13 +52,13 @@ learn how to contribute the integration yourself!
The following table summarizes events that, depending on the plugins you have
installed, may be captured.
-| Action | Subject | Other Notes |
-| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------- |
-| `navigate` | The URL of the page that was navigated to | |
-| `click` | The text of the link that was clicked on | The `to` attribute represents the URL clicked to |
-| `create` | The `name` of the software being created; if no `name` property is requested by the given Software Template, then the string `new {templateName}` is used instead. | The context holds an `entityRef`, set to the template's ref (e.g. `template:default/template-name`) |
-| `search` | The search term entered in any search bar component | The context holds `searchTypes`, representing `types` constraining the search |
-| `discover` | The title of the search result that was clicked on | The `value` is the result rank. A `to` attribute is also provided |
+| Action | Subject | Other Notes |
+| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `navigate` | The URL of the page that was navigated to | |
+| `click` | The text of the link that was clicked on | The `to` attribute represents the URL clicked to |
+| `create` | The `name` of the software being created; if no `name` property is requested by the given Software Template, then the string `new {templateName}` is used instead. | The context holds an `entityRef`, set to the template's ref (e.g. `template:default/template-name`) |
+| `search` | The search term entered in any search bar component | - The context holds `searchTypes`, representing `types` constraining the search. The `value` represents the total number of search results for the query. This may not be visible if the permission framework is being used. |
+| `discover` | The title of the search result that was clicked on | The `value` is the result rank. A `to` attribute is also provided |
If there is an event you'd like to see captured, please [open an
issue][add-event] describing the event you want to see and the questions it
diff --git a/docs/plugins/backend-plugin.md b/docs/plugins/backend-plugin.md
index 3eddb9e1c2..65a668d391 100644
--- a/docs/plugins/backend-plugin.md
+++ b/docs/plugins/backend-plugin.md
@@ -51,7 +51,7 @@ terminal window, now run
curl localhost:7007/carmen/health
```
-This should return `{"status":"ok"}`. Success! Press `Ctrl + c` to kill it
+This should return `{"status":"ok"}`. Success! Press `Ctrl + c` to stop it
again.
## Developing your Backend Plugin
diff --git a/docs/plugins/testing.md b/docs/plugins/testing.md
index aa7815728c..baee47c695 100644
--- a/docs/plugins/testing.md
+++ b/docs/plugins/testing.md
@@ -123,7 +123,7 @@ than simply letting them know they had an invalid input.
> input change.
This piggybacks the Scalability Principle and applies primarily to frontend
-development. As a general rule of thumb, frontends should be flexible enough so
+development. As a general guideline, frontends should be flexible enough so
that the UX or design can change while touching the least amount of code
possible. So for example, a poor unit test would verify the color of a button
when it is hovered. This would be a poor unit test, because if you decide to
@@ -353,7 +353,7 @@ For more information:
### Accessing `store`, `theme`, routing, browser history, etc.
The Backstage application has several core providers at its root. To run your
-test wrapped in a "dummy" Backstage application, you can use our utility
+test wrapped in a "sample" Backstage application, you can use our utility
functions:
**`wrapInTestApp`**
diff --git a/docs/plugins/url-reader.md b/docs/plugins/url-reader.md
index 8788737f17..815674091b 100644
--- a/docs/plugins/url-reader.md
+++ b/docs/plugins/url-reader.md
@@ -268,7 +268,7 @@ async function main() {
```
This will be run every time you restart the backend. Note that after any change
-in the URL Reader code, you need to kill the backend and restart, since the
+in the URL Reader code, you need to stop the backend and restart, since the
`reader` instance is memoized and does not update on hot module reloading. Also,
there are a lot of unit tests written for the URL Readers, which you can make
use of.
diff --git a/docs/releases/v1.9.0-next.1-changelog.md b/docs/releases/v1.9.0-next.1-changelog.md
new file mode 100644
index 0000000000..862734131a
--- /dev/null
+++ b/docs/releases/v1.9.0-next.1-changelog.md
@@ -0,0 +1,2325 @@
+# Release v1.9.0-next.1
+
+## @backstage/backend-common@0.17.0-next.1
+
+### Minor Changes
+
+- de8a975911: Changed to use native `AbortController` and `AbortSignal` from Node.js, instead
+ of the one from `node-abort-controller`. This is possible now that the minimum
+ supported Node.js version of the project is 16.
+
+ Note that their interfaces are very slightly different, but typically not in a
+ way that matters to consumers. If you see any typescript errors as a direct
+ result from this, they are compatible with each other in the ways that we
+ interact with them, and should be possible to type-cast across without ill
+ effects.
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- 1f2b2de3fe: exported KubernetesContainerRunner, KubernetesContainerRunnerOptions, KubernetesContainerRunnerMountBase
+- 6b82598bd8: Added the ability to understand Job Artifact URLs to the GitLab integration
+- 8646067e07: Fixed `SingleHostDiscovery` so that it properly handles single-string `backend.listen` configurations such as `:80`.
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config-loader@1.1.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/cli-common@0.1.10
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/backend-tasks@0.4.0-next.1
+
+### Minor Changes
+
+- de8a975911: Changed to use native `AbortController` and `AbortSignal` from Node.js, instead
+ of the one from `node-abort-controller`. This is possible now that the minimum
+ supported Node.js version of the project is 16.
+
+ Note that their interfaces are very slightly different, but typically not in a
+ way that matters to consumers. If you see any typescript errors as a direct
+ result from this, they are compatible with each other in the ways that we
+ interact with them, and should be possible to type-cast across without ill
+ effects.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/repo-tools@0.1.0-next.1
+
+### Minor Changes
+
+- 03843259b4: Api reference documentation improvements
+
+ - breadcrumbs links semantics as code spans
+ - new `@config` annotation to describe related config keys
+
+### Patch Changes
+
+- 71f80eb354: add the command type-deps to the repo tool package.
+- Updated dependencies
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-catalog-backend@1.6.0-next.1
+
+### Minor Changes
+
+- c395abb5b2: The catalog no longer stops after the first processor `validateEntityKind`
+ method returns `true` when validating entity kind shapes. Instead, it continues
+ through all registered processors that have this method, and requires that _at
+ least one_ of them returned true.
+
+ The old behavior of stopping early made it harder to extend existing core kinds
+ with additional fields, since the `BuiltinKindsEntityProcessor` is always
+ present at the top of the processing chain and ensures that your additional
+ validation code would never be run.
+
+ This is technically a breaking change, although it should not affect anybody
+ under normal circumstances, except if you had problematic validation code that
+ you were unaware that it was not being run. That code may now start to exhibit
+ those problems.
+
+ If you need to disable this new behavior, `CatalogBuilder` as used in your
+ `packages/backend/src/plugins/catalog.ts` file now has a
+ `useLegacySingleProcessorValidation()` method to go back to the old behavior.
+
+ ```diff
+ const builder = await CatalogBuilder.create(env);
+ +builder.useLegacySingleProcessorValidation();
+ ```
+
+### Patch Changes
+
+- 2a8e3cc0b5: Optimize `Stitcher` process to be more memory efficient
+- 5b3e2afa45: Fixed deprecated use of `substr` into `substring`.
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/plugin-permission-node@0.7.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-scaffolder-common@1.2.3-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.1.0-next.0
+
+### Minor Changes
+
+- 98c643a1a2: Introduces incremental entity providers, which are used for streaming very large data sources into the catalog.
+
+### Patch Changes
+
+- de8a975911: Changed to use native `AbortController` and `AbortSignal` from Node.js, instead
+ of the one from `node-abort-controller`. This is possible now that the minimum
+ supported Node.js version of the project is 16.
+
+ Note that their interfaces are very slightly different, but typically not in a
+ way that matters to consumers. If you see any typescript errors as a direct
+ result from this, they are compatible with each other in the ways that we
+ interact with them, and should be possible to type-cast across without ill
+ effects.
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/backend-test-utils@0.1.31-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
+## @backstage/app-defaults@1.0.9-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/backend-app-api@0.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-permission-node@0.7.2-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/backend-defaults@0.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-app-api@0.2.4-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+
+## @backstage/backend-plugin-api@0.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
+## @backstage/backend-test-utils@0.1.31-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/cli@0.21.2-next.1
+ - @backstage/backend-app-api@0.2.4-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+
+## @backstage/catalog-client@1.2.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/catalog-model@1.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/cli@0.21.2-next.1
+
+### Patch Changes
+
+- 8fffe42708: JSX and React Fast Refresh transforms are no longer enabled when bundling backend code.
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config-loader@1.1.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/release-manifests@0.0.8-next.0
+ - @backstage/cli-common@0.1.10
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/config@1.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+
+## @backstage/config-loader@1.1.7-next.1
+
+### Patch Changes
+
+- 40e7e6e1a2: Updated dependency `typescript-json-schema` to `^0.55.0`.
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/cli-common@0.1.10
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/core-app-api@1.2.1-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+
+## @backstage/core-components@0.12.1-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/core-plugin-api@1.1.1-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+
+## @backstage/create-app@0.4.35-next.1
+
+### Patch Changes
+
+- Bumped create-app version.
+- Updated dependencies
+ - @backstage/cli-common@0.1.10
+
+## @backstage/dev-utils@1.0.9-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/test-utils@1.2.3-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/app-defaults@1.0.9-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/errors@1.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+
+## @backstage/integration@1.4.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/integration-react@1.1.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/theme@0.2.16
+
+## @techdocs/cli@1.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-techdocs-node@1.4.3-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/cli-common@0.1.10
+
+## @backstage/test-utils@1.2.3-next.1
+
+### Patch Changes
+
+- 5e238ed56a: The test utility for the plugin context called `MockPluginProvider` has been created. It will be handy in the cases when you use
+ `__experimentalConfigure` in your plugin. It is experimental and exported through `@backstage/test-utils/alpha`.
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
+## @backstage/types@1.0.2-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+
+## @backstage/version-bridge@1.0.3-next.0
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+
+## @backstage/plugin-adr@0.2.4-next.1
+
+### Patch Changes
+
+- a19cffbeed: Update search links to only have header as linkable text
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-adr-common@0.2.4-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-adr-backend@0.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-adr-common@0.2.4-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-adr-common@0.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-airbrake@0.3.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/test-utils@1.2.3-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/dev-utils@1.0.9-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-airbrake-backend@0.2.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+
+## @backstage/plugin-allure@0.1.28-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-analytics-module-ga@0.1.23-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-apache-airflow@0.2.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+
+## @backstage/plugin-api-docs@0.8.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-catalog@1.6.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-apollo-explorer@0.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-app-backend@0.3.39-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config-loader@1.1.7-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+
+## @backstage/plugin-auth-backend@0.17.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-auth-node@0.2.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-azure-devops@0.2.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-azure-devops-common@0.3.0
+
+## @backstage/plugin-azure-devops-backend@0.3.18-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-azure-devops-common@0.3.0
+
+## @backstage/plugin-azure-sites@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-azure-sites-common@0.1.0
+
+## @backstage/plugin-azure-sites-backend@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-azure-sites-common@0.1.0
+
+## @backstage/plugin-badges@0.2.36-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-badges-backend@0.1.33-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-bazaar@0.2.1-next.1
+
+### Patch Changes
+
+- 9b1891061c: `HomePageBazaarInfoCard` is now displaying `title` instead of `name`. Title is a string that doesn't have to be URL friendly.
+ The BazaarOverviewCard have the new property `fullHeight`. Link in `BazaarOverviewCard`is moved to header in card.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-catalog@1.6.2-next.1
+ - @backstage/cli@0.21.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-bazaar-backend@0.2.2-next.1
+
+### Patch Changes
+
+- 9b1891061c: Column `title` has replaced column `name` for `BazaarProject` in database
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-test-utils@0.1.31-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-bitbucket-cloud-common@0.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.4.1-next.1
+
+## @backstage/plugin-bitrise@0.1.39-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-catalog@1.6.2-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- ca04d97b09: Handle refresh entity error in `AboutCard`.
+- a19cffbeed: Update search links to only have header as linkable text
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-catalog-backend-module-aws@0.1.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-catalog-backend-module-azure@0.1.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket@0.2.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-bitbucket-cloud-common@0.2.2-next.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.6-next.1
+
+### Patch Changes
+
+- 4eb0bce299: Fix repo:push topic not matching `BitbucketCloudEventRouter`.
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/plugin-bitbucket-cloud-common@0.2.2-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.1.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-catalog-backend-module-github@0.2.2-next.1
+
+### Patch Changes
+
+- fe93cce743: Added the githubCredentialsProvider property to the GithubLocationAnalyzerOptions to be able to override the GithubCredentialsProvider.
+
+- a0fd4af94a: Handle GitHub `push` events at the `GithubEntityProvider` by subscribing to the topic `github.push.`
+
+ Implements `EventSubscriber` to receive events for the topic `github.push`.
+
+ On `github.push`, the affected repository will be refreshed.
+ This includes adding new Location entities, refreshing existing ones,
+ and removing obsolete ones.
+
+ Please find more information at
+
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.1.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-catalog-backend-module-ldap@0.5.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-catalog-backend-module-msgraph@0.4.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
+## @backstage/plugin-catalog-backend-module-openapi@0.1.5-next.1
+
+### Patch Changes
+
+- dd995cdc72: Enabled support of resolving `$refs` in all kind of yaml documents, not only OpenAPI. This implicitly adds `$ref` resolving support for AsyncAPI specs. Thus, the `openApiPlaceholderResolver` has been renamed to `jsonSchemaRefPlaceholderResolver`.
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
+## @backstage/plugin-catalog-common@1.0.9-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-catalog-graph@0.2.24-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-catalog-graphql@0.3.16-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
+## @backstage/plugin-catalog-import@0.9.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+
+## @backstage/plugin-catalog-node@1.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+
+## @backstage/plugin-catalog-react@1.2.2-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
+## @backstage/plugin-cicd-statistics@0.1.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
+## @backstage/plugin-cicd-statistics-module-gitlab@0.1.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/plugin-cicd-statistics@0.1.14-next.1
+
+## @backstage/plugin-circleci@0.3.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-cloudbuild@0.3.12-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-code-climate@0.1.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-code-coverage@0.2.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-code-coverage-backend@0.2.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-codescene@0.1.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-config-schema@0.1.35-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-cost-insights@0.12.1-next.1
+
+### Patch Changes
+
+- d379b6f070: Internal refactor to avoid usage of deprecated symbols
+- f97c7fd1f7: added an optional config entry `costInsights.engineerThreshold` to allow users to control the threshold value for the 'negligible' change in costs.
+- a5ecdb99f0: Making a possibility to hide a trending line in a cost insights plugin
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/test-utils@1.2.3-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-cost-insights-common@0.1.1
+
+## @backstage/plugin-dynatrace@1.0.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-events-backend@0.2.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
+## @backstage/plugin-events-backend-module-aws-sqs@0.1.1-next.1
+
+### Patch Changes
+
+- dd008a10c1: Upgrade to AWS SDK for Javascript v3
+- Updated dependencies
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
+## @backstage/plugin-events-backend-module-azure@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
+## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
+## @backstage/plugin-events-backend-module-gerrit@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
+## @backstage/plugin-events-backend-module-github@0.1.1-next.1
+
+### Patch Changes
+
+- 0f46ec304c: Add `createGithubSignatureValidator(config)` which can be used
+ to create a validator used at an ingress for topic `github`.
+
+ On top, there is a new `githubWebhookEventsModule` for the new backend plugin API
+ which auto-registers the `HttpPostIngress` for topic `github` incl. the validator.
+
+ Please find more information at
+ .
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
+## @backstage/plugin-events-backend-module-gitlab@0.1.1-next.1
+
+### Patch Changes
+
+- 31fe8f256a: Add `createGitlabTokenValidator(config)` which can be used
+ to create a validator used at an ingress for topic `gitlab`.
+
+ On top, there is a new `gitlabWebhookEventsModule` for the new backend plugin API
+ which auto-registers the `HttpPostIngress` for topic `gitlab` incl. the validator.
+
+ Please find more information at
+ .
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
+## @backstage/plugin-events-backend-test-utils@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.2.0-next.1
+
+## @backstage/plugin-events-node@0.2.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+
+## @backstage/plugin-explore@0.3.43-next.1
+
+### Patch Changes
+
+- 4dec6f16be: Added new `@backstage/plugin-explore-backend` & `@backstage/plugin-explore-common` packages.
+
+ This deprecates the `ExploreToolsConfig` API (in `@backstage/plugin-explore-react`) which is replaced by the `ExploreApi` & `ExploreClient`. The list of `ExploreTool` data can now be provided on the backend by either using the supplied `StaticExploreToolProvider` or by implementing a custom `ExploreToolProvider`. See the [explore-backend README](https://github.com/backstage/backstage/blob/master/plugins/explore-backend/README.md) for full details.
+
+ NOTE: Existing installations that have customized the `ExploreToolConfig` will continue to work through the new `ExploreClient`. However, existing data should be migrated over to new `explore-backend` plugin as `ExploreToolConfig` will be removed in the future.
+
+ BREAKING CHANGE: If you have previously installed the `explore` plugin, but not yet customized the `ExploreToolConfig` API in your `packages/app`, this will result in an empty list of tools.
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/plugin-explore-common@0.0.1-next.0
+ - @backstage/plugin-explore-react@0.0.24-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-explore-backend@0.0.1-next.0
+
+### Patch Changes
+
+- 4dec6f16be: Added new `@backstage/plugin-explore-backend` & `@backstage/plugin-explore-common` packages.
+
+ This deprecates the `ExploreToolsConfig` API (in `@backstage/plugin-explore-react`) which is replaced by the `ExploreApi` & `ExploreClient`. The list of `ExploreTool` data can now be provided on the backend by either using the supplied `StaticExploreToolProvider` or by implementing a custom `ExploreToolProvider`. See the [explore-backend README](https://github.com/backstage/backstage/blob/master/plugins/explore-backend/README.md) for full details.
+
+ NOTE: Existing installations that have customized the `ExploreToolConfig` will continue to work through the new `ExploreClient`. However, existing data should be migrated over to new `explore-backend` plugin as `ExploreToolConfig` will be removed in the future.
+
+ BREAKING CHANGE: If you have previously installed the `explore` plugin, but not yet customized the `ExploreToolConfig` API in your `packages/app`, this will result in an empty list of tools.
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-explore-common@0.0.1-next.0
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-explore-common@0.0.1-next.0
+
+### Patch Changes
+
+- 4dec6f16be: Added new `@backstage/plugin-explore-backend` & `@backstage/plugin-explore-common` packages.
+
+ This deprecates the `ExploreToolsConfig` API (in `@backstage/plugin-explore-react`) which is replaced by the `ExploreApi` & `ExploreClient`. The list of `ExploreTool` data can now be provided on the backend by either using the supplied `StaticExploreToolProvider` or by implementing a custom `ExploreToolProvider`. See the [explore-backend README](https://github.com/backstage/backstage/blob/master/plugins/explore-backend/README.md) for full details.
+
+ NOTE: Existing installations that have customized the `ExploreToolConfig` will continue to work through the new `ExploreClient`. However, existing data should be migrated over to new `explore-backend` plugin as `ExploreToolConfig` will be removed in the future.
+
+ BREAKING CHANGE: If you have previously installed the `explore` plugin, but not yet customized the `ExploreToolConfig` API in your `packages/app`, this will result in an empty list of tools.
+
+## @backstage/plugin-explore-react@0.0.24-next.1
+
+### Patch Changes
+
+- 4dec6f16be: Added new `@backstage/plugin-explore-backend` & `@backstage/plugin-explore-common` packages.
+
+ This deprecates the `ExploreToolsConfig` API (in `@backstage/plugin-explore-react`) which is replaced by the `ExploreApi` & `ExploreClient`. The list of `ExploreTool` data can now be provided on the backend by either using the supplied `StaticExploreToolProvider` or by implementing a custom `ExploreToolProvider`. See the [explore-backend README](https://github.com/backstage/backstage/blob/master/plugins/explore-backend/README.md) for full details.
+
+ NOTE: Existing installations that have customized the `ExploreToolConfig` will continue to work through the new `ExploreClient`. However, existing data should be migrated over to new `explore-backend` plugin as `ExploreToolConfig` will be removed in the future.
+
+ BREAKING CHANGE: If you have previously installed the `explore` plugin, but not yet customized the `ExploreToolConfig` API in your `packages/app`, this will result in an empty list of tools.
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-explore-common@0.0.1-next.0
+
+## @backstage/plugin-firehydrant@0.1.29-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-fossa@0.2.44-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-gcalendar@0.3.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-gcp-projects@0.3.31-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-git-release-manager@0.3.25-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-github-actions@0.5.12-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-github-deployments@0.1.43-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-github-issues@0.2.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-github-pull-requests-board@0.1.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-gitops-profiles@0.3.30-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-gocd@0.1.18-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-graphiql@0.2.44-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-graphql-backend@0.1.29-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-catalog-graphql@0.3.16-next.1
+
+## @backstage/plugin-home@0.4.28-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-stack-overflow@0.1.8-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-ilert@0.2.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-jenkins@0.7.11-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-jenkins-common@0.1.11-next.1
+
+## @backstage/plugin-jenkins-backend@0.1.29-next.1
+
+### Patch Changes
+
+- cfe2b98fbe: Remove unnecessary dependency promise-any-polyfill
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-jenkins-common@0.1.11-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
+## @backstage/plugin-jenkins-common@0.1.11-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
+## @backstage/plugin-kafka@0.3.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-kafka-backend@0.2.32-next.1
+
+### Patch Changes
+
+- 0b54dbaf7d: Internal tweak to adapt to `kafkajs` 2.2.3
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-kubernetes@0.7.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-kubernetes-common@0.4.5-next.1
+
+## @backstage/plugin-kubernetes-backend@0.8.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-test-utils@0.1.31-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-kubernetes-common@0.4.5-next.1
+
+## @backstage/plugin-kubernetes-common@0.4.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.1.4-next.1
+
+## @backstage/plugin-lighthouse@0.3.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-newrelic@0.3.30-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-newrelic-dashboard@0.2.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-org@0.6.2-next.1
+
+### Patch Changes
+
+- 67cedfe42e: Update `UserProfileCard` and `GroupProfileCard` to not render links unless the `showLinks` prop is set. The primary component for rendering links are the `EntityLinksCard` from plugin-catalog.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-org-react@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-pagerduty@0.5.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-periskop@0.1.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-periskop-backend@0.1.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+
+## @backstage/plugin-permission-backend@0.5.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/plugin-permission-node@0.7.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
+## @backstage/plugin-permission-common@0.7.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-permission-node@0.7.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
+## @backstage/plugin-permission-react@0.4.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
+## @backstage/plugin-playlist@0.1.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-playlist-common@0.1.3-next.1
+
+## @backstage/plugin-playlist-backend@0.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-test-utils@0.1.31-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/plugin-permission-node@0.7.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-playlist-common@0.1.3-next.1
+
+## @backstage/plugin-playlist-common@0.1.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
+## @backstage/plugin-proxy-backend@0.2.33-next.1
+
+### Patch Changes
+
+- 03843259b4: Documented the `createRouter` method.
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+
+## @backstage/plugin-rollbar@0.4.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-rollbar-backend@0.1.36-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+
+## @backstage/plugin-scaffolder@1.9.0-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-scaffolder-common@1.2.3-next.1
+
+## @backstage/plugin-scaffolder-backend@1.8.1-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-scaffolder-common@1.2.3-next.1
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-scaffolder-backend@1.8.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-scaffolder-backend@1.8.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-scaffolder-backend@1.8.1-next.1
+ - @backstage/config@1.0.5-next.1
+
+## @backstage/plugin-scaffolder-common@1.2.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
+## @backstage/plugin-search@1.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-search-backend@1.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-search-backend-node@1.0.5-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/plugin-permission-node@0.7.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-search-backend-module-elasticsearch@1.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.0.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-search-backend-module-pg@0.4.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-search-backend-node@1.0.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-search-backend-node@1.0.5-next.1
+
+### Patch Changes
+
+- de8a975911: Changed to use native `AbortController` and `AbortSignal` from Node.js, instead
+ of the one from `node-abort-controller`. This is possible now that the minimum
+ supported Node.js version of the project is 16.
+
+ Note that their interfaces are very slightly different, but typically not in a
+ way that matters to consumers. If you see any typescript errors as a direct
+ result from this, they are compatible with each other in the ways that we
+ interact with them, and should be possible to type-cast across without ill
+ effects.
+
+- 54c5836f7a: Use of `TestPipeline.withSubject()` is now deprecated. Instead, use the `fromCollator`, `fromDecorator`, or `fromIndexer` static methods to instantiate a test pipeline. You may also use the class' `withCollator`, `withDecorator`, and `withIndexer` instance methods to build test pipelines that consist of multiple test subjects.
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-search-common@1.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
+## @backstage/plugin-search-react@1.2.2-next.1
+
+### Patch Changes
+
+- a19cffbeed: Update search links to only have header as linkable text
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-sentry@0.4.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-shortcuts@0.3.4-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-sonarqube@0.5.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-sonarqube-backend@0.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-splunk-on-call@0.4.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-stack-overflow@0.1.8-next.1
+
+### Patch Changes
+
+- a19cffbeed: Update search links to only have header as linkable text
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-home@0.4.28-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-stack-overflow-backend@0.1.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.21.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-tech-insights@0.3.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-tech-insights-common@0.2.9-next.1
+
+## @backstage/plugin-tech-insights-backend@0.5.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-tech-insights-node@0.3.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-tech-insights-common@0.2.9-next.1
+
+## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-tech-insights-node@0.3.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-tech-insights-common@0.2.9-next.1
+
+## @backstage/plugin-tech-insights-common@0.2.9-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+
+## @backstage/plugin-tech-insights-node@0.3.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-tech-insights-common@0.2.9-next.1
+
+## @backstage/plugin-tech-radar@0.5.19-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-techdocs@1.4.1-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- a19cffbeed: Update search links to only have header as linkable text
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/plugin-techdocs-react@1.0.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-techdocs-addons-test-utils@1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-catalog@1.6.2-next.1
+ - @backstage/plugin-techdocs@1.4.1-next.1
+ - @backstage/test-utils@1.2.3-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/plugin-techdocs-react@1.0.7-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-techdocs-backend@1.4.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-techdocs-node@1.4.3-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/plugin-techdocs-react@1.0.7-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-techdocs-node@1.4.3-next.1
+
+### Patch Changes
+
+- 0a61aab172: Bump dependency @azure/identity to next minor
+
+- 37931c33ce: Upgrade to AWS SDK for Javascript v3
+
+ Techdocs support for AWS S3 now requires defining the AWS region to connect to.
+ If `techdocs.publisher.awsS3.region` is missing from the config, the AWS environment variable `AWS_REGION` will be used.
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## @backstage/plugin-techdocs-react@1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
+## @backstage/plugin-todo@0.2.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-todo-backend@0.1.36-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-user-settings@0.6.0-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-user-settings-backend@0.1.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-vault@0.1.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-vault-backend@0.2.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-test-utils@0.1.31-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @backstage/plugin-xcmetrics@0.2.32-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## example-app@0.2.78-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-cloudbuild@0.3.12-next.1
+ - @backstage/plugin-gcp-projects@0.3.31-next.1
+ - @backstage/plugin-github-actions@0.5.12-next.1
+ - @backstage/plugin-graphiql@0.2.44-next.1
+ - @backstage/plugin-techdocs@1.4.1-next.1
+ - @backstage/plugin-cost-insights@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/plugin-stack-overflow@0.1.8-next.1
+ - @backstage/cli@0.21.2-next.1
+ - @backstage/plugin-org@0.6.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/plugin-scaffolder@1.9.0-next.1
+ - @backstage/plugin-shortcuts@0.3.4-next.1
+ - @backstage/plugin-user-settings@0.6.0-next.1
+ - @backstage/plugin-explore@0.3.43-next.1
+ - @backstage/app-defaults@1.0.9-next.1
+ - @backstage/plugin-apache-airflow@0.2.5-next.1
+ - @backstage/plugin-api-docs@0.8.12-next.1
+ - @backstage/plugin-azure-devops@0.2.3-next.1
+ - @backstage/plugin-azure-sites@0.1.1-next.1
+ - @backstage/plugin-badges@0.2.36-next.1
+ - @backstage/plugin-catalog-graph@0.2.24-next.1
+ - @backstage/plugin-catalog-import@0.9.2-next.1
+ - @backstage/plugin-circleci@0.3.12-next.1
+ - @backstage/plugin-code-coverage@0.2.5-next.1
+ - @backstage/plugin-dynatrace@1.0.2-next.1
+ - @backstage/plugin-gcalendar@0.3.8-next.1
+ - @backstage/plugin-gocd@0.1.18-next.1
+ - @backstage/plugin-home@0.4.28-next.1
+ - @backstage/plugin-jenkins@0.7.11-next.1
+ - @backstage/plugin-kafka@0.3.12-next.1
+ - @backstage/plugin-kubernetes@0.7.5-next.1
+ - @backstage/plugin-lighthouse@0.3.12-next.1
+ - @backstage/plugin-newrelic@0.3.30-next.1
+ - @backstage/plugin-pagerduty@0.5.5-next.1
+ - @backstage/plugin-playlist@0.1.3-next.1
+ - @backstage/plugin-rollbar@0.4.12-next.1
+ - @backstage/plugin-search@1.0.5-next.1
+ - @backstage/plugin-sentry@0.4.5-next.1
+ - @backstage/plugin-tech-insights@0.3.4-next.1
+ - @backstage/plugin-tech-radar@0.5.19-next.1
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.7-next.1
+ - @backstage/plugin-todo@0.2.14-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/plugin-airbrake@0.3.12-next.1
+ - @backstage/plugin-newrelic-dashboard@0.2.5-next.1
+ - @backstage/plugin-techdocs-react@1.0.7-next.1
+ - @internal/plugin-catalog-customized@0.0.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## example-backend@0.2.78-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/plugin-kafka-backend@0.2.32-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/plugin-search-backend-node@1.0.5-next.1
+ - @backstage/plugin-jenkins-backend@0.1.29-next.1
+ - @backstage/plugin-scaffolder-backend@1.8.1-next.1
+ - @backstage/plugin-explore-backend@0.0.1-next.0
+ - @backstage/plugin-proxy-backend@0.2.33-next.1
+ - @backstage/plugin-app-backend@0.3.39-next.1
+ - @backstage/plugin-auth-backend@0.17.2-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/plugin-azure-devops-backend@0.3.18-next.1
+ - @backstage/plugin-azure-sites-backend@0.1.1-next.1
+ - @backstage/plugin-badges-backend@0.1.33-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/plugin-code-coverage-backend@0.2.5-next.1
+ - @backstage/plugin-events-backend@0.2.0-next.1
+ - @backstage/plugin-graphql-backend@0.1.29-next.1
+ - @backstage/plugin-kubernetes-backend@0.8.1-next.1
+ - @backstage/plugin-permission-backend@0.5.14-next.1
+ - @backstage/plugin-permission-node@0.7.2-next.1
+ - @backstage/plugin-playlist-backend@0.2.2-next.1
+ - @backstage/plugin-rollbar-backend@0.1.36-next.1
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.1
+ - @backstage/plugin-search-backend@1.1.2-next.1
+ - @backstage/plugin-search-backend-module-elasticsearch@1.0.5-next.1
+ - @backstage/plugin-search-backend-module-pg@0.4.3-next.1
+ - @backstage/plugin-tech-insights-backend@0.5.5-next.1
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.1
+ - @backstage/plugin-tech-insights-node@0.3.7-next.1
+ - @backstage/plugin-techdocs-backend@1.4.2-next.1
+ - @backstage/plugin-todo-backend@0.1.36-next.1
+ - example-app@0.2.78-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
+## example-backend-next@0.0.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/plugin-scaffolder-backend@1.8.1-next.1
+ - @backstage/plugin-app-backend@0.3.39-next.1
+ - @backstage/backend-defaults@0.1.4-next.1
+
+## techdocs-cli-embedded-app@0.2.77-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-catalog@1.6.2-next.1
+ - @backstage/plugin-techdocs@1.4.1-next.1
+ - @backstage/test-utils@1.2.3-next.1
+ - @backstage/cli@0.21.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/app-defaults@1.0.9-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/plugin-techdocs-react@1.0.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
+## @internal/plugin-catalog-customized@0.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.6.2-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+
+## @internal/plugin-todo-list@1.0.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
+## @internal/plugin-todo-list-backend@1.0.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
+## @internal/plugin-todo-list-common@1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.7.2-next.1
diff --git a/docs/tutorials/configuring-plugin-databases.md b/docs/tutorials/configuring-plugin-databases.md
index 8cb78bff60..ed550f1801 100644
--- a/docs/tutorials/configuring-plugin-databases.md
+++ b/docs/tutorials/configuring-plugin-databases.md
@@ -21,8 +21,8 @@ instance or cluster.
With infrastructure defined as code or data (Terraform, AWS CloudFormation,
etc.), you may have database credentials which lack permissions to create new
databases or you do not have control over the database names. In these
-instances, you can set the database name and connection information on a per
-plugin basis as mentioned earlier.
+instances, you can set the database connection configuration on a [per plugin basis]
+(#connection-configuration-per-plugin).
Backstage supports all of these use cases with the `DatabaseManager` provided by
`@backstage/backend-common`. We will now cover how to use and configure
diff --git a/microsite/blog/2022-03-04-backstage-upgrade-helper.md b/microsite/blog/2022-03-04-backstage-upgrade-helper.md
index a189e28cd5..80b3b9c0a8 100644
--- a/microsite/blog/2022-03-04-backstage-upgrade-helper.md
+++ b/microsite/blog/2022-03-04-backstage-upgrade-helper.md
@@ -29,7 +29,7 @@ We started by creating a fork from React Native’s open source project, applyin
The Backstage Upgrade Helper tool enables adopters to easily upgrade their Backstage app by using the power of git to create a diff between different versions.
-Whenever a new version of Backstage is released, the Helper scaffolds a new dummy Backstage app using the `backstage-create-app` cli utility and checks all the generated files in a specific git branch. After the branch is generated, it gets compared with all the existing ones, which results in generating specific git patches stored in specific files. By selecting the version of the current Backstage release together with the version you want to upgrade to, the UI knows which patch file needs to be picked up.
+Whenever a new version of Backstage is released, the Helper scaffolds a new sample Backstage app using the `backstage-create-app` cli utility and checks all the generated files in a specific git branch. After the branch is generated, it gets compared with all the existing ones, which results in generating specific git patches stored in specific files. By selecting the version of the current Backstage release together with the version you want to upgrade to, the UI knows which patch file needs to be picked up.
So, now you can update your Backstage application in three steps rather than manually reading the changelogs of all the Backstage modules in reverse order.
diff --git a/microsite/data/plugins/azure-spring-apps.yml b/microsite/data/plugins/azure-spring-apps.yml
index cefb0e2824..5b41885ac4 100644
--- a/microsite/data/plugins/azure-spring-apps.yml
+++ b/microsite/data/plugins/azure-spring-apps.yml
@@ -5,6 +5,6 @@ authorUrl: https://enfuse.io/
category: Discovery
description: Easily view your Azure Spring Apps service resources
documentation: https://github.com/enfuse/asae-backstage-plugin/blob/main/README.md
-iconUrl: img/azure-spring-apps.png
+iconUrl: img/enfuse.png
npmPackageName: '@enfuse/plugin-azure-spring-apps'
addedDate: '2022-11-21'
diff --git a/package.json b/package.json
index 2d2d5f335b..524cdf4bbe 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
"lint": "backstage-cli repo lint --since origin/master",
"lint:docs": "node ./scripts/check-docs-quality",
"lint:all": "backstage-cli repo lint",
- "lint:type-deps": "node scripts/check-type-dependencies.js",
+ "lint:type-deps": "backstage-repo-tools type-deps",
"docker-build": "yarn tsc && yarn workspace example-backend build --build-dependencies && yarn workspace example-backend build-image",
"new": "backstage-cli new --scope backstage --baseVersion 0.0.0 --no-private",
"create-plugin": "echo \"use 'yarn new' instead\"",
@@ -46,7 +46,7 @@
"@types/react": "^17",
"@types/react-dom": "^17"
},
- "version": "1.9.0-next.0",
+ "version": "1.9.0-next.1",
"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 ab34404847..7485f130e3 100644
--- a/packages/app-defaults/CHANGELOG.md
+++ b/packages/app-defaults/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/app-defaults
+## 1.0.9-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/theme@0.2.16
+
## 1.0.9-next.0
### Patch Changes
diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json
index 10cbea0824..e7acda4732 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.0.9-next.0",
+ "version": "1.0.9-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index 2d7cce1b6d..813a669173 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -1,5 +1,68 @@
# example-app
+## 0.2.78-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-cloudbuild@0.3.12-next.1
+ - @backstage/plugin-gcp-projects@0.3.31-next.1
+ - @backstage/plugin-github-actions@0.5.12-next.1
+ - @backstage/plugin-graphiql@0.2.44-next.1
+ - @backstage/plugin-techdocs@1.4.1-next.1
+ - @backstage/plugin-cost-insights@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/plugin-stack-overflow@0.1.8-next.1
+ - @backstage/cli@0.21.2-next.1
+ - @backstage/plugin-org@0.6.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/plugin-scaffolder@1.9.0-next.1
+ - @backstage/plugin-shortcuts@0.3.4-next.1
+ - @backstage/plugin-user-settings@0.6.0-next.1
+ - @backstage/plugin-explore@0.3.43-next.1
+ - @backstage/app-defaults@1.0.9-next.1
+ - @backstage/plugin-apache-airflow@0.2.5-next.1
+ - @backstage/plugin-api-docs@0.8.12-next.1
+ - @backstage/plugin-azure-devops@0.2.3-next.1
+ - @backstage/plugin-azure-sites@0.1.1-next.1
+ - @backstage/plugin-badges@0.2.36-next.1
+ - @backstage/plugin-catalog-graph@0.2.24-next.1
+ - @backstage/plugin-catalog-import@0.9.2-next.1
+ - @backstage/plugin-circleci@0.3.12-next.1
+ - @backstage/plugin-code-coverage@0.2.5-next.1
+ - @backstage/plugin-dynatrace@1.0.2-next.1
+ - @backstage/plugin-gcalendar@0.3.8-next.1
+ - @backstage/plugin-gocd@0.1.18-next.1
+ - @backstage/plugin-home@0.4.28-next.1
+ - @backstage/plugin-jenkins@0.7.11-next.1
+ - @backstage/plugin-kafka@0.3.12-next.1
+ - @backstage/plugin-kubernetes@0.7.5-next.1
+ - @backstage/plugin-lighthouse@0.3.12-next.1
+ - @backstage/plugin-newrelic@0.3.30-next.1
+ - @backstage/plugin-pagerduty@0.5.5-next.1
+ - @backstage/plugin-playlist@0.1.3-next.1
+ - @backstage/plugin-rollbar@0.4.12-next.1
+ - @backstage/plugin-search@1.0.5-next.1
+ - @backstage/plugin-sentry@0.4.5-next.1
+ - @backstage/plugin-tech-insights@0.3.4-next.1
+ - @backstage/plugin-tech-radar@0.5.19-next.1
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.7-next.1
+ - @backstage/plugin-todo@0.2.14-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/plugin-airbrake@0.3.12-next.1
+ - @backstage/plugin-newrelic-dashboard@0.2.5-next.1
+ - @backstage/plugin-techdocs-react@1.0.7-next.1
+ - @internal/plugin-catalog-customized@0.0.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 0.2.78-next.0
### Patch Changes
diff --git a/packages/app/package.json b/packages/app/package.json
index 171151f843..3f15471993 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,6 +1,6 @@
{
"name": "example-app",
- "version": "0.2.78-next.0",
+ "version": "0.2.78-next.1",
"private": true,
"backstage": {
"role": "frontend"
@@ -80,7 +80,7 @@
"react-router": "^6.3.0",
"react-router-dom": "^6.3.0",
"react-use": "^17.2.4",
- "zen-observable": "^0.9.0"
+ "zen-observable": "^0.10.0"
},
"devDependencies": {
"@backstage/test-utils": "workspace:^",
diff --git a/packages/app/src/components/search/SearchModal.tsx b/packages/app/src/components/search/SearchModal.tsx
index 218ead9b82..2aed970e75 100644
--- a/packages/app/src/components/search/SearchModal.tsx
+++ b/packages/app/src/components/search/SearchModal.tsx
@@ -25,6 +25,7 @@ import {
Paper,
useTheme,
} from '@material-ui/core';
+import BuildIcon from '@material-ui/icons/Build';
import LaunchIcon from '@material-ui/icons/Launch';
import {
CatalogIcon,
@@ -38,6 +39,7 @@ import {
catalogApiRef,
CATALOG_FILTER_EXISTS,
} from '@backstage/plugin-catalog-react';
+import { ToolSearchResultListItem } from '@backstage/plugin-explore';
import { searchPlugin, SearchType } from '@backstage/plugin-search';
import {
DefaultResultListItem,
@@ -110,6 +112,10 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => {
value: 'techdocs',
name: 'Documentation',
},
+ {
+ value: 'tools',
+ name: 'Tools',
+ },
]}
/>
@@ -209,6 +215,17 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => {
/>
);
break;
+ case 'tools':
+ resultItem = (
+ }
+ key={document.location}
+ result={document}
+ highlight={highlight}
+ rank={rank}
+ />
+ );
+ break;
default:
resultItem = (
({
bar: {
@@ -155,6 +157,16 @@ const SearchPage = () => {
rank={rank}
/>
);
+ case 'tools':
+ return (
+ }
+ key={document.location}
+ result={document}
+ highlight={highlight}
+ rank={rank}
+ />
+ );
default:
return (
///
-import { AbortController as AbortController_2 } from 'node-abort-controller';
-import { AbortSignal as AbortSignal_2 } from 'node-abort-controller';
import aws from 'aws-sdk';
import { AwsS3Integration } from '@backstage/integration';
import { AzureIntegration } from '@backstage/integration';
@@ -28,6 +26,7 @@ import { GitLabIntegration } from '@backstage/integration';
import { isChildPath } from '@backstage/cli-common';
import { JsonValue } from '@backstage/types';
import { Knex } from 'knex';
+import { KubeConfig } from '@kubernetes/client-node';
import { LoadConfigOptionsRemote } from '@backstage/config-loader';
import { Logger } from 'winston';
import { MergeResult } from 'isomorphic-git';
@@ -37,6 +36,7 @@ import { ReadCommitResult } from 'isomorphic-git';
import { RequestHandler } from 'express';
import { Router } from 'express';
import { Server } from 'http';
+import { V1PodTemplateSpec } from '@kubernetes/client-node';
import * as winston from 'winston';
import { Writable } from 'stream';
@@ -198,7 +198,7 @@ export interface ContainerRunner {
// @alpha
export interface Context {
- readonly abortSignal: AbortSignal_2;
+ readonly abortSignal: AbortSignal;
readonly deadline: Date | undefined;
value(key: string): T | undefined;
}
@@ -208,7 +208,7 @@ export class Contexts {
static root(): Context;
static withAbort(
parentCtx: Context,
- source: AbortController_2 | AbortSignal_2,
+ source: AbortController | AbortSignal,
): Context;
static withTimeoutDuration(parentCtx: Context, timeout: Duration): Context;
static withTimeoutMillis(parentCtx: Context, timeout: number): Context;
@@ -474,6 +474,29 @@ export { isChildPath };
// @public
export function isDatabaseConflictError(e: unknown): boolean;
+// @public
+export class KubernetesContainerRunner implements ContainerRunner {
+ constructor(options: KubernetesContainerRunnerOptions);
+ // (undocumented)
+ runContainer(options: RunContainerOptions): Promise;
+}
+
+// @public
+export type KubernetesContainerRunnerMountBase = {
+ volumeName: string;
+ basePath: string;
+};
+
+// @public
+export type KubernetesContainerRunnerOptions = {
+ kubeConfig: KubeConfig;
+ name: string;
+ namespace?: string;
+ mountBase?: KubernetesContainerRunnerMountBase;
+ podTemplate?: V1PodTemplateSpec;
+ timeoutMs?: number;
+};
+
// @public
export function loadBackendConfig(options: {
logger: Logger;
@@ -519,7 +542,7 @@ export type ReadTreeOptions = {
},
): boolean;
etag?: string;
- signal?: AbortSignal_2;
+ signal?: AbortSignal;
};
// @public
@@ -573,7 +596,7 @@ export type ReadTreeResponseFile = {
// @public
export type ReadUrlOptions = {
etag?: string;
- signal?: AbortSignal_2;
+ signal?: AbortSignal;
};
// @public
@@ -632,7 +655,7 @@ export type RunContainerOptions = {
// @public
export type SearchOptions = {
etag?: string;
- signal?: AbortSignal_2;
+ signal?: AbortSignal;
};
// @public
diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json
index 9fadc0aeb7..eb9ab49521 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.16.1-next.0",
+ "version": "0.17.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
@@ -73,7 +73,6 @@
"minimatch": "^5.0.0",
"minimist": "^1.2.5",
"morgan": "^1.10.0",
- "node-abort-controller": "^3.0.1",
"node-fetch": "^2.6.7",
"node-forge": "^1.3.1",
"raw-body": "^2.4.1",
diff --git a/packages/backend-common/src/cache/CacheManager.ts b/packages/backend-common/src/cache/CacheManager.ts
index 9bf5000fc6..8fa4b92b42 100644
--- a/packages/backend-common/src/cache/CacheManager.ts
+++ b/packages/backend-common/src/cache/CacheManager.ts
@@ -102,7 +102,7 @@ export class CacheManager {
getClient: (opts = {}): CacheClient => {
const concreteClient = this.getClientWithTtl(pluginId, opts.defaultTtl);
- // Always provide an error handler to avoid killing the process.
+ // Always provide an error handler to avoid stopping the process.
concreteClient.on('error', (err: Error) => {
// In all cases, just log the error.
this.logger.error(err);
diff --git a/packages/backend-common/src/context/AbortContext.test.ts b/packages/backend-common/src/context/AbortContext.test.ts
index f69e282d28..a6c522ffcf 100644
--- a/packages/backend-common/src/context/AbortContext.test.ts
+++ b/packages/backend-common/src/context/AbortContext.test.ts
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-import { AbortController } from 'node-abort-controller';
import { AbortContext } from './AbortContext';
import { RootContext } from './RootContext';
diff --git a/packages/backend-common/src/context/AbortContext.ts b/packages/backend-common/src/context/AbortContext.ts
index 8a119358a6..92735fbcc6 100644
--- a/packages/backend-common/src/context/AbortContext.ts
+++ b/packages/backend-common/src/context/AbortContext.ts
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-import { AbortController, AbortSignal } from 'node-abort-controller';
import { Context } from './types';
/**
diff --git a/packages/backend-common/src/context/Contexts.test.ts b/packages/backend-common/src/context/Contexts.test.ts
index cbd61d20a9..c895b3bb49 100644
--- a/packages/backend-common/src/context/Contexts.test.ts
+++ b/packages/backend-common/src/context/Contexts.test.ts
@@ -15,7 +15,6 @@
*/
import { Duration } from 'luxon';
-import { AbortController } from 'node-abort-controller';
import { Contexts } from './Contexts';
describe('Contexts', () => {
diff --git a/packages/backend-common/src/context/Contexts.ts b/packages/backend-common/src/context/Contexts.ts
index e22a76f673..4eeb56b029 100644
--- a/packages/backend-common/src/context/Contexts.ts
+++ b/packages/backend-common/src/context/Contexts.ts
@@ -15,7 +15,6 @@
*/
import { Duration } from 'luxon';
-import { AbortController, AbortSignal } from 'node-abort-controller';
import { AbortContext } from './AbortContext';
import { RootContext } from './RootContext';
import { Context } from './types';
diff --git a/packages/backend-common/src/context/RootContext.ts b/packages/backend-common/src/context/RootContext.ts
index 61962380a4..fd3690a945 100644
--- a/packages/backend-common/src/context/RootContext.ts
+++ b/packages/backend-common/src/context/RootContext.ts
@@ -14,31 +14,36 @@
* limitations under the License.
*/
-import { AbortSignal } from 'node-abort-controller';
import { Context } from './types';
/**
- * Since the root context can never abort, and since nobody is every meant to
- * dispatch events through it, we can use a static dummy instance for
- * efficiency.
+ * Since the root context can never abort, and since nobody is ever meant to
+ * dispatch events through it, we can use a static fake instance for efficiency.
+ *
+ * The reason that this was initially made for the root context is that due to
+ * the way that we always chain contexts off of it, sometimes a huge number of
+ * listeners want to add themselves to something that effectively never can be
+ * aborted in the first place. This triggered warnings that the max listeners
+ * limit was exceeded.
*/
-const dummyAbortSignal: AbortSignal = Object.freeze({
- aborted: false,
- addEventListener() {},
- removeEventListener() {},
+class FakeAbortSignal implements AbortSignal {
+ readonly aborted = false;
+ readonly reason = undefined;
+ onabort() {}
+ throwIfAborted() {}
+ addEventListener() {}
+ removeEventListener() {}
dispatchEvent() {
return true;
- },
- onabort: null,
-});
+ }
+}
/**
* An empty root context.
*/
export class RootContext implements Context {
- readonly abortSignal = dummyAbortSignal;
+ readonly abortSignal = new FakeAbortSignal();
readonly deadline = undefined;
-
value(_key: string): T | undefined {
return undefined;
}
diff --git a/packages/backend-common/src/context/ValueContext.ts b/packages/backend-common/src/context/ValueContext.ts
index 441aaec984..c8e4426d05 100644
--- a/packages/backend-common/src/context/ValueContext.ts
+++ b/packages/backend-common/src/context/ValueContext.ts
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-import { AbortSignal } from 'node-abort-controller';
import { Context } from './types';
/**
diff --git a/packages/backend-common/src/context/types.ts b/packages/backend-common/src/context/types.ts
index 664745bbf6..3b53225163 100644
--- a/packages/backend-common/src/context/types.ts
+++ b/packages/backend-common/src/context/types.ts
@@ -14,8 +14,6 @@
* limitations under the License.
*/
-import { AbortSignal } from 'node-abort-controller';
-
/**
* A context that is meant to be passed as a ctx variable down the call chain,
* to pass along scoped information and abort signals.
diff --git a/packages/backend-common/src/discovery/SingleHostDiscovery.test.ts b/packages/backend-common/src/discovery/SingleHostDiscovery.test.ts
new file mode 100644
index 0000000000..ce4a5ae261
--- /dev/null
+++ b/packages/backend-common/src/discovery/SingleHostDiscovery.test.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2020 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { ConfigReader } from '@backstage/config';
+import { SingleHostDiscovery } from './SingleHostDiscovery';
+
+describe('SingleHostDiscovery', () => {
+ it('is created from config', async () => {
+ const discovery = SingleHostDiscovery.fromConfig(
+ new ConfigReader({
+ backend: {
+ baseUrl: 'http://localhost:40',
+ listen: { port: 80, host: 'localhost' },
+ },
+ }),
+ );
+
+ await expect(discovery.getBaseUrl('catalog')).resolves.toBe(
+ 'http://localhost:80/api/catalog',
+ );
+ await expect(discovery.getExternalBaseUrl('catalog')).resolves.toBe(
+ 'http://localhost:40/api/catalog',
+ );
+ });
+
+ it('can configure the base path', async () => {
+ const discovery = SingleHostDiscovery.fromConfig(
+ new ConfigReader({
+ backend: {
+ baseUrl: 'http://localhost:40',
+ listen: { port: 80, host: 'localhost' },
+ },
+ }),
+ { basePath: '/service' },
+ );
+
+ await expect(discovery.getBaseUrl('catalog')).resolves.toBe(
+ 'http://localhost:80/service/catalog',
+ );
+ await expect(discovery.getExternalBaseUrl('catalog')).resolves.toBe(
+ 'http://localhost:40/service/catalog',
+ );
+ });
+
+ it.each([
+ [{ listen: ':80' }, 'http://localhost:80'],
+ [{ listen: ':40', https: true }, 'https://localhost:40'],
+ [{ listen: '127.0.0.1:80' }, 'http://127.0.0.1:80'],
+ [{ listen: '127.0.0.1:80', https: true }, 'https://127.0.0.1:80'],
+ [{ listen: '0.0.0.0:40' }, 'http://127.0.0.1:40'],
+ [{ listen: { port: 80 } }, 'http://localhost:80'],
+ [{ listen: { port: 8000 } }, 'http://localhost:8000'],
+ [{ listen: { port: 80, host: '0.0.0.0' } }, 'http://127.0.0.1:80'],
+ [{ listen: { port: 80, host: '::' } }, 'http://localhost:80'],
+ [{ listen: { port: 80, host: '::1' } }, 'http://[::1]:80'],
+ [{ listen: { port: 90, host: '::2' }, https: true }, 'https://[::2]:90'],
+ ])('resolves internal baseUrl for %j as %s', async (config, expected) => {
+ const discovery = SingleHostDiscovery.fromConfig(
+ new ConfigReader({
+ backend: {
+ baseUrl: 'http://localhost:40',
+ ...config,
+ },
+ }),
+ );
+
+ await expect(discovery.getBaseUrl('catalog')).resolves.toBe(
+ `${expected}/api/catalog`,
+ );
+ });
+});
diff --git a/packages/backend-common/src/discovery/SingleHostDiscovery.ts b/packages/backend-common/src/discovery/SingleHostDiscovery.ts
index 2f1e44b293..cc23a2f744 100644
--- a/packages/backend-common/src/discovery/SingleHostDiscovery.ts
+++ b/packages/backend-common/src/discovery/SingleHostDiscovery.ts
@@ -50,7 +50,7 @@ export class SingleHostDiscovery implements PluginEndpointDiscovery {
// Translate bind-all to localhost, and support IPv6
let host = listenHost;
- if (host === '::') {
+ if (host === '::' || host === '') {
// We use localhost instead of ::1, since IPv6-compatible systems should default
// to using IPv6 when they see localhost, but if the system doesn't support IPv6
// things will still work.
diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
index 4a2be1fc74..dd4cd23de4 100644
--- a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
+++ b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
@@ -133,7 +133,7 @@ describe('AwsS3UrlReader', () => {
});
};
- it('creates a dummy reader without the awsS3 field', () => {
+ it('creates a sample reader without the awsS3 field', () => {
const entries = createReader({
integrations: {},
});
diff --git a/packages/backend-common/src/reading/types.ts b/packages/backend-common/src/reading/types.ts
index 2ebf38c08a..bce737f3c7 100644
--- a/packages/backend-common/src/reading/types.ts
+++ b/packages/backend-common/src/reading/types.ts
@@ -17,7 +17,6 @@
import { Readable } from 'stream';
import { Logger } from 'winston';
import { Config } from '@backstage/config';
-import { AbortSignal } from 'node-abort-controller';
/**
* A generic interface for fetching plain data from URLs.
diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts
index 970dcfb83d..c7468eeb1a 100644
--- a/packages/backend-common/src/tokens/ServerTokenManager.ts
+++ b/packages/backend-common/src/tokens/ServerTokenManager.ts
@@ -27,7 +27,7 @@ const TOKEN_EXPIRY_AFTER = Duration.fromObject({ hours: 1 });
const TOKEN_REISSUE_AFTER = Duration.fromObject({ minutes: 10 });
/**
- * A token manager that issues static dummy tokens and never fails
+ * A token manager that issues static fake tokens and never fails
* authentication. This can be useful for testing.
*/
class NoopTokenManager implements TokenManager {
@@ -66,7 +66,7 @@ export class ServerTokenManager implements TokenManager {
private currentTokenPromise: Promise<{ token: string }> | undefined;
/**
- * Creates a token manager that issues static dummy tokens and never fails
+ * Creates a token manager that issues static fake tokens and never fails
* authentication. This can be useful for testing.
*/
static noop(): TokenManager {
diff --git a/packages/backend-common/src/util/KubernetesContainerRunner.ts b/packages/backend-common/src/util/KubernetesContainerRunner.ts
index af00351fd1..f3590a0bdc 100644
--- a/packages/backend-common/src/util/KubernetesContainerRunner.ts
+++ b/packages/backend-common/src/util/KubernetesContainerRunner.ts
@@ -39,7 +39,7 @@ import { Request } from 'request';
*
* @public
*/
-export type MountBaseOptions = {
+export type KubernetesContainerRunnerMountBase = {
volumeName: string;
basePath: string;
};
@@ -51,7 +51,7 @@ export type MountBaseOptions = {
* and their names will be prefixed with the provided 'name'.
*
* 'podTemplate' defines a Pod template for the Jobs. It has to include
- * a volume definition named as the {@link MountBaseOptions} 'volumeName'.
+ * a volume definition named as the {@link KubernetesContainerRunnerMountBase} 'volumeName'.
*
* @public
*/
@@ -59,7 +59,7 @@ export type KubernetesContainerRunnerOptions = {
kubeConfig: KubeConfig;
name: string;
namespace?: string;
- mountBase?: MountBaseOptions;
+ mountBase?: KubernetesContainerRunnerMountBase;
podTemplate?: V1PodTemplateSpec;
timeoutMs?: number;
};
@@ -77,12 +77,12 @@ export class KubernetesContainerRunner implements ContainerRunner {
private readonly log: Log;
private readonly name: string;
private readonly namespace: string;
- private readonly mountBase?: MountBaseOptions;
+ private readonly mountBase?: KubernetesContainerRunnerMountBase;
private readonly podTemplate?: V1PodTemplateSpec;
private readonly timeoutMs: number;
private readonly containerName = 'executor';
- getNamespace(kubeConfig: KubeConfig, namespace?: string): string {
+ private getNamespace(kubeConfig: KubeConfig, namespace?: string): string {
let _namespace = namespace;
if (!_namespace) {
_namespace = kubeConfig.getContextObject(
@@ -95,10 +95,10 @@ export class KubernetesContainerRunner implements ContainerRunner {
return _namespace;
}
- validateMountBase(
- mountBase: MountBaseOptions,
+ private validateMountBase(
+ mountBase: KubernetesContainerRunnerMountBase,
podTemplate?: V1PodTemplateSpec,
- ): MountBaseOptions {
+ ): KubernetesContainerRunnerMountBase {
if (
!podTemplate?.spec?.volumes?.filter(v => v.name === mountBase.volumeName)
.length
@@ -213,7 +213,7 @@ export class KubernetesContainerRunner implements ContainerRunner {
await this.runJob(jobSpec, taskId, logStream);
}
- handleError(err: any, errorCallback: (reason: any) => void) {
+ private handleError(err: any, errorCallback: (reason: any) => void) {
if (err.code !== 'ECONNRESET' && err.message !== 'aborted') {
errorCallback(
handleKubernetesError(
@@ -224,7 +224,7 @@ export class KubernetesContainerRunner implements ContainerRunner {
}
}
- watchPod(
+ private watchPod(
taskId: string,
callback: (pod: V1Pod) => void,
errorCallback: (reason: any) => void,
@@ -247,7 +247,7 @@ export class KubernetesContainerRunner implements ContainerRunner {
);
}
- tailLogs(
+ private tailLogs(
taskId: string,
logStream: Writable,
): { promise: Promise; close: () => Promise } {
@@ -295,7 +295,7 @@ export class KubernetesContainerRunner implements ContainerRunner {
return { promise: Promise.race([watchPromise, logPromise]), close };
}
- waitPod(taskId: string): {
+ private waitPod(taskId: string): {
promise: Promise;
close: () => Promise;
} {
@@ -322,7 +322,7 @@ export class KubernetesContainerRunner implements ContainerRunner {
return { promise, close };
}
- async createJob(jobSpec: V1Job): Promise {
+ private async createJob(jobSpec: V1Job): Promise {
return this.batchV1Api
.createNamespacedJob(this.namespace, jobSpec)
.catch(err => {
@@ -333,7 +333,7 @@ export class KubernetesContainerRunner implements ContainerRunner {
});
}
- async runJob(
+ private async runJob(
jobSpec: V1Job,
taskId: string,
logStream: Writable,
diff --git a/packages/backend-common/src/util/index.ts b/packages/backend-common/src/util/index.ts
index ba8074a11e..3e7b762519 100644
--- a/packages/backend-common/src/util/index.ts
+++ b/packages/backend-common/src/util/index.ts
@@ -16,3 +16,8 @@
export type { ContainerRunner, RunContainerOptions } from './ContainerRunner';
export { DockerContainerRunner } from './DockerContainerRunner';
+export type {
+ KubernetesContainerRunnerOptions,
+ KubernetesContainerRunnerMountBase,
+} from './KubernetesContainerRunner';
+export { KubernetesContainerRunner } from './KubernetesContainerRunner';
diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md
index 270e946880..f8dfe0a4d7 100644
--- a/packages/backend-defaults/CHANGELOG.md
+++ b/packages/backend-defaults/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/backend-defaults
+## 0.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-app-api@0.2.4-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+
## 0.1.4-next.0
### Patch Changes
diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json
index 74d0b726e5..39b3df0a7b 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.4-next.0",
+ "version": "0.1.4-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md
index e8957375cd..41299d9b5f 100644
--- a/packages/backend-next/CHANGELOG.md
+++ b/packages/backend-next/CHANGELOG.md
@@ -1,5 +1,15 @@
# example-backend-next
+## 0.0.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/plugin-scaffolder-backend@1.8.1-next.1
+ - @backstage/plugin-app-backend@0.3.39-next.1
+ - @backstage/backend-defaults@0.1.4-next.1
+
## 0.0.6-next.0
### Patch Changes
diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json
index b8b26d6e61..2474413dc2 100644
--- a/packages/backend-next/package.json
+++ b/packages/backend-next/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend-next",
- "version": "0.0.6-next.0",
+ "version": "0.0.6-next.1",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md
index b33b7ec9a4..8837f56cc7 100644
--- a/packages/backend-plugin-api/CHANGELOG.md
+++ b/packages/backend-plugin-api/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/backend-plugin-api
+## 0.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
## 0.1.5-next.0
### Patch Changes
diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json
index 2e9c0aa6ec..bd7ebb7bf1 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.1.5-next.0",
+ "version": "0.1.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md
index 3276c0d453..e3381d2f02 100644
--- a/packages/backend-tasks/CHANGELOG.md
+++ b/packages/backend-tasks/CHANGELOG.md
@@ -1,5 +1,27 @@
# @backstage/backend-tasks
+## 0.4.0-next.1
+
+### Minor Changes
+
+- de8a975911: Changed to use native `AbortController` and `AbortSignal` from Node.js, instead
+ of the one from `node-abort-controller`. This is possible now that the minimum
+ supported Node.js version of the project is 16.
+
+ Note that their interfaces are very slightly different, but typically not in a
+ way that matters to consumers. If you see any typescript errors as a direct
+ result from this, they are compatible with each other in the ways that we
+ interact with them, and should be possible to type-cast across without ill
+ effects.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.3.8-next.0
### Patch Changes
diff --git a/packages/backend-tasks/api-report.md b/packages/backend-tasks/api-report.md
index 8f53d1e5ae..f7b4782263 100644
--- a/packages/backend-tasks/api-report.md
+++ b/packages/backend-tasks/api-report.md
@@ -3,7 +3,6 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
-import { AbortSignal as AbortSignal_2 } from 'node-abort-controller';
import { Config } from '@backstage/config';
import { DatabaseManager } from '@backstage/backend-common';
import { Duration } from 'luxon';
@@ -29,14 +28,14 @@ export function readTaskScheduleDefinitionFromConfig(
// @public
export type TaskFunction =
- | ((abortSignal: AbortSignal_2) => void | Promise)
+ | ((abortSignal: AbortSignal) => void | Promise)
| (() => void | Promise);
// @public
export interface TaskInvocationDefinition {
fn: TaskFunction;
id: string;
- signal?: AbortSignal_2;
+ signal?: AbortSignal;
}
// @public
diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json
index 1e209a4d10..fd8a9fe8cc 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.3.8-next.0",
+ "version": "0.4.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
@@ -41,7 +41,6 @@
"knex": "^2.0.0",
"lodash": "^4.17.21",
"luxon": "^3.0.0",
- "node-abort-controller": "^3.0.1",
"uuid": "^8.0.0",
"winston": "^3.2.1",
"zod": "^3.9.5"
diff --git a/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts b/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts
index b81f7ab1c2..c46743ae59 100644
--- a/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts
+++ b/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts
@@ -15,7 +15,6 @@
*/
import { getVoidLogger } from '@backstage/backend-common';
-import { AbortController } from 'node-abort-controller';
import { LocalTaskWorker } from './LocalTaskWorker';
describe('LocalTaskWorker', () => {
diff --git a/packages/backend-tasks/src/tasks/LocalTaskWorker.ts b/packages/backend-tasks/src/tasks/LocalTaskWorker.ts
index be30988aa8..0edec5e84e 100644
--- a/packages/backend-tasks/src/tasks/LocalTaskWorker.ts
+++ b/packages/backend-tasks/src/tasks/LocalTaskWorker.ts
@@ -17,7 +17,6 @@
import { ConflictError } from '@backstage/errors';
import { CronTime } from 'cron';
import { DateTime, Duration } from 'luxon';
-import { AbortController, AbortSignal } from 'node-abort-controller';
import { Logger } from 'winston';
import { TaskFunction, TaskSettingsV2 } from './types';
import { delegateAbortController, sleep } from './util';
diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts
index d61948a929..1847370d2b 100644
--- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts
+++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts
@@ -18,7 +18,6 @@ import { getVoidLogger } from '@backstage/backend-common';
import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils';
import { ConflictError, NotFoundError } from '@backstage/errors';
import { Duration } from 'luxon';
-import { AbortSignal } from 'node-abort-controller';
import { migrateBackendTasks } from '../database/migrateBackendTasks';
import {
parseDuration,
diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts
index bedf03d08a..81b0345c2c 100644
--- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts
+++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts
@@ -16,7 +16,6 @@
import { Knex } from 'knex';
import { Duration } from 'luxon';
-import { AbortSignal } from 'node-abort-controller';
import { Logger } from 'winston';
import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables';
import { sleep } from './util';
diff --git a/packages/backend-tasks/src/tasks/TaskWorker.test.ts b/packages/backend-tasks/src/tasks/TaskWorker.test.ts
index e631dcce54..28dbcc4337 100644
--- a/packages/backend-tasks/src/tasks/TaskWorker.test.ts
+++ b/packages/backend-tasks/src/tasks/TaskWorker.test.ts
@@ -17,7 +17,6 @@
import { getVoidLogger } from '@backstage/backend-common';
import { TestDatabases } from '@backstage/backend-test-utils';
import { Duration } from 'luxon';
-import { AbortController } from 'node-abort-controller';
import waitForExpect from 'wait-for-expect';
import { migrateBackendTasks } from '../database/migrateBackendTasks';
import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables';
diff --git a/packages/backend-tasks/src/tasks/TaskWorker.ts b/packages/backend-tasks/src/tasks/TaskWorker.ts
index f56c03c3d5..483fb1a02d 100644
--- a/packages/backend-tasks/src/tasks/TaskWorker.ts
+++ b/packages/backend-tasks/src/tasks/TaskWorker.ts
@@ -18,7 +18,6 @@ import { ConflictError, NotFoundError } from '@backstage/errors';
import { CronTime } from 'cron';
import { Knex } from 'knex';
import { DateTime, Duration } from 'luxon';
-import { AbortSignal } from 'node-abort-controller';
import { v4 as uuid } from 'uuid';
import { Logger } from 'winston';
import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables';
diff --git a/packages/backend-tasks/src/tasks/types.ts b/packages/backend-tasks/src/tasks/types.ts
index dbf2595e1d..6ec5165aec 100644
--- a/packages/backend-tasks/src/tasks/types.ts
+++ b/packages/backend-tasks/src/tasks/types.ts
@@ -17,7 +17,6 @@
import { HumanDuration } from '@backstage/types';
import { CronTime } from 'cron';
import { Duration } from 'luxon';
-import { AbortSignal } from 'node-abort-controller';
import { z } from 'zod';
/**
diff --git a/packages/backend-tasks/src/tasks/util.test.ts b/packages/backend-tasks/src/tasks/util.test.ts
index ceeeba14d6..e2536abb88 100644
--- a/packages/backend-tasks/src/tasks/util.test.ts
+++ b/packages/backend-tasks/src/tasks/util.test.ts
@@ -16,12 +16,11 @@
import knexFactory, { Knex } from 'knex';
import { Duration } from 'luxon';
-import { AbortController } from 'node-abort-controller';
import { delegateAbortController, nowPlus, sleep, validateId } from './util';
class KnexBuilder {
public build(client: string): Knex {
- return knexFactory({ client });
+ return knexFactory({ client, useNullAsDefault: true });
}
}
diff --git a/packages/backend-tasks/src/tasks/util.ts b/packages/backend-tasks/src/tasks/util.ts
index 2561203318..70d67a9fbe 100644
--- a/packages/backend-tasks/src/tasks/util.ts
+++ b/packages/backend-tasks/src/tasks/util.ts
@@ -17,7 +17,6 @@
import { InputError } from '@backstage/errors';
import { Knex } from 'knex';
import { DateTime, Duration } from 'luxon';
-import { AbortController, AbortSignal } from 'node-abort-controller';
// Keep the IDs compatible with e.g. Prometheus labels
export function validateId(id: string) {
diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md
index 77de87b476..47053ba391 100644
--- a/packages/backend-test-utils/CHANGELOG.md
+++ b/packages/backend-test-utils/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/backend-test-utils
+## 0.1.31-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/cli@0.21.2-next.1
+ - @backstage/backend-app-api@0.2.4-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+
## 0.1.31-next.0
### Patch Changes
diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json
index 6dde2fe3d4..063088776d 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.31-next.0",
+ "version": "0.1.31-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index d30c720c73..034d27c5cd 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,52 @@
# example-backend
+## 0.2.78-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/plugin-kafka-backend@0.2.32-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/plugin-search-backend-node@1.0.5-next.1
+ - @backstage/plugin-jenkins-backend@0.1.29-next.1
+ - @backstage/plugin-scaffolder-backend@1.8.1-next.1
+ - @backstage/plugin-explore-backend@0.0.1-next.0
+ - @backstage/plugin-proxy-backend@0.2.33-next.1
+ - @backstage/plugin-app-backend@0.3.39-next.1
+ - @backstage/plugin-auth-backend@0.17.2-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/plugin-azure-devops-backend@0.3.18-next.1
+ - @backstage/plugin-azure-sites-backend@0.1.1-next.1
+ - @backstage/plugin-badges-backend@0.1.33-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/plugin-code-coverage-backend@0.2.5-next.1
+ - @backstage/plugin-events-backend@0.2.0-next.1
+ - @backstage/plugin-graphql-backend@0.1.29-next.1
+ - @backstage/plugin-kubernetes-backend@0.8.1-next.1
+ - @backstage/plugin-permission-backend@0.5.14-next.1
+ - @backstage/plugin-permission-node@0.7.2-next.1
+ - @backstage/plugin-playlist-backend@0.2.2-next.1
+ - @backstage/plugin-rollbar-backend@0.1.36-next.1
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.1
+ - @backstage/plugin-search-backend@1.1.2-next.1
+ - @backstage/plugin-search-backend-module-elasticsearch@1.0.5-next.1
+ - @backstage/plugin-search-backend-module-pg@0.4.3-next.1
+ - @backstage/plugin-tech-insights-backend@0.5.5-next.1
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.1
+ - @backstage/plugin-tech-insights-node@0.3.7-next.1
+ - @backstage/plugin-techdocs-backend@1.4.2-next.1
+ - @backstage/plugin-todo-backend@0.1.36-next.1
+ - example-app@0.2.78-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 0.2.78-next.0
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index e7d2d5d7b7..6277a96e5c 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend",
- "version": "0.2.78-next.0",
+ "version": "0.2.78-next.1",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -43,6 +43,7 @@
"@backstage/plugin-code-coverage-backend": "workspace:^",
"@backstage/plugin-events-backend": "workspace:^",
"@backstage/plugin-events-node": "workspace:^",
+ "@backstage/plugin-explore-backend": "workspace:^",
"@backstage/plugin-graphql-backend": "workspace:^",
"@backstage/plugin-jenkins-backend": "workspace:^",
"@backstage/plugin-kafka-backend": "workspace:^",
diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts
index bacae07917..371ce40358 100644
--- a/packages/backend/src/index.ts
+++ b/packages/backend/src/index.ts
@@ -45,6 +45,7 @@ import catalog from './plugins/catalog';
import catalogEventBasedProviders from './plugins/catalogEventBasedProviders';
import codeCoverage from './plugins/codecoverage';
import events from './plugins/events';
+import explore from './plugins/explore';
import kubernetes from './plugins/kubernetes';
import kafka from './plugins/kafka';
import rollbar from './plugins/rollbar';
@@ -144,6 +145,7 @@ async function main() {
const permissionEnv = useHotMemoize(module, () => createEnv('permission'));
const playlistEnv = useHotMemoize(module, () => createEnv('playlist'));
const eventsEnv = useHotMemoize(module, () => createEnv('events'));
+ const exploreEnv = useHotMemoize(module, () => createEnv('explore'));
const eventBasedEntityProviders = await catalogEventBasedProviders(
catalogEnv,
@@ -172,6 +174,7 @@ async function main() {
apiRouter.use('/jenkins', await jenkins(jenkinsEnv));
apiRouter.use('/permission', await permission(permissionEnv));
apiRouter.use('/playlist', await playlist(playlistEnv));
+ apiRouter.use('/explore', await explore(exploreEnv));
apiRouter.use(notFoundHandler());
const service = createServiceBuilder(module)
diff --git a/packages/backend/src/plugins/explore.ts b/packages/backend/src/plugins/explore.ts
new file mode 100644
index 0000000000..131f9461fa
--- /dev/null
+++ b/packages/backend/src/plugins/explore.ts
@@ -0,0 +1,32 @@
+/*
+ * 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 {
+ createRouter,
+ exampleTools,
+ StaticExploreToolProvider,
+} from '@backstage/plugin-explore-backend';
+import { Router } from 'express';
+import { PluginEnvironment } from '../types';
+
+export default async function createPlugin(
+ env: PluginEnvironment,
+): Promise {
+ return await createRouter({
+ logger: env.logger,
+ toolProvider: StaticExploreToolProvider.fromData(exampleTools),
+ });
+}
diff --git a/packages/backend/src/plugins/search.ts b/packages/backend/src/plugins/search.ts
index 084b1a54e5..0e6982545f 100644
--- a/packages/backend/src/plugins/search.ts
+++ b/packages/backend/src/plugins/search.ts
@@ -16,6 +16,7 @@
import { useHotCleanup } from '@backstage/backend-common';
import { DefaultCatalogCollatorFactory } from '@backstage/plugin-catalog-backend';
+import { ToolDocumentCollatorFactory } from '@backstage/plugin-explore-backend';
import { createRouter } from '@backstage/plugin-search-backend';
import { ElasticSearchSearchEngine } from '@backstage/plugin-search-backend-module-elasticsearch';
import { PgSearchEngine } from '@backstage/plugin-search-backend-module-pg';
@@ -84,6 +85,14 @@ export default async function createPlugin(
}),
});
+ indexBuilder.addCollator({
+ schedule,
+ factory: ToolDocumentCollatorFactory.fromConfig(env.config, {
+ discovery: env.discovery,
+ logger: env.logger,
+ }),
+ });
+
// The scheduler controls when documents are gathered from collators and sent
// to the search engine for indexing.
const { scheduler } = await indexBuilder.build();
diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md
index 71f05de695..3a7bbc124a 100644
--- a/packages/catalog-client/CHANGELOG.md
+++ b/packages/catalog-client/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/catalog-client
+## 1.2.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 1.2.0-next.0
### Minor Changes
diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json
index 6093d6a891..3f2ffe255a 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.2.0-next.0",
+ "version": "1.2.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md
index 0383ec3194..1f4b669120 100644
--- a/packages/catalog-model/CHANGELOG.md
+++ b/packages/catalog-model/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/catalog-model
+## 1.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 1.1.4-next.0
### Patch Changes
diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json
index 4127936c26..e043a43165 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.1.4-next.0",
+ "version": "1.1.4-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/cli-common/src/paths.ts b/packages/cli-common/src/paths.ts
index 2b1ca34ca5..bdd0245c76 100644
--- a/packages/cli-common/src/paths.ts
+++ b/packages/cli-common/src/paths.ts
@@ -64,7 +64,7 @@ export function findRootPath(
): string | undefined {
let path = searchDir;
- // Some sanity check to avoid infinite loop
+ // Some confidence check to avoid infinite loop
for (let i = 0; i < 1000; i++) {
const packagePath = resolvePath(path, 'package.json');
const exists = fs.existsSync(packagePath);
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index 8902ec60b6..5a1e863014 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/cli
+## 0.21.2-next.1
+
+### Patch Changes
+
+- 8fffe42708: JSX and React Fast Refresh transforms are no longer enabled when bundling backend code.
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config-loader@1.1.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/release-manifests@0.0.8-next.0
+ - @backstage/cli-common@0.1.10
+ - @backstage/errors@1.1.4-next.1
+
## 0.21.2-next.0
### Patch Changes
diff --git a/packages/cli/cli-report.md b/packages/cli/cli-report.md
index aef56380d2..d82f8da60e 100644
--- a/packages/cli/cli-report.md
+++ b/packages/cli/cli-report.md
@@ -345,11 +345,13 @@ Options:
-i, --runInBand
--runTestsByPath
--runner
+ --seed
--selectProjects
--setupFiles
--setupFilesAfterEnv
--shard
--showConfig
+ --showSeed
--silent
--skipFilter
--snapshotSerializers
@@ -524,11 +526,13 @@ Options:
-i, --runInBand
--runTestsByPath
--runner
+ --seed
--selectProjects
--setupFiles
--setupFilesAfterEnv
--shard
--showConfig
+ --showSeed
--silent
--skipFilter
--snapshotSerializers
diff --git a/packages/cli/config/eslint-factory.js b/packages/cli/config/eslint-factory.js
index e213f58e4e..a40aa79fb3 100644
--- a/packages/cli/config/eslint-factory.js
+++ b/packages/cli/config/eslint-factory.js
@@ -231,7 +231,7 @@ function createConfigForRole(dir, role, extraConfig = {}) {
},
restrictedImports: [
{
- // Importing the entire MUI icons packages kills build performance as the list of icons is huge.
+ // Importing the entire MUI icons packages impedes build performance as the list of icons is huge.
name: '@material-ui/icons',
message: "Please import '@material-ui/icons/' instead.",
},
diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js
index 4b9fcd3d8e..148d574441 100644
--- a/packages/cli/config/jest.js
+++ b/packages/cli/config/jest.js
@@ -82,7 +82,7 @@ async function getProjectConfig(targetPath, displayName) {
let closestPkgJson = undefined;
let currentPath = targetPath;
- // Some sanity check to avoid infinite loop
+ // Some confidence check to avoid infinite loop
for (let i = 0; i < 100; i++) {
const packagePath = path.resolve(currentPath, 'package.json');
const exists = fs.pathExistsSync(packagePath);
diff --git a/packages/cli/package.json b/packages/cli/package.json
index 1bba3b41a9..eef838d8ca 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.21.2-next.0",
+ "version": "0.21.2-next.1",
"publishConfig": {
"access": "public"
},
@@ -39,8 +39,8 @@
"@manypkg/get-packages": "^1.1.3",
"@octokit/request": "^6.0.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.7",
- "@rollup/plugin-commonjs": "^22.0.0",
- "@rollup/plugin-json": "^4.1.0",
+ "@rollup/plugin-commonjs": "^23.0.0",
+ "@rollup/plugin-json": "^5.0.0",
"@rollup/plugin-node-resolve": "^13.0.6",
"@rollup/plugin-yaml": "^3.1.0",
"@spotify/eslint-config-base": "^14.0.0",
@@ -96,7 +96,7 @@
"json-schema": "^0.4.0",
"lodash": "^4.17.21",
"mini-css-extract-plugin": "^2.4.2",
- "minimatch": "5.1.0",
+ "minimatch": "^5.1.1",
"node-fetch": "^2.6.7",
"node-libs-browser": "^2.2.1",
"npm-packlist": "^5.0.0",
diff --git a/packages/cli/src/lib/builder/packager.test.ts b/packages/cli/src/lib/builder/packager.test.ts
index 6264eb57ac..ea38aa82d9 100644
--- a/packages/cli/src/lib/builder/packager.test.ts
+++ b/packages/cli/src/lib/builder/packager.test.ts
@@ -31,7 +31,7 @@ describe('formatErrorMessage with esbuild plugin error', () => {
plugin: 'esbuild',
message: 'test',
id: 'index.js',
- errors: [{ text: 'Dummy', location: { line: 1, column: 1 } }],
+ errors: [{ text: 'Sample', location: { line: 1, column: 1 } }],
});
expect(msg).toContain('test\n\n');
});
diff --git a/packages/cli/src/lib/builder/plugins.ts b/packages/cli/src/lib/builder/plugins.ts
index 3b1cbe4f1c..e68758c1c8 100644
--- a/packages/cli/src/lib/builder/plugins.ts
+++ b/packages/cli/src/lib/builder/plugins.ts
@@ -114,7 +114,7 @@ export function forwardFileImports(options: ForwardFileImportsOptions): Plugin {
return false;
}
- // Sanity check, dunno if this can happen
+ // Confidence check, dunno if this can happen
if (!importer) {
throw new Error(`Unknown importer of file module ${id}`);
}
diff --git a/packages/cli/src/lib/bundler/LinkedPackageResolvePlugin.test.ts b/packages/cli/src/lib/bundler/LinkedPackageResolvePlugin.test.ts
index 450126e6fa..a64630d6fb 100644
--- a/packages/cli/src/lib/bundler/LinkedPackageResolvePlugin.test.ts
+++ b/packages/cli/src/lib/bundler/LinkedPackageResolvePlugin.test.ts
@@ -80,7 +80,7 @@ describe('LinkedPackageResolvePlugin', () => {
const callbackFalse = jest.fn();
tap(
{
- request: 'dummy',
+ request: 'sample',
path: false,
},
'some-context',
diff --git a/packages/cli/src/lib/bundler/transforms.ts b/packages/cli/src/lib/bundler/transforms.ts
index 0a4dddcaf5..9a93f550dd 100644
--- a/packages/cli/src/lib/bundler/transforms.ts
+++ b/packages/cli/src/lib/bundler/transforms.ts
@@ -62,14 +62,16 @@ export const transforms = (options: TransformOptions): Transforms => {
externalHelpers: !isBackend,
parser: {
syntax: 'typescript',
- tsx: true,
+ tsx: !isBackend,
dynamicImport: true,
},
transform: {
- react: {
- runtime: 'automatic',
- refresh: isDev,
- },
+ react: isBackend
+ ? undefined
+ : {
+ runtime: 'automatic',
+ refresh: isDev,
+ },
},
},
},
@@ -88,14 +90,16 @@ export const transforms = (options: TransformOptions): Transforms => {
externalHelpers: !isBackend,
parser: {
syntax: 'ecmascript',
- jsx: true,
+ jsx: !isBackend,
dynamicImport: true,
},
transform: {
- react: {
- runtime: 'automatic',
- refresh: isDev,
- },
+ react: isBackend
+ ? undefined
+ : {
+ runtime: 'automatic',
+ refresh: isDev,
+ },
},
},
},
@@ -119,7 +123,7 @@ export const transforms = (options: TransformOptions): Transforms => {
externalHelpers: !isBackend,
parser: {
syntax: 'ecmascript',
- jsx: true,
+ jsx: !isBackend,
dynamicImport: true,
},
},
@@ -188,11 +192,13 @@ export const transforms = (options: TransformOptions): Transforms => {
const plugins = new Array();
if (isDev) {
- plugins.push(
- new ReactRefreshPlugin({
- overlay: { sockProtocol: 'ws' },
- }),
- );
+ if (!isBackend) {
+ plugins.push(
+ new ReactRefreshPlugin({
+ overlay: { sockProtocol: 'ws' },
+ }),
+ );
+ }
} else {
plugins.push(
new MiniCssExtractPlugin({
diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md
index e079cb345b..62cd2b0ff9 100644
--- a/packages/config-loader/CHANGELOG.md
+++ b/packages/config-loader/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/config-loader
+## 1.1.7-next.1
+
+### Patch Changes
+
+- 40e7e6e1a2: Updated dependency `typescript-json-schema` to `^0.55.0`.
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/cli-common@0.1.10
+ - @backstage/errors@1.1.4-next.1
+
## 1.1.7-next.0
### Patch Changes
diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json
index 5a128cd0b6..b39d00259d 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.7-next.0",
+ "version": "1.1.7-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.cjs.js",
diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md
index cc4d1571ee..212bf7e008 100644
--- a/packages/config/CHANGELOG.md
+++ b/packages/config/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/config
+## 1.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+
## 1.0.5-next.0
### Patch Changes
diff --git a/packages/config/package.json b/packages/config/package.json
index 274e7f016e..5db3832789 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.5-next.0",
+ "version": "1.0.5-next.1",
"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 63bb4511a1..5307464eed 100644
--- a/packages/core-app-api/CHANGELOG.md
+++ b/packages/core-app-api/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/core-app-api
+## 1.2.1-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+
## 1.2.1-next.0
### Patch Changes
diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json
index 1c15f7d6f5..6f4961403d 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.2.1-next.0",
+ "version": "1.2.1-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
@@ -39,7 +39,7 @@
"@types/prop-types": "^15.7.3",
"prop-types": "^15.7.2",
"react-use": "^17.2.4",
- "zen-observable": "^0.9.0",
+ "zen-observable": "^0.10.0",
"zod": "^3.11.6"
},
"peerDependencies": {
diff --git a/packages/core-app-api/src/app/AppManager.tsx b/packages/core-app-api/src/app/AppManager.tsx
index 0ca09c0a0c..4582a3c7cd 100644
--- a/packages/core-app-api/src/app/AppManager.tsx
+++ b/packages/core-app-api/src/app/AppManager.tsx
@@ -116,7 +116,7 @@ function getBasePath(configApi: Config) {
function readBasePath(configApi: ConfigApi) {
let { pathname } = new URL(
configApi.getOptionalString('app.baseUrl') ?? '/',
- 'http://dummy.dev', // baseUrl can be specified as just a path
+ 'http://sample.dev', // baseUrl can be specified as just a path
);
pathname = pathname.replace(/\/*$/, '');
return pathname;
diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md
index 051dc9a67d..af438fab0c 100644
--- a/packages/core-components/CHANGELOG.md
+++ b/packages/core-components/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/core-components
+## 0.12.1-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.12.1-next.0
### Patch Changes
diff --git a/packages/core-components/package.json b/packages/core-components/package.json
index 11aebfbc0f..56e124d094 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.1-next.0",
+ "version": "0.12.1-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
@@ -41,7 +41,7 @@
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
- "@react-hookz/web": "^15.0.0",
+ "@react-hookz/web": "^19.0.0",
"@types/react-sparklines": "^1.7.0",
"@types/react-text-truncate": "^0.14.0",
"ansi-regex": "^6.0.1",
@@ -67,7 +67,7 @@
"react-virtualized-auto-sizer": "^1.0.6",
"react-window": "^1.8.6",
"remark-gfm": "^3.0.1",
- "zen-observable": "^0.9.0",
+ "zen-observable": "^0.10.0",
"zod": "^3.11.6"
},
"peerDependencies": {
diff --git a/packages/core-components/src/components/AlertDisplay/AlertDisplay.tsx b/packages/core-components/src/components/AlertDisplay/AlertDisplay.tsx
index 3af261da23..c1f8f51db0 100644
--- a/packages/core-components/src/components/AlertDisplay/AlertDisplay.tsx
+++ b/packages/core-components/src/components/AlertDisplay/AlertDisplay.tsx
@@ -83,7 +83,7 @@ export function AlertDisplay(props: AlertDisplayProps) {
severity={firstMessage.severity}
>
- {firstMessage.message.toString()}
+ {String(firstMessage.message)}
{messages.length > 1 && (
{` (${messages.length - 1} older ${pluralize(
'message',
diff --git a/packages/core-components/src/components/Link/Link.tsx b/packages/core-components/src/components/Link/Link.tsx
index 66b7453abd..dfa38be44e 100644
--- a/packages/core-components/src/components/Link/Link.tsx
+++ b/packages/core-components/src/components/Link/Link.tsx
@@ -80,7 +80,7 @@ const useBaseUrl = () => {
*/
const useBasePath = () => {
// baseUrl can be specified as just a path
- const base = 'http://dummy.dev';
+ const base = 'http://sample.dev';
const url = useBaseUrl() ?? '/';
const { pathname } = new URL(url, base);
return trimEnd(pathname, '/');
diff --git a/packages/core-components/src/components/OverflowTooltip/OverflowTooltip.stories.tsx b/packages/core-components/src/components/OverflowTooltip/OverflowTooltip.stories.tsx
index a022b3b5c2..5ab5ba7dc4 100644
--- a/packages/core-components/src/components/OverflowTooltip/OverflowTooltip.stories.tsx
+++ b/packages/core-components/src/components/OverflowTooltip/OverflowTooltip.stories.tsx
@@ -23,7 +23,7 @@ export default {
};
const text =
- 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.';
+ 'Lorem Ipsum is simply sample text of the printing and typesetting industry.';
export const Default = () => (
diff --git a/packages/core-components/src/layout/Sidebar/Intro.tsx b/packages/core-components/src/layout/Sidebar/Intro.tsx
index 91e188b203..5cc6bbdcd5 100644
--- a/packages/core-components/src/layout/Sidebar/Intro.tsx
+++ b/packages/core-components/src/layout/Sidebar/Intro.tsx
@@ -151,7 +151,7 @@ export function SidebarIntro(_props: {}) {
starredItemsDismissed: false,
recentlyViewedItemsDismissed: false,
};
- const [dismissedIntro, setDismissedIntro] =
+ const { value: dismissedIntro, set: setDismissedIntro } =
useLocalStorageValue(SIDEBAR_INTRO_LOCAL_STORAGE);
const { starredItemsDismissed, recentlyViewedItemsDismissed } =
diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md
index 2704cbcb6d..9a517c2a1e 100644
--- a/packages/core-plugin-api/CHANGELOG.md
+++ b/packages/core-plugin-api/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/core-plugin-api
+## 1.1.1-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+
## 1.1.1-next.0
### Patch Changes
diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json
index 56ec92b331..7db44eb613 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.1.1-next.0",
+ "version": "1.1.1-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
@@ -38,7 +38,7 @@
"@backstage/version-bridge": "workspace:^",
"history": "^5.0.0",
"prop-types": "^15.7.2",
- "zen-observable": "^0.9.0"
+ "zen-observable": "^0.10.0"
},
"peerDependencies": {
"@types/react": "^16.13.1 || ^17.0.0",
diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md
index e3885cc0eb..3d43f34c48 100644
--- a/packages/create-app/CHANGELOG.md
+++ b/packages/create-app/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/create-app
+## 0.4.35-next.1
+
+### Patch Changes
+
+- Bumped create-app version.
+- Updated dependencies
+ - @backstage/cli-common@0.1.10
+
## 0.4.35-next.0
### Patch Changes
diff --git a/packages/create-app/package.json b/packages/create-app/package.json
index 406517cc89..e233e67ea5 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.35-next.0",
+ "version": "0.4.35-next.1",
"publishConfig": {
"access": "public"
},
diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md
index dec04df678..f3a505fc02 100644
--- a/packages/dev-utils/CHANGELOG.md
+++ b/packages/dev-utils/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/dev-utils
+## 1.0.9-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/test-utils@1.2.3-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/app-defaults@1.0.9-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 1.0.9-next.0
### Patch Changes
@@ -896,7 +912,7 @@
### Patch Changes
-- 5aa4ceea6: Make sure to provide dummy routes for all external routes of plugins given to DevApp
+- 5aa4ceea6: Make sure to provide sample routes for all external routes of plugins given to DevApp
- Updated dependencies [3a58084b6]
- Updated dependencies [e799e74d4]
- Updated dependencies [dc12852c9]
diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json
index bbffca2956..1f7578f837 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.9-next.0",
+ "version": "1.0.9-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
@@ -47,7 +47,7 @@
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
"react-use": "^17.2.4",
- "zen-observable": "^0.9.0"
+ "zen-observable": "^0.10.0"
},
"peerDependencies": {
"@types/react": "^16.13.1 || ^17.0.0",
diff --git a/packages/dev-utils/src/devApp/render.tsx b/packages/dev-utils/src/devApp/render.tsx
index e04779b4d1..6fa73ba860 100644
--- a/packages/dev-utils/src/devApp/render.tsx
+++ b/packages/dev-utils/src/devApp/render.tsx
@@ -165,9 +165,9 @@ export class DevAppBuilder {
* Build a DevApp component using the resources registered so far
*/
build(): ComponentType<{}> {
- const dummyRouteRef = createRouteRef({ id: 'dummy' });
- const DummyPage = () => Page belonging to another plugin.;
- attachComponentData(DummyPage, 'core.mountPoint', dummyRouteRef);
+ const fakeRouteRef = createRouteRef({ id: 'fake' });
+ const FakePage = () => Page belonging to another plugin.;
+ attachComponentData(FakePage, 'core.mountPoint', fakeRouteRef);
const apis = [...this.apis];
if (!apis.some(api => api.api.id === scmIntegrationsApiRef.id)) {
@@ -188,7 +188,7 @@ export class DevAppBuilder {
for (const plugin of this.plugins ?? []) {
const targets: Record> = {};
for (const routeKey of Object.keys(plugin.externalRoutes)) {
- targets[routeKey] = dummyRouteRef;
+ targets[routeKey] = fakeRouteRef;
}
bind(plugin.externalRoutes, targets);
}
@@ -215,7 +215,7 @@ export class DevAppBuilder {
{this.routes}
- } />
+ } />
diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md
index 7cc653877a..5a46b58378 100644
--- a/packages/errors/CHANGELOG.md
+++ b/packages/errors/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/errors
+## 1.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+
## 1.1.4-next.0
### Patch Changes
diff --git a/packages/errors/package.json b/packages/errors/package.json
index d9d7175890..30656c6d41 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.4-next.0",
+ "version": "1.1.4-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md
index efbce4d4e8..871243fb94 100644
--- a/packages/integration-react/CHANGELOG.md
+++ b/packages/integration-react/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/integration-react
+## 1.1.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/theme@0.2.16
+
## 1.1.7-next.0
### Patch Changes
diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json
index f448d47b03..239cd87a70 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.7-next.0",
+ "version": "1.1.7-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md
index f16605e90e..0542c17989 100644
--- a/packages/integration/CHANGELOG.md
+++ b/packages/integration/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/integration
+## 1.4.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 1.4.1-next.0
### Patch Changes
diff --git a/packages/integration/package.json b/packages/integration/package.json
index a162cd2fea..bcf6da2d74 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.1-next.0",
+ "version": "1.4.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md
index e510cae33d..2aa40b7cb3 100644
--- a/packages/repo-tools/CHANGELOG.md
+++ b/packages/repo-tools/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/repo-tools
+## 0.1.0-next.1
+
+### Minor Changes
+
+- 03843259b4: Api reference documentation improvements
+
+ - breadcrumbs links semantics as code spans
+ - new `@config` annotation to describe related config keys
+
+### Patch Changes
+
+- 71f80eb354: add the command type-deps to the repo tool package.
+- Updated dependencies
+ - @backstage/errors@1.1.4-next.1
+
## 0.1.0-next.0
### Minor Changes
diff --git a/packages/repo-tools/cli-report.md b/packages/repo-tools/cli-report.md
index 08568827ea..309ddad2a3 100644
--- a/packages/repo-tools/cli-report.md
+++ b/packages/repo-tools/cli-report.md
@@ -13,6 +13,7 @@ Options:
Commands:
api-reports [options] [path...]
+ type-deps
help [command]
```
@@ -27,3 +28,12 @@ Options:
--docs
-h, --help
```
+
+### `backstage-repo-tools type-deps`
+
+```
+Usage: backstage-repo-tools type-deps [options]
+
+Options:
+ -h, --help
+```
diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json
index 60f01c1840..a0caa3ee9c 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.0-next.0",
+ "version": "0.1.0-next.1",
"publishConfig": {
"access": "public"
},
@@ -31,6 +31,7 @@
},
"dependencies": {
"@backstage/errors": "workspace:^",
+ "@manypkg/get-packages": "^1.1.3",
"@microsoft/api-documenter": "^7.17.11",
"@microsoft/api-extractor": "^7.23.0",
"@microsoft/api-extractor-model": "^7.17.2",
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 d434aae0a6..bae62ccc7e 100644
--- a/packages/repo-tools/src/commands/api-reports/api-extractor.ts
+++ b/packages/repo-tools/src/commands/api-reports/api-extractor.ts
@@ -39,9 +39,19 @@ import {
DocNode,
IDocNodeContainerParameters,
TSDocTagSyntaxKind,
+ TSDocConfiguration,
+ Standardization,
+ DocBlockTag,
+ DocPlainText,
+ DocLinkTag,
} from '@microsoft/tsdoc';
import { TSDocConfigFile } from '@microsoft/tsdoc-config';
-import { ApiPackage, ApiModel, ApiItem } from '@microsoft/api-extractor-model';
+import {
+ ApiPackage,
+ ApiModel,
+ ApiItem,
+ ApiItemKind,
+} from '@microsoft/api-extractor-model';
import {
IMarkdownDocumenterOptions,
MarkdownDocumenter,
@@ -334,7 +344,12 @@ export async function getTsDocConfig() {
tagName: '@ignore',
syntaxKind: TSDocTagSyntaxKind.ModifierTag,
});
+ tsdocConfigFile.addTagDefinition({
+ tagName: '@config',
+ syntaxKind: TSDocTagSyntaxKind.BlockTag,
+ });
tsdocConfigFile.setSupportForTag('@ignore', true);
+ tsdocConfigFile.setSupportForTag('@config', true);
return tsdocConfigFile;
}
@@ -827,6 +842,16 @@ export async function buildDocs({
}
}
+ // This class only propose is to have a different kind and be able to render links with backticks
+ class DocCodeSpanLink extends DocLinkTag {
+ static kind = 'DocCodeSpanLink';
+
+ /** @override */
+ public get kind(): string {
+ return DocCodeSpanLink.kind;
+ }
+ }
+
// This is where we actually write the markdown and where we can hook
// in the rendering of our own nodes.
class CustomCustomMarkdownEmitter extends CustomMarkdownEmitter {
@@ -845,7 +870,7 @@ export async function buildDocs({
/** @override */
protected writeNode(
docNode: DocNode,
- context: IMarkdownEmitterContext,
+ context: IMarkdownEmitterContext,
docNodeSiblings: boolean,
): void {
switch (docNode.kind) {
@@ -861,6 +886,32 @@ export async function buildDocs({
context.writer.writeLine();
break;
}
+ case 'BlockTag': {
+ const node = docNode as DocBlockTag;
+ if (node.tagName === '@config') {
+ context.writer.writeLine('## Related config ');
+ }
+ break;
+ }
+ case DocCodeSpanLink.kind: {
+ const node = docNode as DocLinkTag;
+ if (node.codeDestination) {
+ // TODO @sarabadu understand if we need `codeDestination` at all on this custom DocCodeSpanLink
+ super.writeLinkTagWithCodeDestination(node, context);
+ } else if (node.urlDestination) {
+ const linkText =
+ node.linkText !== undefined ? node.linkText : node.urlDestination;
+ const encodedLinkText = this.getEscapedText(
+ linkText.replace(/\s+/g, ' '),
+ );
+ context.writer.write('[');
+ context.writer.write(`\`${encodedLinkText}\``);
+ context.writer.write(`](${node.urlDestination})`);
+ } else if (node.linkText) {
+ this.writePlainText(node.linkText, context);
+ }
+ break;
+ }
default:
super.writeNode(docNode, context, docNodeSiblings);
}
@@ -884,15 +935,35 @@ export async function buildDocs({
super(options);
// It's a strict model, we gotta register the allowed usage of our new node
- this._tsdocConfiguration.docNodeManager.registerDocNodes(
- '@backstage/docs',
- [{ docNodeKind: DocFrontMatter.kind, constructor: DocFrontMatter }],
- );
- this._tsdocConfiguration.docNodeManager.registerAllowableChildren(
- 'Paragraph',
- [DocFrontMatter.kind],
- );
+ (
+ this._tsdocConfiguration as TSDocConfiguration
+ ).docNodeManager.registerDocNodes('@backstage/docs', [
+ { docNodeKind: DocFrontMatter.kind, constructor: DocFrontMatter },
+ ]);
+ (
+ this._tsdocConfiguration as TSDocConfiguration
+ ).docNodeManager.registerDocNodes('@backstage/docs', [
+ { docNodeKind: DocCodeSpanLink.kind, constructor: DocCodeSpanLink },
+ ]);
+ (
+ this._tsdocConfiguration as TSDocConfiguration
+ ).docNodeManager.registerAllowableChildren('Paragraph', [
+ DocFrontMatter.kind,
+ DocCodeSpanLink.kind,
+ ]);
+ const def = {
+ tagName: '@config',
+ syntaxKind: TSDocTagSyntaxKind.BlockTag,
+ tagNameWithUpperCase: '@CONFIG',
+ standardization: Standardization.Extended,
+ allowMultiple: false,
+ };
+ (this._tsdocConfiguration as TSDocConfiguration).addTagDefinition(def);
+ (this._tsdocConfiguration as TSDocConfiguration).setSupportForTag(
+ def,
+ true,
+ );
this._markdownEmitter = new CustomCustomMarkdownEmitter(newModel);
}
@@ -941,8 +1012,40 @@ export async function buildDocs({
}),
);
- // Now write the actual breadcrumbs
- super._writeBreadcrumb(output, apiItem);
+ const configuration: TSDocConfiguration = this._tsdocConfiguration;
+
+ output.appendNodeInParagraph(
+ new DocLinkTag({
+ configuration,
+ tagName: '@link',
+ linkText: 'Home',
+ urlDestination: this._getLinkFilenameForApiItem(this._apiModel),
+ }),
+ );
+
+ for (const hierarchyItem of apiItem.getHierarchy()) {
+ switch (hierarchyItem.kind) {
+ case ApiItemKind.Model:
+ case ApiItemKind.EntryPoint:
+ // We don't show the model as part of the breadcrumb because it is the root-level container.
+ // We don't show the entry point because today API Extractor doesn't support multiple entry points;
+ // this may change in the future.
+ break;
+ default:
+ output.appendNodesInParagraph([
+ new DocPlainText({
+ configuration,
+ text: ' > ',
+ }),
+ new DocCodeSpanLink({
+ configuration,
+ tagName: '@link',
+ linkText: hierarchyItem.displayName,
+ urlDestination: this._getLinkFilenameForApiItem(hierarchyItem),
+ }),
+ ]);
+ }
+ }
// We wanna ignore the header that always gets written after the breadcrumb
// This otherwise becomes more or less a duplicate of the title in the front matter
diff --git a/packages/repo-tools/src/commands/index.ts b/packages/repo-tools/src/commands/index.ts
index c4281b0c4f..ebbcb5be8e 100644
--- a/packages/repo-tools/src/commands/index.ts
+++ b/packages/repo-tools/src/commands/index.ts
@@ -28,6 +28,11 @@ export function registerCommands(program: Command) {
.action(
lazy(() => import('./api-reports/api-reports').then(m => m.default)),
);
+
+ program
+ .command('type-deps')
+ .description('Find inconsistencies in types of all packages and plugins')
+ .action(lazy(() => import('./type-deps/type-deps').then(m => m.default)));
}
// Wraps an action function so that it always exits and handles errors
diff --git a/scripts/check-type-dependencies.js b/packages/repo-tools/src/commands/type-deps/type-deps.ts
old mode 100755
new mode 100644
similarity index 86%
rename from scripts/check-type-dependencies.js
rename to packages/repo-tools/src/commands/type-deps/type-deps.ts
index ebad9b6dfc..d4dd28aa14
--- a/scripts/check-type-dependencies.js
+++ b/packages/repo-tools/src/commands/type-deps/type-deps.ts
@@ -1,6 +1,5 @@
-#!/usr/bin/env node
/*
- * Copyright 2020 The Backstage Authors
+ * 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.
@@ -15,14 +14,14 @@
* limitations under the License.
*/
-const fs = require('fs');
-const { resolve: resolvePath } = require('path');
+import fs from 'fs';
+import { resolve as resolvePath } from 'path';
// Cba polluting root package.json, we'll have this
// eslint-disable-next-line import/no-extraneous-dependencies
-const chalk = require('chalk');
-const { getPackages } = require('@manypkg/get-packages');
+import chalk from 'chalk';
+import { getPackages, Package } from '@manypkg/get-packages';
-async function main() {
+export default async () => {
const { packages } = await getPackages(resolvePath('.'));
let hadErrors = false;
@@ -63,24 +62,29 @@ async function main() {
process.exit(2);
}
-}
+};
-function shouldCheckTypes(pkg) {
+type PackageJsonWithTypes = {
+ packageJson: {
+ types?: string;
+ };
+};
+function shouldCheckTypes(pkg: Package & PackageJsonWithTypes) {
return (
- !pkg.private &&
+ !pkg.packageJson.private &&
pkg.packageJson.types &&
fs.existsSync(resolvePath(pkg.dir, 'dist/index.d.ts'))
);
}
-function findAllDeps(declSrc) {
+function findAllDeps(declSrc: string) {
const importedDeps = (declSrc.match(/^import .* from '.*';$/gm) || [])
- .map(match => match.match(/from '(.*)'/)[1])
+ .map(match => match.match(/from '(.*)'/)?.[1] ?? '')
.filter(n => !n.startsWith('.'));
const referencedDeps = (
declSrc.match(/^\/\/\/ $/gm) || []
)
- .map(match => match.match(/types="(.*)"/)[1])
+ .map(match => match.match(/types="(.*)"/)?.[1] ?? '')
.filter(n => !n.startsWith('.'))
// We allow references to these without an explicit dependency.
.filter(n => !['node', 'react'].includes(n));
@@ -91,7 +95,7 @@ function findAllDeps(declSrc) {
* Scan index.d.ts for imports and return errors for any dependency that's
* missing or incorrect in package.json
*/
-function checkTypes(pkg) {
+function checkTypes(pkg: Package) {
const typeDecl = fs.readFileSync(
resolvePath(pkg.dir, 'dist/index.d.ts'),
'utf8',
@@ -121,7 +125,7 @@ function checkTypes(pkg) {
* Find the package used for types. This assumes that types are working is a package
* can be resolved, it doesn't do any checking of presence of types inside the dep.
*/
-function findTypesPackage(dep, pkg) {
+function findTypesPackage(dep: string, pkg: Package) {
try {
require.resolve(`@types/${dep}/package.json`, { paths: [pkg.dir] });
return `@types/${dep}`;
@@ -161,7 +165,7 @@ function findTypesPackage(dep, pkg) {
/**
* Figures out what type dependencies are missing, or should be moved between dep types
*/
-function findTypeDepErrors(typeDeps, pkg) {
+function findTypeDepErrors(typeDeps: string[], pkg: Package) {
const devDeps = mkTypeDepSet(pkg.packageJson.devDependencies);
const deps = mkTypeDepSet({
...pkg.packageJson.dependencies,
@@ -204,19 +208,14 @@ function findTypeDepErrors(typeDeps, pkg) {
return errors;
}
-function mkTypeDepSet(deps) {
+function mkTypeDepSet(deps: Record | undefined) {
const typeDeps = Object.keys(deps || {}).filter(n => n.startsWith('@types/'));
return new Set(typeDeps);
}
-function mkErr(name, msg, extra) {
+function mkErr(name: string, msg: string, extra: Record) {
const error = new Error(msg);
error.name = name;
Object.assign(error, extra);
return error;
}
-
-main().catch(error => {
- console.error(error.stack || error);
- process.exit(1);
-});
diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md
index 320388fe3a..fde2899596 100644
--- a/packages/techdocs-cli-embedded-app/CHANGELOG.md
+++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md
@@ -1,5 +1,24 @@
# techdocs-cli-embedded-app
+## 0.2.77-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-catalog@1.6.2-next.1
+ - @backstage/plugin-techdocs@1.4.1-next.1
+ - @backstage/test-utils@1.2.3-next.1
+ - @backstage/cli@0.21.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/app-defaults@1.0.9-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/plugin-techdocs-react@1.0.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.2.77-next.0
### Patch Changes
diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json
index 48d905f09e..79aef2a74a 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.77-next.0",
+ "version": "0.2.77-next.1",
"private": true,
"backstage": {
"role": "frontend"
diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md
index fafb27aabe..23aedd7f4f 100644
--- a/packages/techdocs-cli/CHANGELOG.md
+++ b/packages/techdocs-cli/CHANGELOG.md
@@ -1,5 +1,16 @@
# @techdocs/cli
+## 1.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-techdocs-node@1.4.3-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/cli-common@0.1.10
+
## 1.2.4-next.0
### Patch Changes
diff --git a/packages/techdocs-cli/e2e-tests/techdocs-cli.test.ts b/packages/techdocs-cli/e2e-tests/techdocs-cli.test.ts
index 15d420af2c..dbbc219ab6 100644
--- a/packages/techdocs-cli/e2e-tests/techdocs-cli.test.ts
+++ b/packages/techdocs-cli/e2e-tests/techdocs-cli.test.ts
@@ -64,7 +64,7 @@ describe('end-to-end', () => {
afterEach(async () => {
// On Windows the pid of a spawned process may be wrong
- // Because of this, we should be kill the MKDocs after the test
+ // Because of this, we should stop the MKDocs after the test
// (e.g. https://github.com/nodejs/node/issues/4289#issuecomment-854270414)
if (process.platform === 'win32') {
const procs = await findProcess('name', 'mkdocs', true);
diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json
index 074cbe3a70..7528a338c7 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.2.4-next.0",
+ "version": "1.2.4-next.1",
"publishConfig": {
"access": "public"
},
diff --git a/packages/techdocs-cli/src/lib/run.ts b/packages/techdocs-cli/src/lib/run.ts
index 9e2abeb617..13ac7d9d4c 100644
--- a/packages/techdocs-cli/src/lib/run.ts
+++ b/packages/techdocs-cli/src/lib/run.ts
@@ -63,7 +63,7 @@ export const run = async (
return childProcess;
};
-// Block indefinitely and wait for a signal to kill the child process(es)
+// Block indefinitely and wait for a signal to stop the child process(es)
// Throw error if any child process errors
// Resolves only when all processes exit with status code 0
export async function waitForSignal(
diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md
index b9010b8d94..7b1a7212fd 100644
--- a/packages/test-utils/CHANGELOG.md
+++ b/packages/test-utils/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/test-utils
+## 1.2.3-next.1
+
+### Patch Changes
+
+- 5e238ed56a: The test utility for the plugin context called `MockPluginProvider` has been created. It will be handy in the cases when you use
+ `__experimentalConfigure` in your plugin. It is experimental and exported through `@backstage/test-utils/alpha`.
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
## 1.2.3-next.0
### Patch Changes
diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json
index d2e7f38e60..0ee70ce834 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.3-next.0",
+ "version": "1.2.3-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
@@ -46,7 +46,7 @@
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
"cross-fetch": "^3.1.5",
- "zen-observable": "^0.9.0"
+ "zen-observable": "^0.10.0"
},
"peerDependencies": {
"@types/react": "^16.13.1 || ^17.0.0",
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index feb23c94bc..e0f1f56fa4 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -1,5 +1,11 @@
# @backstage/types
+## 1.0.2-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+
## 1.0.2-next.0
### Patch Changes
diff --git a/packages/types/package.json b/packages/types/package.json
index 30746f8aaf..fba7a644df 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/types",
"description": "Common TypeScript types used within Backstage",
- "version": "1.0.2-next.0",
+ "version": "1.0.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,7 +35,7 @@
"@backstage/cli": "workspace:^",
"@types/zen-observable": "^0.8.0",
"luxon": "^3.0.0",
- "zen-observable": "^0.9.0"
+ "zen-observable": "^0.10.0"
},
"files": [
"dist"
diff --git a/packages/version-bridge/CHANGELOG.md b/packages/version-bridge/CHANGELOG.md
index a36630e594..fd5ac8500d 100644
--- a/packages/version-bridge/CHANGELOG.md
+++ b/packages/version-bridge/CHANGELOG.md
@@ -1,5 +1,11 @@
# @backstage/version-bridge
+## 1.0.3-next.0
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+
## 1.0.2
### Patch Changes
diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json
index 736ae4037b..dbb4d69d4f 100644
--- a/packages/version-bridge/package.json
+++ b/packages/version-bridge/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/version-bridge",
"description": "Utilities used by @backstage packages to support multiple concurrent versions",
- "version": "1.0.2",
+ "version": "1.0.3-next.0",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md
index 90c7de923f..9a4a722d4b 100644
--- a/plugins/adr-backend/CHANGELOG.md
+++ b/plugins/adr-backend/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-adr-backend
+## 0.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-adr-common@0.2.4-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 0.2.4-next.0
### Patch Changes
diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json
index b70c2f75b4..5bd8b1434b 100644
--- a/plugins/adr-backend/package.json
+++ b/plugins/adr-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr-backend",
- "version": "0.2.4-next.0",
+ "version": "0.2.4-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md
index 68f9e933c1..b90cf4ffb1 100644
--- a/plugins/adr-common/CHANGELOG.md
+++ b/plugins/adr-common/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-adr-common
+## 0.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 0.2.4-next.0
### Patch Changes
diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json
index 6ea87571d6..46602b837c 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.4-next.0",
+ "version": "0.2.4-next.1",
"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 de75bc6343..8f989e969a 100644
--- a/plugins/adr/CHANGELOG.md
+++ b/plugins/adr/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-adr
+## 0.2.4-next.1
+
+### Patch Changes
+
+- a19cffbeed: Update search links to only have header as linkable text
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-adr-common@0.2.4-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 0.2.4-next.0
### Patch Changes
diff --git a/plugins/adr/package.json b/plugins/adr/package.json
index 40e2c2dc0e..311941a987 100644
--- a/plugins/adr/package.json
+++ b/plugins/adr/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr",
- "version": "0.2.4-next.0",
+ "version": "0.2.4-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/adr/src/search/AdrSearchResultListItem.tsx b/plugins/adr/src/search/AdrSearchResultListItem.tsx
index d76f2cca4e..97847ba67b 100644
--- a/plugins/adr/src/search/AdrSearchResultListItem.tsx
+++ b/plugins/adr/src/search/AdrSearchResultListItem.tsx
@@ -64,21 +64,23 @@ export function AdrSearchResultListItem(props: {
};
return (
-
+ <>
- ) : (
- result.title
- )
+
+ {highlight?.fields.title ? (
+
+ ) : (
+ result.title
+ )}
+
}
secondary={
-
+ >
);
}
diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md
index ec05c2490a..3c7a4e3aec 100644
--- a/plugins/airbrake-backend/CHANGELOG.md
+++ b/plugins/airbrake-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-airbrake-backend
+## 0.2.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+
## 0.2.12-next.0
### Patch Changes
diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json
index d7b988ca3a..6ef89e40a6 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.12-next.0",
+ "version": "0.2.12-next.1",
"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 e3567f8914..933c957ba6 100644
--- a/plugins/airbrake/CHANGELOG.md
+++ b/plugins/airbrake/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-airbrake
+## 0.3.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/test-utils@1.2.3-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/dev-utils@1.0.9-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.12-next.0
### Patch Changes
diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json
index 3d0c7e0050..8be500e662 100644
--- a/plugins/airbrake/package.json
+++ b/plugins/airbrake/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake",
- "version": "0.3.12-next.0",
+ "version": "0.3.12-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md
index cfce4f4918..17264cdfd5 100644
--- a/plugins/allure/CHANGELOG.md
+++ b/plugins/allure/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-allure
+## 0.1.28-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.28-next.0
### Patch Changes
diff --git a/plugins/allure/package.json b/plugins/allure/package.json
index a83baef5d9..e4f5b8a987 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.28-next.0",
+ "version": "0.1.28-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md
index f050e0c40b..315c8b6669 100644
--- a/plugins/analytics-module-ga/CHANGELOG.md
+++ b/plugins/analytics-module-ga/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-analytics-module-ga
+## 0.1.23-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.23-next.0
### Patch Changes
diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json
index 3219e45f97..2ec2cbb542 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.23-next.0",
+ "version": "0.1.23-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md
index 6d956ad4c7..d4784b0b95 100644
--- a/plugins/apache-airflow/CHANGELOG.md
+++ b/plugins/apache-airflow/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-apache-airflow
+## 0.2.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+
## 0.2.5-next.0
### Patch Changes
diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json
index 7d2986dbf0..a3a0f2f885 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.5-next.0",
+ "version": "0.2.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md
index cfcd72bf44..7cba1b5f69 100644
--- a/plugins/api-docs/CHANGELOG.md
+++ b/plugins/api-docs/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-api-docs
+## 0.8.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-catalog@1.6.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.8.12-next.0
### Patch Changes
diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json
index 66b7667a80..2ebad8557d 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.8.12-next.0",
+ "version": "0.8.12-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md
index 6187cef62e..bfe055b253 100644
--- a/plugins/apollo-explorer/CHANGELOG.md
+++ b/plugins/apollo-explorer/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-apollo-explorer
+## 0.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.5-next.0
### Patch Changes
diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json
index 47a5ce74ca..b5780aacc4 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.5-next.0",
+ "version": "0.1.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md
index c3dffbfd58..0398ae4e93 100644
--- a/plugins/app-backend/CHANGELOG.md
+++ b/plugins/app-backend/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-app-backend
+## 0.3.39-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config-loader@1.1.7-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+
## 0.3.39-next.0
### Patch Changes
diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json
index 2575f7e316..cf438b5422 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.39-next.0",
+ "version": "0.3.39-next.1",
"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 9e2ff2a229..8e23fa4d91 100644
--- a/plugins/auth-backend/CHANGELOG.md
+++ b/plugins/auth-backend/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-auth-backend
+## 0.17.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.17.2-next.0
### Patch Changes
diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json
index 6d811e84f1..80f43e0b81 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.17.2-next.0",
+ "version": "0.17.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md
index a94171bd73..a1fb63b7ee 100644
--- a/plugins/auth-node/CHANGELOG.md
+++ b/plugins/auth-node/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-auth-node
+## 0.2.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.2.8-next.0
### Patch Changes
diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json
index d62794090e..74392db58c 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.8-next.0",
+ "version": "0.2.8-next.1",
"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 d68a5aa89f..290dc14ffd 100644
--- a/plugins/azure-devops-backend/CHANGELOG.md
+++ b/plugins/azure-devops-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-azure-devops-backend
+## 0.3.18-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-azure-devops-common@0.3.0
+
## 0.3.18-next.0
### Patch Changes
diff --git a/plugins/azure-devops-backend/README.md b/plugins/azure-devops-backend/README.md
index 5dc0570bd2..301ae5b2b9 100644
--- a/plugins/azure-devops-backend/README.md
+++ b/plugins/azure-devops-backend/README.md
@@ -49,6 +49,7 @@ Here's how to get the backend up and running:
return createRouter({
logger: env.logger,
config: env.config,
+ reader: env.reader,
});
}
```
diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json
index 61ae636c69..e63715e55c 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.18-next.0",
+ "version": "0.3.18-next.1",
"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 76ad3f170f..9ac60deffe 100644
--- a/plugins/azure-devops/CHANGELOG.md
+++ b/plugins/azure-devops/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-azure-devops
+## 0.2.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-azure-devops-common@0.3.0
+
## 0.2.3-next.0
### Patch Changes
diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json
index e3a735b565..a6ab993594 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.3-next.0",
+ "version": "0.2.3-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md
index 7a3a1b7be1..515ef7a186 100644
--- a/plugins/azure-sites-backend/CHANGELOG.md
+++ b/plugins/azure-sites-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-azure-sites-backend
+## 0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-azure-sites-common@0.1.0
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json
index 5e88a910dd..dd233b0b58 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.1-next.0",
+ "version": "0.1.1-next.1",
"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 2cc3cedb1c..3cd14863b3 100644
--- a/plugins/azure-sites/CHANGELOG.md
+++ b/plugins/azure-sites/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-azure-sites
+## 0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-azure-sites-common@0.1.0
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json
index aaf9218ec0..67e41e3424 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.1-next.0",
+ "version": "0.1.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md
index 1153ed1436..e0ccf6481e 100644
--- a/plugins/badges-backend/CHANGELOG.md
+++ b/plugins/badges-backend/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-badges-backend
+## 0.1.33-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.1.33-next.0
### Patch Changes
diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json
index 9863578b50..eb2a40ea61 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.33-next.0",
+ "version": "0.1.33-next.1",
"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 bdfa1b2c6f..0931d7b0df 100644
--- a/plugins/badges/CHANGELOG.md
+++ b/plugins/badges/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-badges
+## 0.2.36-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.2.36-next.0
### Patch Changes
diff --git a/plugins/badges/package.json b/plugins/badges/package.json
index 9bbaa42792..7c5faf9eb1 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.36-next.0",
+ "version": "0.2.36-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md
index 43f0e70e90..905b53735c 100644
--- a/plugins/bazaar-backend/CHANGELOG.md
+++ b/plugins/bazaar-backend/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-bazaar-backend
+## 0.2.2-next.1
+
+### Patch Changes
+
+- 9b1891061c: Column `title` has replaced column `name` for `BazaarProject` in database
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-test-utils@0.1.31-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.2.2-next.0
### Patch Changes
diff --git a/plugins/bazaar-backend/knexfile.js b/plugins/bazaar-backend/knexfile.js
new file mode 100644
index 0000000000..c05af246c5
--- /dev/null
+++ b/plugins/bazaar-backend/knexfile.js
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+// Update with your config settings.
+
+// This file makes it possible to run "yarn knex migrate:make some_file_name"
+// to assist in making new migrations
+module.exports = {
+ client: 'better-sqlite3',
+ connection: ':memory:',
+ useNullAsDefault: true,
+ migrations: {
+ directory: './migrations',
+ },
+};
diff --git a/plugins/bazaar-backend/migrations/20221121120212_rename_col_to_title.js b/plugins/bazaar-backend/migrations/20221121120212_rename_col_to_title.js
new file mode 100644
index 0000000000..9974c9eb20
--- /dev/null
+++ b/plugins/bazaar-backend/migrations/20221121120212_rename_col_to_title.js
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+/**
+ * @param { import("knex").Knex } knex
+ * @returns { Promise }
+ */
+exports.up = async function up(knex) {
+ await knex.schema.alterTable('metadata', table => {
+ table.renameColumn('name', 'title');
+ });
+};
+
+/**
+ * @param { import("knex").Knex } knex
+ * @returns { Promise }
+ */
+exports.down = async function down(knex) {
+ await knex.schema.alterTable('metadata', table => {
+ table.renameColumn('title', 'name');
+ });
+};
diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json
index c580aa3c5f..29c2189c13 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.2-next.0",
+ "version": "0.2.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts b/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts
index 371d20ff13..be4f82f580 100644
--- a/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts
+++ b/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts
@@ -19,7 +19,7 @@ import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils';
import { Knex as KnexType } from 'knex';
const bazaarProject: any = {
- name: 'n1',
+ title: 'n1',
entityRef: 'ref1',
community: '',
status: 'proposed',
@@ -64,7 +64,7 @@ describe('DatabaseHandler', () => {
await knex('metadata').insert({
entity_ref: bazaarProject.entityRef,
- name: bazaarProject.name,
+ title: bazaarProject.title,
description: bazaarProject.description,
community: bazaarProject.community,
status: bazaarProject.status,
diff --git a/plugins/bazaar-backend/src/service/DatabaseHandler.ts b/plugins/bazaar-backend/src/service/DatabaseHandler.ts
index 8fbe985a10..f75ea8b782 100644
--- a/plugins/bazaar-backend/src/service/DatabaseHandler.ts
+++ b/plugins/bazaar-backend/src/service/DatabaseHandler.ts
@@ -52,7 +52,7 @@ export class DatabaseHandler {
private columns = [
'metadata.id',
'metadata.entity_ref',
- 'metadata.name',
+ 'metadata.title',
'metadata.description',
'metadata.status',
'metadata.updated_at',
@@ -116,7 +116,7 @@ export class DatabaseHandler {
async insertMetadata(bazaarProject: any) {
const {
- name,
+ title,
entityRef,
community,
description,
@@ -129,7 +129,7 @@ export class DatabaseHandler {
await this.client
.insert({
- name,
+ title,
entity_ref: entityRef,
community,
description,
@@ -145,7 +145,7 @@ export class DatabaseHandler {
async updateMetadata(bazaarProject: any) {
const {
- name,
+ title,
id,
entityRef,
community,
@@ -158,7 +158,7 @@ export class DatabaseHandler {
} = bazaarProject;
return await this.client('metadata').where({ id: id }).update({
- name,
+ title,
entity_ref: entityRef,
description,
community,
diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md
index 16056481ad..f5c28e2844 100644
--- a/plugins/bazaar/CHANGELOG.md
+++ b/plugins/bazaar/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-bazaar
+## 0.2.1-next.1
+
+### Patch Changes
+
+- 9b1891061c: `HomePageBazaarInfoCard` is now displaying `title` instead of `name`. Title is a string that doesn't have to be URL friendly.
+ The BazaarOverviewCard have the new property `fullHeight`. Link in `BazaarOverviewCard`is moved to header in card.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-catalog@1.6.2-next.1
+ - @backstage/cli@0.21.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.2.1-next.0
### Patch Changes
diff --git a/plugins/bazaar/README.md b/plugins/bazaar/README.md
index 40b2a8afbe..2ad141935e 100644
--- a/plugins/bazaar/README.md
+++ b/plugins/bazaar/README.md
@@ -80,13 +80,15 @@ export const homePage = (
+
+
-+
++
+
{/* ...other homepage items */}
```
-The property `fullWidth` is optional and can be used to adjust the card to fit a grid with column width 12.
+The property `title` is optional and can be used to customize the title in the card header. If no title is submitted the default titles `Bazaar Random Projects` or `Bazaar Latest Projects` are displayed.
+
+The properties `fullHeight` and `fullWidth` are also optional and can be used to adjust the cards styling.
## How does the Bazaar work?
@@ -106,7 +108,7 @@ To add a project to the bazaar, simply click on the `add-project` button and fil
The following fields are mandatory:
-- name - name of the project on URL safe format
+- title - title of the project
- description - present your idea and what skills you are looking for
- status - whether or not the project has started
- size - small, medium or large
diff --git a/plugins/bazaar/api-report.md b/plugins/bazaar/api-report.md
index c12c95a1f7..d7c463888a 100644
--- a/plugins/bazaar/api-report.md
+++ b/plugins/bazaar/api-report.md
@@ -15,8 +15,10 @@ export const BazaarOverviewCard: (
// @public (undocumented)
export type BazaarOverviewCardProps = {
+ title?: string;
order: 'latest' | 'random';
fullWidth?: boolean;
+ fullHeight?: boolean;
};
// @public (undocumented)
diff --git a/plugins/bazaar/media/layout.png b/plugins/bazaar/media/layout.png
index cc02a374a3..86c95f1e6e 100644
Binary files a/plugins/bazaar/media/layout.png and b/plugins/bazaar/media/layout.png differ
diff --git a/plugins/bazaar/media/overviewCard.png b/plugins/bazaar/media/overviewCard.png
index 676764f6e4..ef41ca48e5 100644
Binary files a/plugins/bazaar/media/overviewCard.png and b/plugins/bazaar/media/overviewCard.png differ
diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json
index 54c4de670e..607d91a731 100644
--- a/plugins/bazaar/package.json
+++ b/plugins/bazaar/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar",
- "version": "0.2.1-next.0",
+ "version": "0.2.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/bazaar/src/components/AddProjectDialog/AddProjectDialog.tsx b/plugins/bazaar/src/components/AddProjectDialog/AddProjectDialog.tsx
index 749fcf3cff..45392206d9 100644
--- a/plugins/bazaar/src/components/AddProjectDialog/AddProjectDialog.tsx
+++ b/plugins/bazaar/src/components/AddProjectDialog/AddProjectDialog.tsx
@@ -42,8 +42,7 @@ export const AddProjectDialog = ({
const [selectedEntity, setSelectedEntity] = useState(null);
const defaultValues = {
- name: '',
- title: 'Add project',
+ title: '',
community: '',
description: '',
status: 'proposed' as Status,
@@ -65,6 +64,7 @@ export const AddProjectDialog = ({
reset: UseFormReset,
) => {
const formValues = getValues();
+
const response = await bazaarApi.addProject({
...formValues,
entityRef: selectedEntity ? stringifyEntityRef(selectedEntity) : null,
diff --git a/plugins/bazaar/src/components/BazaarOverviewCard/BazaarOverviewCard.tsx b/plugins/bazaar/src/components/BazaarOverviewCard/BazaarOverviewCard.tsx
index d64e36baeb..c58ee3db1c 100644
--- a/plugins/bazaar/src/components/BazaarOverviewCard/BazaarOverviewCard.tsx
+++ b/plugins/bazaar/src/components/BazaarOverviewCard/BazaarOverviewCard.tsx
@@ -24,13 +24,17 @@ import type { BazaarProject } from '../../types';
import { bazaarApiRef } from '../../api';
import { fetchCatalogItems } from '../../util/fetchMethods';
import { parseBazaarProject } from '../../util/parseMethods';
-import { ErrorPanel, InfoCard } from '@backstage/core-components';
+import { ErrorPanel, InfoCard, Link } from '@backstage/core-components';
import { bazaarPlugin } from '../../plugin';
+import { IconButton } from '@material-ui/core';
+import StorefrontIcon from '@material-ui/icons/Storefront';
/** @public */
export type BazaarOverviewCardProps = {
+ title?: string;
order: 'latest' | 'random';
fullWidth?: boolean;
+ fullHeight?: boolean;
};
const getUnlinkedCatalogEntities = (
@@ -48,11 +52,14 @@ const getUnlinkedCatalogEntities = (
/** @public */
export const BazaarOverviewCard = (props: BazaarOverviewCardProps) => {
- const { order, fullWidth = false } = props;
+ const { title, order, fullWidth = false, fullHeight = false } = props;
const bazaarApi = useApi(bazaarApiRef);
const catalogApi = useApi(catalogApiRef);
const root = useRouteRef(bazaarPlugin.routes.root);
+ const defaultTitle =
+ order === 'latest' ? 'Bazaar Latest Projects' : 'Bazaar Random Projects';
+
const bazaarLink = {
title: 'Go to Bazaar',
link: `${root()}`,
@@ -124,10 +131,14 @@ export const BazaarOverviewCard = (props: BazaarOverviewCardProps) => {
return (
+
+
+
+
}
- deepLink={bazaarLink}
>
{
catalogEntities={unlinkedCatalogEntities || []}
useTablePagination={false}
gridSize={fullWidth ? 2 : 4}
+ height={fullHeight ? '13rem' : '7rem'}
/>
);
diff --git a/plugins/bazaar/src/components/CardContentFields/CardContentFields.tsx b/plugins/bazaar/src/components/CardContentFields/CardContentFields.tsx
index 641ae97f95..82ab9df89d 100644
--- a/plugins/bazaar/src/components/CardContentFields/CardContentFields.tsx
+++ b/plugins/bazaar/src/components/CardContentFields/CardContentFields.tsx
@@ -17,7 +17,6 @@
import React from 'react';
import {
Grid,
- makeStyles,
Card,
CardContent,
Typography,
@@ -31,13 +30,6 @@ import { entityRouteRef } from '@backstage/plugin-catalog-react';
import { StatusTag } from '../StatusTag';
import { Member, BazaarProject } from '../../types';
-const useStyles = makeStyles({
- break: {
- wordBreak: 'break-word',
- textAlign: 'justify',
- },
-});
-
type Props = {
bazaarProject: BazaarProject;
members: Member[];
@@ -51,7 +43,6 @@ export const CardContentFields = ({
descriptionSize,
membersSize,
}: Props) => {
- const classes = useStyles();
const catalogEntityRoute = useRouteRef(entityRouteRef);
return (
@@ -64,12 +55,7 @@ export const CardContentFields = ({
{bazaarProject.description
.split('\n')
.map((str: string, i: number) => (
-
+
{str}
))}
@@ -114,7 +100,6 @@ export const CardContentFields = ({
picture={member.picture}
/>
- {bazaarProject.name}
+
+ {bazaarProject.title}
,
' from the Bazaar?',
]}
diff --git a/plugins/bazaar/src/components/EntityBazaarInfoContent/EntityBazaarInfoContent.tsx b/plugins/bazaar/src/components/EntityBazaarInfoContent/EntityBazaarInfoContent.tsx
index 0c9da1ed24..a2e5fe151b 100644
--- a/plugins/bazaar/src/components/EntityBazaarInfoContent/EntityBazaarInfoContent.tsx
+++ b/plugins/bazaar/src/components/EntityBazaarInfoContent/EntityBazaarInfoContent.tsx
@@ -173,7 +173,7 @@ export const EntityBazaarInfoContent = ({
{parseEntityRef(bazaarProject.entityRef!).name}
,
' from ',
- {bazaarProject.name},
+ {bazaarProject.title},
' ?',
]}
type="unlink"
@@ -182,7 +182,7 @@ export const EntityBazaarInfoContent = ({
)}
{bazaarProject?.name!}
}
+ title={{bazaarProject?.title!}
}
action={
,
' from ',
- {bazaarProject.value?.name},
+ {bazaarProject.value?.title},
' ?',
]}
type="unlink"
@@ -257,7 +257,7 @@ export const HomePageBazaarInfoCard = ({
- {bazaarProject.value?.name || initProject.name}
+ {bazaarProject.value?.title || initProject.title}
}
action={
diff --git a/plugins/bazaar/src/components/InputField/InputField.tsx b/plugins/bazaar/src/components/InputField/InputField.tsx
index cae22a1313..a2c8ca4ac4 100644
--- a/plugins/bazaar/src/components/InputField/InputField.tsx
+++ b/plugins/bazaar/src/components/InputField/InputField.tsx
@@ -30,7 +30,7 @@ type Rules = {
};
type Props = {
- inputType: 'description' | 'community' | 'responsible' | 'name';
+ inputType: 'description' | 'community' | 'responsible' | 'title';
error?: FieldError | undefined;
control: Control;
helperText?: string;
diff --git a/plugins/bazaar/src/components/ProjectCard/ProjectCard.tsx b/plugins/bazaar/src/components/ProjectCard/ProjectCard.tsx
index fcae411519..9193215804 100644
--- a/plugins/bazaar/src/components/ProjectCard/ProjectCard.tsx
+++ b/plugins/bazaar/src/components/ProjectCard/ProjectCard.tsx
@@ -34,7 +34,7 @@ type Props = {
project: BazaarProject;
fetchBazaarProjects: () => Promise;
catalogEntities: Entity[];
- fullHeight?: boolean;
+ height?: string;
};
const useStyles = makeStyles({
@@ -48,7 +48,6 @@ const useStyles = makeStyles({
WebkitLineClamp: 7,
WebkitBoxOrient: 'vertical',
overflow: 'hidden',
- textAlign: 'justify',
},
memberCount: {
float: 'right',
@@ -60,6 +59,7 @@ const useStyles = makeStyles({
whiteSpace: 'nowrap',
overflow: 'hidden',
textOverflow: 'ellipsis',
+ height: '5rem',
},
});
@@ -67,10 +67,11 @@ export const ProjectCard = ({
project,
fetchBazaarProjects,
catalogEntities,
+ height,
}: Props) => {
const classes = useStyles();
const [openCard, setOpenCard] = useState(false);
- const { id, name, status, updatedAt, description, membersCount } = project;
+ const { id, title, status, updatedAt, description, membersCount } = project;
const handleClose = () => {
setOpenCard(false);
@@ -93,7 +94,7 @@ export const ProjectCard = ({
classes={{ root: classes.header }}
title={
- {name}
+ {title}
}
subtitle={`updated ${DateTime.fromISO(
@@ -102,7 +103,7 @@ export const ProjectCard = ({
base: DateTime.now(),
})}`}
/>
-
+
{Number(membersCount) === Number(1)
diff --git a/plugins/bazaar/src/components/ProjectDialog/ProjectDialog.tsx b/plugins/bazaar/src/components/ProjectDialog/ProjectDialog.tsx
index 2f8b9e9cb9..ec7312576d 100644
--- a/plugins/bazaar/src/components/ProjectDialog/ProjectDialog.tsx
+++ b/plugins/bazaar/src/components/ProjectDialog/ProjectDialog.tsx
@@ -89,16 +89,14 @@ export const ProjectDialog = ({
-
@@ -142,7 +140,7 @@ export const ProjectDialog = ({
pattern: RegExp('^(https?)://'),
}}
inputType="community"
- helperText="please enter a link starting with http/https"
+ helperText="Please enter a link starting with http/https"
placeholder="Community link to e.g. Teams or Discord"
/>
diff --git a/plugins/bazaar/src/components/ProjectPreview/ProjectPreview.tsx b/plugins/bazaar/src/components/ProjectPreview/ProjectPreview.tsx
index 7dd82edf94..216cf50c2f 100644
--- a/plugins/bazaar/src/components/ProjectPreview/ProjectPreview.tsx
+++ b/plugins/bazaar/src/components/ProjectPreview/ProjectPreview.tsx
@@ -27,6 +27,7 @@ type Props = {
catalogEntities: Entity[];
useTablePagination?: boolean;
gridSize?: GridSize;
+ height: string;
};
const useStyles = makeStyles({
@@ -55,6 +56,7 @@ export const ProjectPreview = ({
catalogEntities,
useTablePagination = true,
gridSize = 2,
+ height,
}: Props) => {
const classes = useStyles();
const [page, setPage] = useState(1);
@@ -90,6 +92,7 @@ export const ProjectPreview = ({
key={i}
fetchBazaarProjects={fetchBazaarProjects}
catalogEntities={catalogEntities}
+ height={height}
/>
);
diff --git a/plugins/bazaar/src/components/SortView/SortView.tsx b/plugins/bazaar/src/components/SortView/SortView.tsx
index 75f5bbeb34..68b63a6885 100644
--- a/plugins/bazaar/src/components/SortView/SortView.tsx
+++ b/plugins/bazaar/src/components/SortView/SortView.tsx
@@ -27,7 +27,7 @@ import { BazaarProject } from '../../types';
import { bazaarApiRef } from '../../api';
import { Alert } from '@material-ui/lab';
import SearchBar from 'material-ui-search-bar';
-import { sortByDate, sortByMembers, sortByName } from '../../util/sortMethods';
+import { sortByDate, sortByMembers, sortByTitle } from '../../util/sortMethods';
import { SortMethodSelector } from '../SortMethodSelector';
import { fetchCatalogItems } from '../../util/fetchMethods';
import { parseBazaarProject } from '../../util/parseMethods';
@@ -71,7 +71,7 @@ export const SortView = () => {
const bazaarApi = useApi(bazaarApiRef);
const catalogApi = useApi(catalogApiRef);
const classes = useStyles();
- const sortMethods = [sortByDate, sortByName, sortByMembers];
+ const sortMethods = [sortByDate, sortByTitle, sortByMembers];
const [sortMethodNbr, setSortMethodNbr] = useState(0);
const [openAdd, setOpenAdd] = useState(false);
const [searchValue, setSearchValue] = useState('');
@@ -99,7 +99,7 @@ export const SortView = () => {
const getSearchResults = () => {
return bazaarProjects.value
- ?.filter(project => project.name.includes(searchValue))
+ ?.filter(project => project.title.includes(searchValue))
.sort(sortMethods[sortMethodNbr]);
};
@@ -199,6 +199,7 @@ export const SortView = () => {
bazaarProjects={getSearchResults() || []}
fetchBazaarProjects={fetchBazaarProjects}
catalogEntities={unlinkedCatalogEntities || []}
+ height="13rem"
/>
diff --git a/plugins/bazaar/src/types.ts b/plugins/bazaar/src/types.ts
index e698f21264..055ec2fcab 100644
--- a/plugins/bazaar/src/types.ts
+++ b/plugins/bazaar/src/types.ts
@@ -27,7 +27,7 @@ export type Status = 'ongoing' | 'proposed';
export type Size = 'small' | 'medium' | 'large';
export type BazaarProject = {
- name: string;
+ title: string;
id: number;
entityRef?: string;
community: string;
@@ -42,7 +42,7 @@ export type BazaarProject = {
};
export type FormValues = {
- name: string;
+ title: string;
description: string;
community: string;
status: string;
diff --git a/plugins/bazaar/src/util/parseMethods.ts b/plugins/bazaar/src/util/parseMethods.ts
index b32c5d42d3..b93f70c9f1 100644
--- a/plugins/bazaar/src/util/parseMethods.ts
+++ b/plugins/bazaar/src/util/parseMethods.ts
@@ -20,7 +20,7 @@ export const parseBazaarProject = (metadata: any): BazaarProject => {
return {
id: metadata.id,
entityRef: metadata.entity_ref,
- name: metadata.name,
+ title: metadata.title,
community: metadata.community,
description: metadata.description,
status: metadata.status,
diff --git a/plugins/bazaar/src/util/sortMethods.ts b/plugins/bazaar/src/util/sortMethods.ts
index d75639edca..d7ef71c8de 100644
--- a/plugins/bazaar/src/util/sortMethods.ts
+++ b/plugins/bazaar/src/util/sortMethods.ts
@@ -26,10 +26,10 @@ export const sortByDate = (a: BazaarProject, b: BazaarProject): number => {
return dateB - dateA;
};
-export const sortByName = (a: BazaarProject, b: BazaarProject) => {
- if (a.name < b.name) {
+export const sortByTitle = (a: BazaarProject, b: BazaarProject) => {
+ if (a.title < b.title) {
return -1;
- } else if (a.name > b.name) {
+ } else if (a.title > b.title) {
return 1;
}
return 0;
diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md
index e4f0c378d4..672e06f8df 100644
--- a/plugins/bitbucket-cloud-common/CHANGELOG.md
+++ b/plugins/bitbucket-cloud-common/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-bitbucket-cloud-common
+## 0.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.4.1-next.1
+
## 0.2.2-next.0
### Patch Changes
diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json
index 3525bf9a86..d43b716d7f 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.2-next.0",
+ "version": "0.2.2-next.1",
"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 197abb1407..985c3ef123 100644
--- a/plugins/bitrise/CHANGELOG.md
+++ b/plugins/bitrise/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-bitrise
+## 0.1.39-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.39-next.0
### Patch Changes
diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json
index d99340c7c3..f3f40a3767 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.39-next.0",
+ "version": "0.1.39-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md
index 21f146b562..0abb647ca2 100644
--- a/plugins/catalog-backend-module-aws/CHANGELOG.md
+++ b/plugins/catalog-backend-module-aws/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-catalog-backend-module-aws
+## 0.1.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.1.12-next.0
### Patch Changes
diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json
index 293b43da45..7948e3cbde 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.12-next.0",
+ "version": "0.1.12-next.1",
"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 54b3cfc2c6..fd6d29410b 100644
--- a/plugins/catalog-backend-module-azure/CHANGELOG.md
+++ b/plugins/catalog-backend-module-azure/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-catalog-backend-module-azure
+## 0.1.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.1.10-next.0
### Patch Changes
diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json
index d1347f74c5..cabab2eb35 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.10-next.0",
+ "version": "0.1.10-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md
index 5f74571373..47fc6b38c7 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md
+++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-catalog-backend-module-bitbucket-cloud
+## 0.1.6-next.1
+
+### Patch Changes
+
+- 4eb0bce299: Fix repo:push topic not matching `BitbucketCloudEventRouter`.
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/plugin-bitbucket-cloud-common@0.2.2-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
## 0.1.6-next.0
### Patch Changes
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json
index f4d542f843..2aa09b4a64 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.6-next.0",
+ "version": "0.1.6-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -45,7 +45,6 @@
"@backstage/plugin-catalog-common": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
"@backstage/plugin-events-node": "workspace:^",
- "p-limit": "^3.1.0",
"uuid": "^8.0.0",
"winston": "^3.2.1"
},
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts
index 2856a26a13..367e95b99b 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts
@@ -22,11 +22,7 @@ import {
} from '@backstage/backend-tasks';
import { setupRequestMockHandlers } from '@backstage/backend-test-utils';
import { CatalogApi } from '@backstage/catalog-client';
-import {
- Entity,
- LocationEntity,
- stringifyEntityRef,
-} from '@backstage/catalog-model';
+import { Entity, LocationEntity } from '@backstage/catalog-model';
import { ConfigReader } from '@backstage/config';
import {
EntityProviderConnection,
@@ -458,7 +454,6 @@ describe('BitbucketCloudEntityProvider', () => {
items: [keptModule, removedModule],
};
},
- refreshEntity: jest.fn(),
};
const provider = BitbucketCloudEntityProvider.fromConfig(defaultConfig, {
catalogApi: catalogApi as any as CatalogApi,
@@ -557,11 +552,12 @@ describe('BitbucketCloudEntityProvider', () => {
},
];
- expect(catalogApi.refreshEntity).toHaveBeenCalledTimes(1);
- expect(catalogApi.refreshEntity).toHaveBeenCalledWith(
- stringifyEntityRef(keptModule),
- { token: 'fake-token' },
- );
+ expect(entityProviderConnection.refresh).toHaveBeenCalledTimes(1);
+ expect(entityProviderConnection.refresh).toHaveBeenCalledWith({
+ keys: [
+ 'url:https://bitbucket.org/test-ws/test-repo/src/main/kept-module/catalog-custom.yaml',
+ ],
+ });
expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(1);
expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({
type: 'delta',
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts
index 33b92589eb..83b6f447f2 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts
+++ b/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts
@@ -17,11 +17,7 @@
import { TokenManager } from '@backstage/backend-common';
import { PluginTaskScheduler, TaskRunner } from '@backstage/backend-tasks';
import { CatalogApi } from '@backstage/catalog-client';
-import {
- Entity,
- LocationEntity,
- stringifyEntityRef,
-} from '@backstage/catalog-model';
+import { LocationEntity } from '@backstage/catalog-model';
import { Config } from '@backstage/config';
import {
BitbucketCloudIntegration,
@@ -44,7 +40,6 @@ import {
BitbucketCloudEntityProviderConfig,
readProviderConfigs,
} from './BitbucketCloudEntityProviderConfig';
-import limiterFactory from 'p-limit';
import * as uuid from 'uuid';
import { Logger } from 'winston';
@@ -273,9 +268,7 @@ export class BitbucketCloudEntityProvider
),
);
- const limiter = limiterFactory(10);
-
- const stillExisting: Entity[] = [];
+ const stillExisting: LocationEntity[] = [];
const removed: DeferredEntity[] = [];
existing.forEach(item => {
if (targets.find(value => value.fileUrl === item.spec.target)) {
@@ -288,22 +281,20 @@ export class BitbucketCloudEntityProvider
}
});
- const promises: Promise[] = stillExisting.map(entity =>
- limiter(async () =>
- this.catalogApi!.refreshEntity(stringifyEntityRef(entity), { token }),
- ),
- );
+ const promises: Promise[] = [
+ this.connection.refresh({
+ keys: stillExisting.map(entity => `url:${entity.spec.target}`),
+ }),
+ ];
if (added.length > 0 || removed.length > 0) {
const connection = this.connection;
promises.push(
- limiter(async () =>
- connection.applyMutation({
- type: 'delta',
- added: added,
- removed: removed,
- }),
- ),
+ connection.applyMutation({
+ type: 'delta',
+ added: added,
+ removed: removed,
+ }),
);
}
diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md
index 8a8322fc05..0ce053d1df 100644
--- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md
+++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-catalog-backend-module-bitbucket-server
+## 0.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.1.4-next.0
### Patch Changes
diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json
index 162214b9a7..deddc7ec66 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.4-next.0",
+ "version": "0.1.4-next.1",
"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 26299b4bbe..bc0e0902bf 100644
--- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md
+++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-catalog-backend-module-bitbucket
+## 0.2.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-bitbucket-cloud-common@0.2.2-next.1
+
## 0.2.6-next.0
### Patch Changes
diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json
index 445d5d9d3a..6f660ce3f5 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.6-next.0",
+ "version": "0.2.6-next.1",
"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 7a98fd672d..e0f334d57c 100644
--- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md
+++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-catalog-backend-module-gerrit
+## 0.1.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.1.7-next.0
### Patch Changes
diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json
index 3801e104d8..5ebc8481c1 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.7-next.0",
+ "version": "0.1.7-next.1",
"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 cf4e6d4f10..de031b4466 100644
--- a/plugins/catalog-backend-module-github/CHANGELOG.md
+++ b/plugins/catalog-backend-module-github/CHANGELOG.md
@@ -1,5 +1,36 @@
# @backstage/plugin-catalog-backend-module-github
+## 0.2.2-next.1
+
+### Patch Changes
+
+- fe93cce743: Added the githubCredentialsProvider property to the GithubLocationAnalyzerOptions to be able to override the GithubCredentialsProvider.
+- a0fd4af94a: Handle GitHub `push` events at the `GithubEntityProvider` by subscribing to the topic `github.push.`
+
+ Implements `EventSubscriber` to receive events for the topic `github.push`.
+
+ On `github.push`, the affected repository will be refreshed.
+ This includes adding new Location entities, refreshing existing ones,
+ and removing obsolete ones.
+
+ Please find more information at
+ https://backstage.io/docs/integrations/github/discovery#installation-with-events-support
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
## 0.2.2-next.0
### Patch Changes
diff --git a/plugins/catalog-backend-module-github/api-report.md b/plugins/catalog-backend-module-github/api-report.md
index e749549646..8ccfdb09ee 100644
--- a/plugins/catalog-backend-module-github/api-report.md
+++ b/plugins/catalog-backend-module-github/api-report.md
@@ -11,6 +11,8 @@ import { Config } from '@backstage/config';
import { Entity } from '@backstage/catalog-model';
import { EntityProvider } from '@backstage/plugin-catalog-backend';
import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EventParams } from '@backstage/plugin-events-node';
+import { EventSubscriber } from '@backstage/plugin-events-node';
import { GithubCredentialsProvider } from '@backstage/integration';
import { GithubIntegrationConfig } from '@backstage/integration';
import { graphql } from '@octokit/graphql';
@@ -76,7 +78,7 @@ export class GitHubEntityProvider implements EntityProvider {
}
// @public
-export class GithubEntityProvider implements EntityProvider {
+export class GithubEntityProvider implements EntityProvider, EventSubscriber {
// (undocumented)
connect(connection: EntityProviderConnection): Promise;
// (undocumented)
@@ -91,7 +93,11 @@ export class GithubEntityProvider implements EntityProvider {
// (undocumented)
getProviderName(): string;
// (undocumented)
+ onEvent(params: EventParams): Promise;
+ // (undocumented)
refresh(logger: Logger): Promise;
+ // (undocumented)
+ supportsEventTopics(): string[];
}
// @alpha
@@ -122,6 +128,7 @@ export type GithubLocationAnalyzerOptions = {
config: Config;
discovery: PluginEndpointDiscovery;
tokenManager: TokenManager;
+ githubCredentialsProvider?: GithubCredentialsProvider;
};
// @public
diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json
index d6d996068e..15910c030a 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.2-next.0",
+ "version": "0.2.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -42,7 +42,9 @@
"@backstage/errors": "workspace:^",
"@backstage/integration": "workspace:^",
"@backstage/plugin-catalog-backend": "workspace:^",
+ "@backstage/plugin-catalog-common": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
+ "@backstage/plugin-events-node": "workspace:^",
"@backstage/types": "workspace:^",
"@octokit/graphql": "^5.0.0",
"@octokit/rest": "^19.0.3",
diff --git a/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.ts b/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.ts
index a740fd7706..139a92ee83 100644
--- a/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.ts
+++ b/plugins/catalog-backend-module-github/src/analyzers/GithubLocationAnalyzer.ts
@@ -39,6 +39,7 @@ export type GithubLocationAnalyzerOptions = {
config: Config;
discovery: PluginEndpointDiscovery;
tokenManager: TokenManager;
+ githubCredentialsProvider?: GithubCredentialsProvider;
};
/** @public */
@@ -52,6 +53,7 @@ export class GithubLocationAnalyzer implements ScmLocationAnalyzer {
this.catalogClient = new CatalogClient({ discoveryApi: options.discovery });
this.integrations = ScmIntegrations.fromConfig(options.config);
this.githubCredentialsProvider =
+ options.githubCredentialsProvider ||
DefaultGithubCredentialsProvider.fromIntegrations(this.integrations);
this.tokenManager = options.tokenManager;
}
diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts
index cc9a9bfee3..a41404ad9a 100644
--- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts
@@ -24,6 +24,7 @@ import { ConfigReader } from '@backstage/config';
import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
import { GithubEntityProvider } from './GithubEntityProvider';
import * as helpers from '../lib/github';
+import { EventParams } from '@backstage/plugin-events-node';
jest.mock('../lib/github', () => {
return {
@@ -716,4 +717,392 @@ describe('GithubEntityProvider', () => {
expect(providers).toHaveLength(1);
expect(providers[0].getProviderName()).toEqual('github-provider:default');
});
+
+ it('apply delta update on added files from push event', async () => {
+ const schedule = new PersistingTaskRunner();
+ const config = new ConfigReader({
+ catalog: {
+ providers: {
+ github: {
+ organization: 'test-org',
+ },
+ },
+ },
+ });
+
+ const provider = GithubEntityProvider.fromConfig(config, {
+ logger,
+ schedule,
+ })[0];
+
+ const entityProviderConnection: EntityProviderConnection = {
+ applyMutation: jest.fn(),
+ refresh: jest.fn(),
+ };
+ await provider.connect(entityProviderConnection);
+
+ const event: EventParams = {
+ topic: 'github.push',
+ metadata: {
+ 'x-github-event': 'push',
+ },
+ eventPayload: {
+ ref: 'refs/heads/main',
+ repository: {
+ name: 'teste-1',
+ url: 'https://github.com/test-org/test-repo',
+ default_branch: 'main',
+ stargazers: 0,
+ master_branch: 'main',
+ organization: 'test-org',
+ topics: [],
+ },
+ created: true,
+ deleted: false,
+ forced: false,
+ commits: [
+ {
+ added: ['new-file.yaml'],
+ removed: [],
+ modified: [],
+ },
+ {
+ added: ['catalog-info.yaml'],
+ removed: [],
+ modified: [],
+ },
+ ],
+ },
+ };
+ const url =
+ 'https://github.com/test-org/test-repo/blob/main/catalog-info.yaml';
+ const expectedEntities = [
+ {
+ entity: {
+ apiVersion: 'backstage.io/v1alpha1',
+ kind: 'Location',
+ metadata: {
+ annotations: {
+ 'backstage.io/managed-by-location': `url:${url}`,
+ 'backstage.io/managed-by-origin-location': `url:${url}`,
+ },
+ name: 'generated-8688630f57e421bc85f12b9828ed7dad6aff3bb3',
+ },
+ spec: {
+ presence: 'optional',
+ target: `${url}`,
+ type: 'url',
+ },
+ },
+ locationKey: 'github-provider:default',
+ },
+ ];
+
+ await provider.onEvent(event);
+
+ expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(1);
+ expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({
+ type: 'delta',
+ added: expectedEntities,
+ removed: [],
+ });
+ });
+
+ it('apply delta update on removed files from push event', async () => {
+ const schedule = new PersistingTaskRunner();
+ const config = new ConfigReader({
+ catalog: {
+ providers: {
+ github: {
+ organization: 'test-org',
+ },
+ },
+ },
+ });
+
+ const provider = GithubEntityProvider.fromConfig(config, {
+ logger,
+ schedule,
+ })[0];
+
+ const entityProviderConnection: EntityProviderConnection = {
+ applyMutation: jest.fn(),
+ refresh: jest.fn(),
+ };
+ await provider.connect(entityProviderConnection);
+
+ const event: EventParams = {
+ topic: 'github.push',
+ metadata: {
+ 'x-github-event': 'push',
+ },
+ eventPayload: {
+ ref: 'refs/heads/main',
+ repository: {
+ name: 'teste-1',
+ url: 'https://github.com/test-org/test-repo',
+ default_branch: 'main',
+ stargazers: 0,
+ master_branch: 'main',
+ organization: 'test-org',
+ topics: [],
+ },
+ created: true,
+ deleted: false,
+ forced: false,
+ commits: [
+ {
+ added: ['new-file.yaml'],
+ removed: [],
+ modified: [],
+ },
+ {
+ added: [],
+ removed: ['catalog-info.yaml'],
+ modified: [],
+ },
+ ],
+ },
+ };
+ const url =
+ 'https://github.com/test-org/test-repo/blob/main/catalog-info.yaml';
+ const expectedEntities = [
+ {
+ entity: {
+ apiVersion: 'backstage.io/v1alpha1',
+ kind: 'Location',
+ metadata: {
+ annotations: {
+ 'backstage.io/managed-by-location': `url:${url}`,
+ 'backstage.io/managed-by-origin-location': `url:${url}`,
+ },
+ name: 'generated-8688630f57e421bc85f12b9828ed7dad6aff3bb3',
+ },
+ spec: {
+ presence: 'optional',
+ target: `${url}`,
+ type: 'url',
+ },
+ },
+ locationKey: 'github-provider:default',
+ },
+ ];
+
+ await provider.onEvent(event);
+
+ expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(1);
+ expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({
+ type: 'delta',
+ added: [],
+ removed: expectedEntities,
+ });
+ });
+
+ it('apply refresh call on modified files from push event', async () => {
+ const schedule = new PersistingTaskRunner();
+ const config = new ConfigReader({
+ catalog: {
+ providers: {
+ github: {
+ organization: 'test-org',
+ },
+ },
+ },
+ });
+
+ const provider = GithubEntityProvider.fromConfig(config, {
+ logger,
+ schedule,
+ })[0];
+
+ const entityProviderConnection: EntityProviderConnection = {
+ applyMutation: jest.fn(),
+ refresh: jest.fn(),
+ };
+ await provider.connect(entityProviderConnection);
+
+ const event: EventParams = {
+ topic: 'github.push',
+ metadata: {
+ 'x-github-event': 'push',
+ },
+ eventPayload: {
+ ref: 'refs/heads/main',
+ repository: {
+ name: 'teste-1',
+ url: 'https://github.com/test-org/test-repo',
+ default_branch: 'main',
+ stargazers: 0,
+ master_branch: 'main',
+ organization: 'test-org',
+ topics: [],
+ },
+ created: true,
+ deleted: false,
+ forced: false,
+ commits: [
+ {
+ added: ['new-file.yaml'],
+ removed: [],
+ modified: [],
+ },
+ {
+ added: [],
+ removed: [],
+ modified: ['catalog-info.yaml'],
+ },
+ ],
+ },
+ };
+
+ await provider.onEvent(event);
+
+ expect(entityProviderConnection.refresh).toHaveBeenCalledTimes(1);
+ expect(entityProviderConnection.refresh).toHaveBeenCalledWith({
+ keys: [
+ 'url:https://github.com/test-org/test-repo/tree/main/catalog-info.yaml',
+ 'url:https://github.com/test-org/test-repo/blob/main/catalog-info.yaml',
+ ],
+ });
+ expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(0);
+ });
+
+ it('should process repository when match filters from push event', async () => {
+ const schedule = new PersistingTaskRunner();
+ const config = new ConfigReader({
+ catalog: {
+ providers: {
+ github: {
+ organization: 'test-org',
+ filters: {
+ branch: 'my-special-branch',
+ repository: 'test-repo',
+ },
+ },
+ },
+ },
+ });
+
+ const provider = GithubEntityProvider.fromConfig(config, {
+ logger,
+ schedule,
+ })[0];
+
+ const entityProviderConnection: EntityProviderConnection = {
+ applyMutation: jest.fn(),
+ refresh: jest.fn(),
+ };
+ await provider.connect(entityProviderConnection);
+
+ const event: EventParams = {
+ topic: 'github.push',
+ metadata: {
+ 'x-github-event': 'push',
+ },
+ eventPayload: {
+ ref: 'refs/heads/my-special-branch',
+ repository: {
+ name: 'test-repo',
+ url: 'https://github.com/test-org/test-repo',
+ default_branch: 'main',
+ stargazers: 0,
+ master_branch: 'main',
+ organization: 'test-org',
+ topics: [],
+ },
+ created: true,
+ deleted: false,
+ forced: false,
+ commits: [
+ {
+ added: ['new-file.yaml'],
+ removed: [],
+ modified: [],
+ },
+ {
+ added: [],
+ removed: [],
+ modified: ['catalog-info.yaml'],
+ },
+ ],
+ },
+ };
+
+ await provider.onEvent(event);
+
+ expect(entityProviderConnection.refresh).toHaveBeenCalledTimes(1);
+ expect(entityProviderConnection.refresh).toHaveBeenCalledWith({
+ keys: [
+ 'url:https://github.com/test-org/test-repo/tree/my-special-branch/catalog-info.yaml',
+ 'url:https://github.com/test-org/test-repo/blob/my-special-branch/catalog-info.yaml',
+ ],
+ });
+ expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(0);
+ });
+
+ it("should skip process when didn't match filters from push event", async () => {
+ const schedule = new PersistingTaskRunner();
+ const config = new ConfigReader({
+ catalog: {
+ providers: {
+ github: {
+ organization: 'test-org',
+ filters: {
+ repository: 'only-special-repository',
+ },
+ },
+ },
+ },
+ });
+
+ const provider = GithubEntityProvider.fromConfig(config, {
+ logger,
+ schedule,
+ })[0];
+
+ const entityProviderConnection: EntityProviderConnection = {
+ applyMutation: jest.fn(),
+ refresh: jest.fn(),
+ };
+ await provider.connect(entityProviderConnection);
+
+ const event: EventParams = {
+ topic: 'github.push',
+ metadata: {
+ 'x-github-event': 'push',
+ },
+ eventPayload: {
+ ref: 'refs/heads/main',
+ repository: {
+ name: 'teste-1',
+ url: 'https://github.com/test-org/test-repo',
+ default_branch: 'main',
+ stargazers: 0,
+ master_branch: 'main',
+ organization: 'test-org',
+ topics: [],
+ },
+ created: true,
+ deleted: false,
+ forced: false,
+ commits: [
+ {
+ added: ['new-file.yaml'],
+ removed: [],
+ modified: [],
+ },
+ {
+ added: [],
+ removed: [],
+ modified: ['catalog-info.yaml'],
+ },
+ ],
+ },
+ };
+
+ await provider.onEvent(event);
+
+ expect(entityProviderConnection.refresh).toHaveBeenCalledTimes(0);
+ expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(0);
+ });
});
diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts
index 9a75f52afa..8816d8ee80 100644
--- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts
+++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts
@@ -24,12 +24,14 @@ import {
SingleInstanceGithubCredentialsProvider,
} from '@backstage/integration';
import {
+ DeferredEntity,
EntityProvider,
EntityProviderConnection,
- LocationSpec,
locationSpecToLocationEntity,
} from '@backstage/plugin-catalog-backend';
+import { LocationSpec } from '@backstage/plugin-catalog-common';
+
import { graphql } from '@octokit/graphql';
import * as uuid from 'uuid';
import { Logger } from 'winston';
@@ -37,9 +39,23 @@ import {
readProviderConfigs,
GithubEntityProviderConfig,
} from './GithubEntityProviderConfig';
-import { getOrganizationRepositories, RepositoryResponse } from '../lib/github';
+import { getOrganizationRepositories } from '../lib/github';
import { satisfiesTopicFilter } from '../lib/util';
+import { EventParams, EventSubscriber } from '@backstage/plugin-events-node';
+import { PushEvent, Commit } from '@octokit/webhooks-types';
+
+const TOPIC_REPO_PUSH = 'github.push';
+
+type Repository = {
+ name: string;
+ url: string;
+ isArchived: boolean;
+ repositoryTopics: string[];
+ defaultBranchRef?: string;
+ isCatalogInfoFilePresent: boolean;
+};
+
/**
* Discovers catalog files located in [GitHub](https://github.com).
* The provider will search your GitHub account and register catalog files matching the configured path
@@ -48,7 +64,7 @@ import { satisfiesTopicFilter } from '../lib/util';
*
* @public
*/
-export class GithubEntityProvider implements EntityProvider {
+export class GithubEntityProvider implements EntityProvider, EventSubscriber {
private readonly config: GithubEntityProviderConfig;
private readonly logger: Logger;
private readonly integration: GithubIntegrationConfig;
@@ -175,7 +191,7 @@ export class GithubEntityProvider implements EntityProvider {
}
// go to the server and get all of the repositories
- private async findCatalogFiles(): Promise {
+ private async findCatalogFiles(): Promise {
const organization = this.config.organization;
const host = this.integration.host;
const catalogPath = this.config.catalogPath;
@@ -190,45 +206,49 @@ export class GithubEntityProvider implements EntityProvider {
headers,
});
- const { repositories } = await getOrganizationRepositories(
- client,
- organization,
- catalogPath,
- );
+ const { repositories: repositoriesFromGithub } =
+ await getOrganizationRepositories(client, organization, catalogPath);
+ const repositories = repositoriesFromGithub.map(r => {
+ return {
+ url: r.url,
+ name: r.name,
+ defaultBranchRef: r.defaultBranchRef?.name,
+ repositoryTopics: r.repositoryTopics.nodes.map(t => t.topic.name),
+ isArchived: r.isArchived,
+ isCatalogInfoFilePresent:
+ r.catalogInfoFile?.__typename === 'Blob' &&
+ r.catalogInfoFile.text !== '',
+ };
+ });
if (this.config.validateLocationsExist) {
- return repositories.filter(repository => {
- return (
- repository.catalogInfoFile?.__typename === 'Blob' &&
- repository.catalogInfoFile.text !== ''
- );
- });
+ return repositories.filter(
+ repository => repository.isCatalogInfoFilePresent,
+ );
}
return repositories;
}
- private matchesFilters(repositories: RepositoryResponse[]) {
+ private matchesFilters(repositories: Repository[]) {
const repositoryFilter = this.config.filters?.repository;
const topicFilters = this.config.filters?.topic;
const matchingRepositories = repositories.filter(r => {
- const repoTopics: string[] = r.repositoryTopics.nodes.map(
- node => node.topic.name,
- );
+ const repoTopics: string[] = r.repositoryTopics;
return (
!r.isArchived &&
(!repositoryFilter || repositoryFilter.test(r.name)) &&
satisfiesTopicFilter(repoTopics, topicFilters) &&
- r.defaultBranchRef?.name
+ r.defaultBranchRef
);
});
return matchingRepositories;
}
- private createLocationUrl(repository: RepositoryResponse): string {
+ private createLocationUrl(repository: Repository): string {
const branch =
- this.config.filters?.branch || repository.defaultBranchRef?.name || '-';
+ this.config.filters?.branch || repository.defaultBranchRef || '-';
const catalogFile = this.config.catalogPath.startsWith('/')
? this.config.catalogPath.substring(1)
: this.config.catalogPath;
@@ -242,6 +262,151 @@ export class GithubEntityProvider implements EntityProvider {
presence: 'optional',
};
}
+
+ /** {@inheritdoc @backstage/plugin-events-node#EventSubscriber.onEvent} */
+ async onEvent(params: EventParams): Promise {
+ this.logger.debug(`Received event from ${params.topic}`);
+ if (params.topic !== TOPIC_REPO_PUSH) {
+ return;
+ }
+
+ await this.onRepoPush(params.eventPayload as PushEvent);
+ }
+
+ /** {@inheritdoc @backstage/plugin-events-node#EventSubscriber.supportsEventTopics} */
+ supportsEventTopics(): string[] {
+ return [TOPIC_REPO_PUSH];
+ }
+
+ private async onRepoPush(event: PushEvent) {
+ if (!this.connection) {
+ throw new Error('Not initialized');
+ }
+
+ const repoName = event.repository.name;
+ const repoUrl = event.repository.url;
+ this.logger.debug(`handle github:push event for ${repoName} - ${repoUrl}`);
+
+ const branch =
+ this.config.filters?.branch || event.repository.default_branch;
+
+ if (!event.ref.includes(branch)) {
+ this.logger.debug(`skipping push event from ref ${event.ref}`);
+ return;
+ }
+
+ const repository: Repository = {
+ url: event.repository.url,
+ name: event.repository.name,
+ defaultBranchRef: event.repository.default_branch,
+ repositoryTopics: event.repository.topics,
+ isArchived: event.repository.archived,
+ // we can consider this file present because
+ // only the catalog file will be recovered from the commits
+ isCatalogInfoFilePresent: true,
+ };
+
+ const matchingTargets = this.matchesFilters([repository]);
+ if (matchingTargets.length === 0) {
+ this.logger.debug(
+ `skipping push event from repository ${repoName} because didn't match provider filters`,
+ );
+ return;
+ }
+
+ // the commit has information about the files (added,removed,modified)
+ // so we will process the change based in this data
+ // https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#push
+ const added = this.collectDeferredEntitiesFromCommit(
+ event.repository.url,
+ branch,
+ event.commits,
+ (commit: Commit) => [...commit.added],
+ );
+ const removed = this.collectDeferredEntitiesFromCommit(
+ event.repository.url,
+ branch,
+ event.commits,
+ (commit: Commit) => [...commit.removed],
+ );
+ const modified = this.collectFilesFromCommit(
+ event.commits,
+ (commit: Commit) => [...commit.modified],
+ );
+
+ if (modified.length > 0) {
+ await this.connection.refresh({
+ keys: [
+ ...modified.map(
+ filePath =>
+ `url:${event.repository.url}/tree/${branch}/${filePath}`,
+ ),
+ ...modified.map(
+ filePath =>
+ `url:${event.repository.url}/blob/${branch}/${filePath}`,
+ ),
+ ],
+ });
+ }
+
+ if (added.length > 0 || removed.length > 0) {
+ await this.connection.applyMutation({
+ type: 'delta',
+ added: added,
+ removed: removed,
+ });
+ }
+
+ this.logger.info(
+ `Processed Github push event: added ${added.length} - removed ${removed.length} - modified ${modified.length}`,
+ );
+ }
+
+ private collectDeferredEntitiesFromCommit(
+ repositoryUrl: string,
+ branch: string,
+ commits: Commit[],
+ transformOperation: (commit: Commit) => string[],
+ ): DeferredEntity[] {
+ const catalogFiles = this.collectFilesFromCommit(
+ commits,
+ transformOperation,
+ );
+ return this.toDeferredEntities(
+ catalogFiles.map(
+ filePath => `${repositoryUrl}/blob/${branch}/${filePath}`,
+ ),
+ );
+ }
+
+ private collectFilesFromCommit(
+ commits: Commit[],
+ transformOperation: (commit: Commit) => string[],
+ ): string[] {
+ const catalogFile = this.config.catalogPath.startsWith('/')
+ ? this.config.catalogPath.substring(1)
+ : this.config.catalogPath;
+
+ return commits
+ .map(transformOperation)
+ .flat()
+ .filter(file => catalogFile.includes(file));
+ }
+
+ private toDeferredEntities(targets: string[]): DeferredEntity[] {
+ return targets
+ .map(target => {
+ const location = GithubEntityProvider.toLocationSpec(target);
+
+ return locationSpecToLocationEntity({ location });
+ })
+ .map(entity => {
+ return {
+ locationKey: this.getProviderName(),
+ entity: entity,
+ };
+ });
+ }
}
/*
diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md
index 4a05021ba9..6fe5cca4bf 100644
--- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md
+++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-catalog-backend-module-gitlab
+## 0.1.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.1.10-next.0
### Patch Changes
diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json
index 30bb37d8e3..227528f416 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.10-next.0",
+ "version": "0.1.10-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md
new file mode 100644
index 0000000000..3780f8a826
--- /dev/null
+++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md
@@ -0,0 +1,31 @@
+# @backstage/plugin-catalog-backend-module-incremental-ingestion
+
+## 0.1.0-next.0
+
+### Minor Changes
+
+- 98c643a1a2: Introduces incremental entity providers, which are used for streaming very large data sources into the catalog.
+
+### Patch Changes
+
+- de8a975911: Changed to use native `AbortController` and `AbortSignal` from Node.js, instead
+ of the one from `node-abort-controller`. This is possible now that the minimum
+ supported Node.js version of the project is 16.
+
+ Note that their interfaces are very slightly different, but typically not in a
+ way that matters to consumers. If you see any typescript errors as a direct
+ result from this, they are compatible with each other in the ways that we
+ interact with them, and should be possible to type-cast across without ill
+ effects.
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/backend-test-utils@0.1.31-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json
index eb68439901..721dc7c69a 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.0.0",
+ "version": "0.1.0-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts
index d64c1318ac..5d82a29b5f 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts
+++ b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts
@@ -17,7 +17,6 @@
import type { DeferredEntity } from '@backstage/plugin-catalog-backend';
import { IterationEngine, IterationEngineOptions } from '../types';
import { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';
-import type { AbortSignal } from 'node-abort-controller';
import { performance } from 'perf_hooks';
import { Duration, DurationObjectUnits } from 'luxon';
import { v4 } from 'uuid';
diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md
index 495b405511..26d07f3e42 100644
--- a/plugins/catalog-backend-module-ldap/CHANGELOG.md
+++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-catalog-backend-module-ldap
+## 0.5.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.5.6-next.0
### Patch Changes
diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json
index a40ff4dd17..c8eb6f3e6c 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.6-next.0",
+ "version": "0.5.6-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md
index 3e0de34927..86be820832 100644
--- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md
+++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-catalog-backend-module-msgraph
+## 0.4.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
## 0.4.5-next.0
### Patch Changes
diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json
index 75a5beee56..42be4c88fe 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.4.5-next.0",
+ "version": "0.4.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md
index b16946fd7a..9251286f38 100644
--- a/plugins/catalog-backend-module-openapi/CHANGELOG.md
+++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-catalog-backend-module-openapi
+## 0.1.5-next.1
+
+### Patch Changes
+
+- dd995cdc72: Enabled support of resolving `$refs` in all kind of yaml documents, not only OpenAPI. This implicitly adds `$ref` resolving support for AsyncAPI specs. Thus, the `openApiPlaceholderResolver` has been renamed to `jsonSchemaRefPlaceholderResolver`.
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
## 0.1.5-next.0
### Patch Changes
diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json
index 1af84d3db7..3f7ae47930 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.5-next.0",
+ "version": "0.1.5-next.1",
"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 4354b0b7b4..601e61f06d 100644
--- a/plugins/catalog-backend/CHANGELOG.md
+++ b/plugins/catalog-backend/CHANGELOG.md
@@ -1,5 +1,53 @@
# @backstage/plugin-catalog-backend
+## 1.6.0-next.1
+
+### Minor Changes
+
+- c395abb5b2: The catalog no longer stops after the first processor `validateEntityKind`
+ method returns `true` when validating entity kind shapes. Instead, it continues
+ through all registered processors that have this method, and requires that _at
+ least one_ of them returned true.
+
+ The old behavior of stopping early made it harder to extend existing core kinds
+ with additional fields, since the `BuiltinKindsEntityProcessor` is always
+ present at the top of the processing chain and ensures that your additional
+ validation code would never be run.
+
+ This is technically a breaking change, although it should not affect anybody
+ under normal circumstances, except if you had problematic validation code that
+ you were unaware that it was not being run. That code may now start to exhibit
+ those problems.
+
+ If you need to disable this new behavior, `CatalogBuilder` as used in your
+ `packages/backend/src/plugins/catalog.ts` file now has a
+ `useLegacySingleProcessorValidation()` method to go back to the old behavior.
+
+ ```diff
+ const builder = await CatalogBuilder.create(env);
+ +builder.useLegacySingleProcessorValidation();
+ ```
+
+### Patch Changes
+
+- 2a8e3cc0b5: Optimize `Stitcher` process to be more memory efficient
+- 5b3e2afa45: Fixed deprecated use of `substr` into `substring`.
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/plugin-permission-node@0.7.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-scaffolder-common@1.2.3-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 1.6.0-next.0
### Minor Changes
diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md
index e5d464c29a..a46abda5d3 100644
--- a/plugins/catalog-backend/api-report.md
+++ b/plugins/catalog-backend/api-report.md
@@ -133,7 +133,7 @@ export class CatalogBuilder {
...permissionRules: Array<
CatalogPermissionRule | Array
>
- ): void;
+ ): this;
addProcessor(
...processors: Array>
): CatalogBuilder;
@@ -164,6 +164,7 @@ export class CatalogBuilder {
errors: Error[];
}) => Promise | void;
}): void;
+ useLegacySingleProcessorValidation(): this;
}
// @alpha
diff --git a/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js b/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js
new file mode 100644
index 0000000000..258af5ef06
--- /dev/null
+++ b/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ */
+
+/**
+ * @param { import("knex").Knex } knex
+ */
+exports.up = async function up(knex) {
+ // Start out with an original_value column that's equal to the value column
+ await knex.schema.alterTable('search', table => {
+ table
+ .string('original_value')
+ .nullable()
+ .comment('Holds the corresponding original case sensitive value');
+ });
+ await knex('search').update({ original_value: knex.ref('value') });
+
+ // Make sure to reprocess everything, to make sure that the original_value
+ // column is populated with values with the proper casing. It's unfortunately
+ // not enough to just reset the final_entities hash, since stitching is driven
+ // only by processing resulting in data that isn't matching the refresh_state
+ // hash.
+ await knex('refresh_state').update({
+ result_hash: '',
+ next_update_at: knex.fn.now(),
+ });
+ await knex('final_entities').update({ hash: '' });
+};
+
+/**
+ * @param { import("knex").Knex } knex
+ */
+exports.down = async function down(knex) {
+ await knex.schema.alterTable('search', table => {
+ table.dropColumn('original_value');
+ });
+};
diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json
index ea61ca648e..4d1b5fbefd 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.6.0-next.0",
+ "version": "1.6.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts
index 46b327733d..f766589fe7 100644
--- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts
+++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts
@@ -991,13 +991,7 @@ describe('Default Processing Database', () => {
added: [],
removed: [
{
- entity: {
- apiVersion: '1.0.0',
- metadata: {
- name: 'new-root',
- },
- kind: 'Location',
- } as Entity,
+ entityRef: 'location:default/new-root',
locationKey: 'file:/tmp/foobar',
},
],
diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts
index 3dc5325178..4a30ecaec6 100644
--- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts
+++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts
@@ -737,7 +737,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase {
deferred: e,
hash: generateStableHash(e.entity),
})),
- toRemove: options.removed.map(e => stringifyEntityRef(e.entity)),
+ toRemove: options.removed.map(e => e.entityRef),
};
}
diff --git a/plugins/catalog-backend/src/database/tables.ts b/plugins/catalog-backend/src/database/tables.ts
index b9fe12be11..c23753b267 100644
--- a/plugins/catalog-backend/src/database/tables.ts
+++ b/plugins/catalog-backend/src/database/tables.ts
@@ -71,5 +71,6 @@ export type DbFinalEntitiesRow = {
export type DbSearchRow = {
entity_id: string;
key: string;
+ original_value: string | null;
value: string | null;
};
diff --git a/plugins/catalog-backend/src/database/types.ts b/plugins/catalog-backend/src/database/types.ts
index 2d30f8bd86..345aee6ebd 100644
--- a/plugins/catalog-backend/src/database/types.ts
+++ b/plugins/catalog-backend/src/database/types.ts
@@ -81,7 +81,7 @@ export type ReplaceUnprocessedEntitiesOptions =
| {
sourceKey: string;
added: DeferredEntity[];
- removed: DeferredEntity[];
+ removed: { entityRef: string; locationKey?: string }[];
type: 'delta';
};
diff --git a/plugins/catalog-backend/src/integration.test.ts b/plugins/catalog-backend/src/integration.test.ts
index dcfe9a1489..a63119bb67 100644
--- a/plugins/catalog-backend/src/integration.test.ts
+++ b/plugins/catalog-backend/src/integration.test.ts
@@ -245,6 +245,7 @@ class TestHarness {
logger,
parser: defaultEntityDataParser,
policy: EntityPolicies.allOf([]),
+ legacySingleProcessorValidation: false,
});
const stitcher = new Stitcher(db, logger);
const catalog = new DefaultEntitiesCatalog(db, stitcher);
diff --git a/plugins/catalog-backend/src/modules/core/PlaceholderProcessor.ts b/plugins/catalog-backend/src/modules/core/PlaceholderProcessor.ts
index ec432c5fdc..79fcee960c 100644
--- a/plugins/catalog-backend/src/modules/core/PlaceholderProcessor.ts
+++ b/plugins/catalog-backend/src/modules/core/PlaceholderProcessor.ts
@@ -107,7 +107,7 @@ export class PlaceholderProcessor implements CatalogProcessor {
return [data, false];
}
- const resolverKey = keys[0].substr(1);
+ const resolverKey = keys[0].substring(1);
const resolverValue = data[keys[0]];
const resolver = this.options.resolvers[resolverKey];
diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts
index cbb130d138..9731022582 100644
--- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts
+++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts
@@ -97,6 +97,7 @@ describe('DefaultCatalogProcessingOrchestrator', () => {
parser: defaultEntityDataParser,
policy: EntityPolicies.allOf([]),
rulesEnforcer: { isAllowed: () => true },
+ legacySingleProcessorValidation: false,
});
it('runs a minimal processing', async () => {
@@ -190,6 +191,54 @@ describe('DefaultCatalogProcessingOrchestrator', () => {
ok: true,
});
});
+
+ it('runs all processor validations when asked to', async () => {
+ const validate = jest.fn(async () => true);
+ const processor1: Partial = {
+ validateEntityKind: validate,
+ };
+ const processor2: Partial = {
+ validateEntityKind: validate,
+ };
+
+ const legacy = new DefaultCatalogProcessingOrchestrator({
+ processors: [
+ processor1 as CatalogProcessor,
+ processor2 as CatalogProcessor,
+ ],
+ integrations: ScmIntegrations.fromConfig(new ConfigReader({})),
+ logger: getVoidLogger(),
+ parser: defaultEntityDataParser,
+ policy: EntityPolicies.allOf([]),
+ rulesEnforcer: { isAllowed: () => true },
+ legacySingleProcessorValidation: true,
+ });
+
+ const modern = new DefaultCatalogProcessingOrchestrator({
+ processors: [
+ processor1 as CatalogProcessor,
+ processor2 as CatalogProcessor,
+ ],
+ integrations: ScmIntegrations.fromConfig(new ConfigReader({})),
+ logger: getVoidLogger(),
+ parser: defaultEntityDataParser,
+ policy: EntityPolicies.allOf([]),
+ rulesEnforcer: { isAllowed: () => true },
+ legacySingleProcessorValidation: false,
+ });
+
+ await expect(legacy.process({ entity })).resolves.toMatchObject({
+ ok: true,
+ });
+ expect(validate).toHaveBeenCalledTimes(1);
+
+ validate.mockClear();
+
+ await expect(modern.process({ entity })).resolves.toMatchObject({
+ ok: true,
+ });
+ expect(validate).toHaveBeenCalledTimes(2);
+ });
});
describe('rules', () => {
@@ -231,6 +280,7 @@ describe('DefaultCatalogProcessingOrchestrator', () => {
parser,
policy: EntityPolicies.allOf([]),
rulesEnforcer,
+ legacySingleProcessorValidation: false,
});
rulesEnforcer.isAllowed.mockReturnValueOnce(true);
@@ -272,6 +322,7 @@ describe('DefaultCatalogProcessingOrchestrator', () => {
parser,
policy: EntityPolicies.allOf([new FailingEntityPolicy()]),
rulesEnforcer,
+ legacySingleProcessorValidation: false,
});
await expect(
diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts
index e95fede8b7..339469ff1d 100644
--- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts
+++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts
@@ -76,6 +76,7 @@ export class DefaultCatalogProcessingOrchestrator
parser: CatalogProcessorParser;
policy: EntityPolicy;
rulesEnforcer: CatalogRulesEnforcer;
+ legacySingleProcessorValidation: boolean;
},
) {}
@@ -253,19 +254,17 @@ export class DefaultCatalogProcessingOrchestrator
);
}
- let foundKind = false;
+ let valid = false;
for (const processor of this.options.processors) {
if (processor.validateEntityKind) {
try {
- foundKind = await processor.validateEntityKind(entity);
- if (foundKind) {
- // TODO(freben): It would make sense to keep running, so that
- // multiple processors could have a go at making checks. For
- // example, an org may want to add additional rules on top of the
- // provided ones. But that would be a breaking change, so we'll
- // postpone that to a future processors rewrite.
- break;
+ const thisValid = await processor.validateEntityKind(entity);
+ if (thisValid) {
+ valid = true;
+ if (this.options.legacySingleProcessorValidation) {
+ break;
+ }
}
} catch (e) {
throw new InputError(
@@ -276,7 +275,7 @@ export class DefaultCatalogProcessingOrchestrator
}
}
- if (!foundKind) {
+ if (!valid) {
throw new InputError(
`No processor recognized the entity ${context.entityRef} as valid, possibly caused by a foreign kind or apiVersion`,
);
diff --git a/plugins/catalog-backend/src/processing/connectEntityProviders.ts b/plugins/catalog-backend/src/processing/connectEntityProviders.ts
index a4795532f0..3eb638ce7a 100644
--- a/plugins/catalog-backend/src/processing/connectEntityProviders.ts
+++ b/plugins/catalog-backend/src/processing/connectEntityProviders.ts
@@ -17,6 +17,7 @@
import {
Entity,
entityEnvelopeSchemaValidator,
+ stringifyEntityRef,
} from '@backstage/catalog-model';
import { ProcessingDatabase } from '../database/types';
import {
@@ -50,13 +51,24 @@ class Connection implements EntityProviderConnection {
});
} else if (mutation.type === 'delta') {
this.check(mutation.added.map(e => e.entity));
- this.check(mutation.removed.map(e => e.entity));
+ this.check(
+ mutation.removed
+ .map(e => ('entity' in e ? e.entity : undefined))
+ .filter((e): e is Entity => Boolean(e)),
+ );
await db.transaction(async tx => {
await db.replaceUnprocessedEntities(tx, {
sourceKey: this.config.id,
type: 'delta',
added: mutation.added,
- removed: mutation.removed,
+ removed: mutation.removed.map(r =>
+ 'entityRef' in r
+ ? r
+ : {
+ entityRef: stringifyEntityRef(r.entity),
+ locationKey: r.locationKey,
+ },
+ ),
});
});
}
diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.test.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.test.ts
index 5fc8ca6fbf..8b4e5601b4 100644
--- a/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.test.ts
+++ b/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.test.ts
@@ -114,14 +114,14 @@ describe('DefaultCatalogCollatorFactory', () => {
});
it('fetches from the configured catalog service', async () => {
- const pipeline = TestPipeline.withSubject(collator);
+ const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
expect(mockDiscoveryApi.getBaseUrl).toHaveBeenCalledWith('catalog');
expect(documents).toHaveLength(expectedEntities.length);
});
it('maps a returned entity to an expected CatalogEntityDocument', async () => {
- const pipeline = TestPipeline.withSubject(collator);
+ const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
expect(documents[0]).toMatchObject({
@@ -159,7 +159,7 @@ describe('DefaultCatalogCollatorFactory', () => {
});
collator = await factory.getCollator();
- const pipeline = TestPipeline.withSubject(collator);
+ const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
expect(documents[0]).toMatchObject({
location: '/software/test-entity',
@@ -177,7 +177,7 @@ describe('DefaultCatalogCollatorFactory', () => {
});
collator = await factory.getCollator();
- const pipeline = TestPipeline.withSubject(collator);
+ const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
// The simulated 'Foo,Bar' filter should return in an empty list
@@ -191,7 +191,7 @@ describe('DefaultCatalogCollatorFactory', () => {
});
collator = await factory.getCollator();
- const pipeline = TestPipeline.withSubject(collator);
+ const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
expect(documents).toHaveLength(expectedEntities.length);
diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts
index d5bc7057dd..8aab74c4ba 100644
--- a/plugins/catalog-backend/src/service/CatalogBuilder.ts
+++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts
@@ -154,6 +154,7 @@ export class CatalogBuilder {
private locationAnalyzer: LocationAnalyzer | undefined = undefined;
private readonly permissionRules: CatalogPermissionRule[];
private allowedLocationType: string[];
+ private legacySingleProcessorValidation = false;
/**
* Creates a catalog builder.
@@ -384,6 +385,7 @@ export class CatalogBuilder {
>
) {
this.permissionRules.push(...permissionRules.flat());
+ return this;
}
/**
@@ -396,6 +398,15 @@ export class CatalogBuilder {
return this;
}
+ /**
+ * Enables the legacy behaviour of canceling validation early whenever only a
+ * single processor declares an entity kind to be valid.
+ */
+ useLegacySingleProcessorValidation(): this {
+ this.legacySingleProcessorValidation = true;
+ return this;
+ }
+
/**
* Wires up and returns all of the component parts of the catalog
*/
@@ -429,6 +440,7 @@ export class CatalogBuilder {
logger,
parser,
policy,
+ legacySingleProcessorValidation: this.legacySingleProcessorValidation,
});
const stitcher = new Stitcher(dbClient, logger);
const unauthorizedEntitiesCatalog = new DefaultEntitiesCatalog(
diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts
index 515a862515..2c75785dad 100644
--- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts
+++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts
@@ -26,6 +26,7 @@ import {
DbSearchRow,
} from '../database/tables';
import { Stitcher } from '../stitching/Stitcher';
+import { buildEntitySearch } from '../stitching/buildEntitySearch';
import { DefaultEntitiesCatalog } from './DefaultEntitiesCatalog';
describe('DefaultEntitiesCatalog', () => {
@@ -100,29 +101,14 @@ describe('DefaultEntitiesCatalog', () => {
stitch_ticket: '',
});
- await insertSearchRow(knex, id, null, entity);
- }
-
- async function insertSearchRow(
- knex: Knex,
- id: string,
- previousKey: string | null,
- previousValue: Object,
- ) {
- return Promise.all(
- Object.entries(previousValue).map(async ([key, value]) => {
- const currentKey = `${previousKey ? `${previousKey}.` : ``}${key}`;
- if (typeof value === 'object') {
- await insertSearchRow(knex, id, currentKey, value);
- } else {
- await knex('search').insert({
- entity_id: id,
- key: currentKey,
- value: value,
- });
- }
- }),
- );
+ for (const row of buildEntitySearch(id, entity)) {
+ await knex('search').insert({
+ entity_id: id,
+ key: row.key,
+ value: row.value,
+ original_value: row.original_value,
+ });
+ }
}
afterEach(() => {
@@ -792,8 +778,8 @@ describe('DefaultEntitiesCatalog', () => {
facets: {
'metadata.tags': expect.arrayContaining([
{ value: 'java', count: 2 },
- { value: 'rust', count: 1 },
{ value: 'node', count: 1 },
+ { value: 'rust', count: 1 },
]),
},
});
diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts
index 81de6484c3..c82a17cb6f 100644
--- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts
+++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts
@@ -20,8 +20,8 @@ import {
stringifyEntityRef,
} from '@backstage/catalog-model';
import { InputError, NotFoundError } from '@backstage/errors';
-import { Knex } from 'knex';
import lodash from 'lodash';
+import { Knex } from 'knex';
import {
EntitiesBatchRequest,
EntitiesBatchResponse,
@@ -91,12 +91,13 @@ function addCondition(
db: Knex,
filter: EntitiesSearchFilter,
negate: boolean = false,
+ entityIdField = 'entity_id',
) {
// NOTE(freben): This used to be a set of OUTER JOIN, which may seem to
// make a lot of sense. However, it had abysmal performance on sqlite
// when datasets grew large, so we're using IN instead.
const matchQuery = db('search')
- .select('entity_id')
+ .select(entityIdField)
.where({ key: filter.key.toLowerCase() })
.andWhere(function keyFilter() {
if (filter.values) {
@@ -111,7 +112,7 @@ function addCondition(
}
}
});
- queryBuilder.andWhere('entity_id', negate ? 'not in' : 'in', matchQuery);
+ queryBuilder.andWhere(entityIdField, negate ? 'not in' : 'in', matchQuery);
}
function isEntitiesSearchFilter(
@@ -137,25 +138,30 @@ function parseFilter(
query: Knex.QueryBuilder,
db: Knex,
negate: boolean = false,
+ entityIdField = 'entity_id',
): Knex.QueryBuilder {
if (isEntitiesSearchFilter(filter)) {
return query.andWhere(function filterFunction() {
- addCondition(this, db, filter, negate);
+ addCondition(this, db, filter, negate, entityIdField);
});
}
if (isNegationEntityFilter(filter)) {
- return parseFilter(filter.not, query, db, !negate);
+ return parseFilter(filter.not, query, db, !negate, entityIdField);
}
return query[negate ? 'andWhereNot' : 'andWhere'](function filterFunction() {
if (isOrEntityFilter(filter)) {
for (const subFilter of filter.anyOf ?? []) {
- this.orWhere(subQuery => parseFilter(subFilter, subQuery, db));
+ this.orWhere(subQuery =>
+ parseFilter(subFilter, subQuery, db, false, entityIdField),
+ );
}
} else {
for (const subFilter of filter.allOf ?? []) {
- this.andWhere(subQuery => parseFilter(subFilter, subQuery, db));
+ this.andWhere(subQuery =>
+ parseFilter(subFilter, subQuery, db, false, entityIdField),
+ );
}
}
});
@@ -190,7 +196,6 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog {
}
let rows = await entitiesQuery;
-
let pageInfo: DbPageInfo;
if (limit === undefined || rows.length <= limit) {
pageInfo = { hasNextPage: false };
@@ -392,44 +397,26 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog {
}
async facets(request: EntityFacetsRequest): Promise {
- const { entities } = await this.entities({
- filter: request.filter,
- authorizationToken: request.authorizationToken,
- });
-
const facets: EntityFacetsResponse['facets'] = {};
+ const db = this.database;
for (const facet of request.facets) {
- const values = entities
- .map(entity => {
- // TODO(freben): Generalize this code to handle any field that may
- // have dots in its key?
- if (facet.startsWith('metadata.annotations.')) {
- return entity.metadata.annotations?.[
- facet.substring('metadata.annotations.'.length)
- ];
- } else if (facet.startsWith('metadata.labels.')) {
- return entity.metadata.labels?.[
- facet.substring('metadata.labels.'.length)
- ];
- }
- return lodash.get(entity, facet);
- })
- .flatMap(field => {
- if (typeof field === 'string') {
- return [field];
- } else if (Array.isArray(field)) {
- return field.filter(i => typeof i === 'string');
- }
- return [];
- })
- .sort();
+ const dbQuery = db('search')
+ .join('final_entities', 'search.entity_id', 'final_entities.entity_id')
+ .where('search.key', facet.toLocaleLowerCase('en-US'))
+ .count('search.entity_id as count')
+ .select({ value: 'search.original_value' })
+ .groupBy('search.original_value');
- const counts = lodash.countBy(values, lodash.identity);
+ if (request?.filter) {
+ parseFilter(request.filter, dbQuery, db, false, 'search.entity_id');
+ }
- facets[facet] = Object.entries(counts).map(([value, count]) => ({
- value,
- count,
+ const result = await dbQuery;
+
+ facets[facet] = result.map(data => ({
+ value: String(data.value),
+ count: Number(data.count),
}));
}
diff --git a/plugins/catalog-backend/src/service/request/parseEntityFilterParams.ts b/plugins/catalog-backend/src/service/request/parseEntityFilterParams.ts
index 1ea5d44b2c..767a36ce71 100644
--- a/plugins/catalog-backend/src/service/request/parseEntityFilterParams.ts
+++ b/plugins/catalog-backend/src/service/request/parseEntityFilterParams.ts
@@ -63,9 +63,13 @@ export function parseEntityFilterString(
const equalsIndex = statement.indexOf('=');
const key =
- equalsIndex === -1 ? statement : statement.substr(0, equalsIndex).trim();
+ equalsIndex === -1
+ ? statement
+ : statement.substring(0, equalsIndex).trim();
const value =
- equalsIndex === -1 ? undefined : statement.substr(equalsIndex + 1).trim();
+ equalsIndex === -1
+ ? undefined
+ : statement.substring(equalsIndex + 1).trim();
if (!key) {
throw new InputError(
`Invalid filter, '${statement}' is not a valid statement (expected a string on the form a=b or a= or a)`,
diff --git a/plugins/catalog-backend/src/stitching/Stitcher.test.ts b/plugins/catalog-backend/src/stitching/Stitcher.test.ts
index 9accebf1fc..b42e68d105 100644
--- a/plugins/catalog-backend/src/stitching/Stitcher.test.ts
+++ b/plugins/catalog-backend/src/stitching/Stitcher.test.ts
@@ -115,13 +115,43 @@ describe('Stitcher', () => {
const search = await db('search');
expect(search).toEqual(
expect.arrayContaining([
- { entity_id: 'my-id', key: 'relations.looksat', value: 'k:ns/other' },
- { entity_id: 'my-id', key: 'apiversion', value: 'a' },
- { entity_id: 'my-id', key: 'kind', value: 'k' },
- { entity_id: 'my-id', key: 'metadata.name', value: 'n' },
- { entity_id: 'my-id', key: 'metadata.namespace', value: 'ns' },
- { entity_id: 'my-id', key: 'metadata.uid', value: 'my-id' },
- { entity_id: 'my-id', key: 'spec.k', value: 'v' },
+ {
+ entity_id: 'my-id',
+ key: 'relations.looksat',
+ original_value: 'k:ns/other',
+ value: 'k:ns/other',
+ },
+ {
+ entity_id: 'my-id',
+ key: 'apiversion',
+ original_value: 'a',
+ value: 'a',
+ },
+ { entity_id: 'my-id', key: 'kind', original_value: 'k', value: 'k' },
+ {
+ entity_id: 'my-id',
+ key: 'metadata.name',
+ original_value: 'n',
+ value: 'n',
+ },
+ {
+ entity_id: 'my-id',
+ key: 'metadata.namespace',
+ original_value: 'ns',
+ value: 'ns',
+ },
+ {
+ entity_id: 'my-id',
+ key: 'metadata.uid',
+ original_value: 'my-id',
+ value: 'my-id',
+ },
+ {
+ entity_id: 'my-id',
+ key: 'spec.k',
+ original_value: 'v',
+ value: 'v',
+ },
]),
);
@@ -179,14 +209,49 @@ describe('Stitcher', () => {
expect(await db('search')).toEqual(
expect.arrayContaining([
- { entity_id: 'my-id', key: 'relations.looksat', value: 'k:ns/other' },
- { entity_id: 'my-id', key: 'relations.looksat', value: 'k:ns/third' },
- { entity_id: 'my-id', key: 'apiversion', value: 'a' },
- { entity_id: 'my-id', key: 'kind', value: 'k' },
- { entity_id: 'my-id', key: 'metadata.name', value: 'n' },
- { entity_id: 'my-id', key: 'metadata.namespace', value: 'ns' },
- { entity_id: 'my-id', key: 'metadata.uid', value: 'my-id' },
- { entity_id: 'my-id', key: 'spec.k', value: 'v' },
+ {
+ entity_id: 'my-id',
+ key: 'relations.looksat',
+ original_value: 'k:ns/other',
+ value: 'k:ns/other',
+ },
+ {
+ entity_id: 'my-id',
+ key: 'relations.looksat',
+ original_value: 'k:ns/third',
+ value: 'k:ns/third',
+ },
+ {
+ entity_id: 'my-id',
+ key: 'apiversion',
+ original_value: 'a',
+ value: 'a',
+ },
+ { entity_id: 'my-id', key: 'kind', original_value: 'k', value: 'k' },
+ {
+ entity_id: 'my-id',
+ key: 'metadata.name',
+ original_value: 'n',
+ value: 'n',
+ },
+ {
+ entity_id: 'my-id',
+ key: 'metadata.namespace',
+ original_value: 'ns',
+ value: 'ns',
+ },
+ {
+ entity_id: 'my-id',
+ key: 'metadata.uid',
+ original_value: 'my-id',
+ value: 'my-id',
+ },
+ {
+ entity_id: 'my-id',
+ key: 'spec.k',
+ original_value: 'v',
+ value: 'v',
+ },
]),
);
},
diff --git a/plugins/catalog-backend/src/stitching/Stitcher.ts b/plugins/catalog-backend/src/stitching/Stitcher.ts
index cf65a14fee..0da8e39694 100644
--- a/plugins/catalog-backend/src/stitching/Stitcher.ts
+++ b/plugins/catalog-backend/src/stitching/Stitcher.ts
@@ -22,7 +22,6 @@ import {
} from '@backstage/catalog-model';
import { SerializedError, stringifyError } from '@backstage/errors';
import { Knex } from 'knex';
-import { uniqBy } from 'lodash';
import { v4 as uuid } from 'uuid';
import { Logger } from 'winston';
import {
@@ -81,50 +80,43 @@ export class Stitcher {
// one row (except in abnormal cases where the stitch was invoked for
// something that didn't exist at all, in which case it's zero rows).
// The join with the temporary incoming_references still gives one row.
- // The only result set "expanding" join is the one with relations, so
- // the output should be at least one row (if zero or one relations were
- // found), or at most the same number of rows as relations.
- const result: Array<{
- entityId: string;
- processedEntity?: string;
- errors: string;
- incomingReferenceCount: string | number;
- previousHash?: string;
- relationType?: string;
- relationTarget?: string;
- }> = await this.database
- .with('incoming_references', function incomingReferences(builder) {
- return builder
- .from('refresh_state_references')
- .where({ target_entity_ref: entityRef })
- .count({ count: '*' });
- })
- .select({
- entityId: 'refresh_state.entity_id',
- processedEntity: 'refresh_state.processed_entity',
- errors: 'refresh_state.errors',
- incomingReferenceCount: 'incoming_references.count',
- previousHash: 'final_entities.hash',
- relationType: 'relations.type',
- relationTarget: 'relations.target_entity_ref',
- })
- .from('refresh_state')
- .where({ 'refresh_state.entity_ref': entityRef })
- .crossJoin(this.database.raw('incoming_references'))
- .leftOuterJoin('final_entities', {
- 'final_entities.entity_id': 'refresh_state.entity_id',
- })
- .leftOuterJoin('relations', {
- 'relations.source_entity_ref': 'refresh_state.entity_ref',
- })
- .orderBy('relationType', 'asc')
- .orderBy('relationTarget', 'asc');
+ const [processedResult, relationsResult] = await Promise.all([
+ this.database
+ .with('incoming_references', function incomingReferences(builder) {
+ return builder
+ .from('refresh_state_references')
+ .where({ target_entity_ref: entityRef })
+ .count({ count: '*' });
+ })
+ .select({
+ entityId: 'refresh_state.entity_id',
+ processedEntity: 'refresh_state.processed_entity',
+ errors: 'refresh_state.errors',
+ incomingReferenceCount: 'incoming_references.count',
+ previousHash: 'final_entities.hash',
+ })
+ .from('refresh_state')
+ .where({ 'refresh_state.entity_ref': entityRef })
+ .crossJoin(this.database.raw('incoming_references'))
+ .leftOuterJoin('final_entities', {
+ 'final_entities.entity_id': 'refresh_state.entity_id',
+ }),
+ this.database
+ .distinct({
+ relationType: 'type',
+ relationTarget: 'target_entity_ref',
+ })
+ .from('relations')
+ .where({ source_entity_ref: entityRef })
+ .orderBy('relationType', 'asc')
+ .orderBy('relationTarget', 'asc'),
+ ]);
// If there were no rows returned, it would mean that there was no
// matching row even in the refresh_state. This can happen for example
// if we emit a relation to something that hasn't been ingested yet.
// It's safe to ignore this stitch attempt in that case.
- if (!result.length) {
+ if (!processedResult.length) {
this.logger.error(
`Unable to stitch ${entityRef}, item does not exist in refresh state table`,
);
@@ -137,7 +129,7 @@ export class Stitcher {
errors,
incomingReferenceCount,
previousHash,
- } = result[0];
+ } = processedResult[0];
// If there was no processed entity in place, the target hasn't been
// through the processing steps yet. It's safe to ignore this stitch
@@ -177,11 +169,7 @@ export class Stitcher {
// TODO: entityRef is lower case and should be uppercase in the final
// result
- const uniqueRelationRows = uniqBy(
- result,
- r => `${r.relationType}:${r.relationTarget}`,
- );
- entity.relations = uniqueRelationRows
+ entity.relations = relationsResult
.filter(row => row.relationType /* exclude null row, if relevant */)
.map(row => ({
type: row.relationType!,
diff --git a/plugins/catalog-backend/src/stitching/buildEntitySearch.test.ts b/plugins/catalog-backend/src/stitching/buildEntitySearch.test.ts
index 7364486f06..384794d230 100644
--- a/plugins/catalog-backend/src/stitching/buildEntitySearch.test.ts
+++ b/plugins/catalog-backend/src/stitching/buildEntitySearch.test.ts
@@ -88,19 +88,26 @@ describe('buildEntitySearch', () => {
];
const output = mapToRows(input, 'eid');
expect(output).toEqual([
- { entity_id: 'eid', key: 'a', value: 'true' },
- { entity_id: 'eid', key: 'b', value: 'false' },
- { entity_id: 'eid', key: 'c', value: '7' },
- { entity_id: 'eid', key: 'd', value: 'string' },
- { entity_id: 'eid', key: 'e', value: null },
- { entity_id: 'eid', key: 'f', value: null },
+ { entity_id: 'eid', key: 'a', original_value: 'true', value: 'true' },
+ { entity_id: 'eid', key: 'b', original_value: 'false', value: 'false' },
+ { entity_id: 'eid', key: 'c', original_value: '7', value: '7' },
+ {
+ entity_id: 'eid',
+ key: 'd',
+ original_value: 'string',
+ value: 'string',
+ },
+ { entity_id: 'eid', key: 'e', original_value: null, value: null },
+ { entity_id: 'eid', key: 'f', original_value: null, value: null },
]);
});
- it('emits lowercase version of keys and values', () => {
+ it('emits lowercase version of keys and values and also keeps the original value', () => {
const input = [{ key: 'fOo', value: 'BaR' }];
const output = mapToRows(input, 'eid');
- expect(output).toEqual([{ entity_id: 'eid', key: 'foo', value: 'bar' }]);
+ expect(output).toEqual([
+ { entity_id: 'eid', key: 'foo', original_value: 'BaR', value: 'bar' },
+ ]);
});
it('skips very large keys', () => {
@@ -112,7 +119,9 @@ describe('buildEntitySearch', () => {
it('replaces very large values with null', () => {
const input = [{ key: 'foo', value: 'a'.repeat(10000) }];
const output = mapToRows(input, 'eid');
- expect(output).toEqual([{ entity_id: 'eid', key: 'foo', value: null }]);
+ expect(output).toEqual([
+ { entity_id: 'eid', key: 'foo', original_value: null, value: null },
+ ]);
});
});
@@ -124,14 +133,35 @@ describe('buildEntitySearch', () => {
metadata: { name: 'n' },
};
expect(buildEntitySearch('eid', input)).toEqual([
- { entity_id: 'eid', key: 'apiversion', value: 'a' },
- { entity_id: 'eid', key: 'kind', value: 'b' },
- { entity_id: 'eid', key: 'metadata.name', value: 'n' },
- { entity_id: 'eid', key: 'metadata.namespace', value: null },
- { entity_id: 'eid', key: 'metadata.uid', value: null },
+ {
+ entity_id: 'eid',
+ key: 'apiversion',
+ original_value: 'a',
+ value: 'a',
+ },
+ { entity_id: 'eid', key: 'kind', original_value: 'b', value: 'b' },
+ {
+ entity_id: 'eid',
+ key: 'metadata.name',
+ original_value: 'n',
+ value: 'n',
+ },
{
entity_id: 'eid',
key: 'metadata.namespace',
+ original_value: null,
+ value: null,
+ },
+ {
+ entity_id: 'eid',
+ key: 'metadata.uid',
+ original_value: null,
+ value: null,
+ },
+ {
+ entity_id: 'eid',
+ key: 'metadata.namespace',
+ original_value: DEFAULT_NAMESPACE,
value: DEFAULT_NAMESPACE,
},
]);
@@ -154,18 +184,49 @@ describe('buildEntitySearch', () => {
metadata: { name: 'n' },
};
expect(buildEntitySearch('eid', input)).toEqual([
- { entity_id: 'eid', key: 'apiversion', value: 'a' },
- { entity_id: 'eid', key: 'kind', value: 'b' },
- { entity_id: 'eid', key: 'metadata.name', value: 'n' },
- { entity_id: 'eid', key: 'metadata.namespace', value: null },
- { entity_id: 'eid', key: 'metadata.uid', value: null },
+ {
+ entity_id: 'eid',
+ key: 'apiversion',
+ original_value: 'a',
+ value: 'a',
+ },
+ { entity_id: 'eid', key: 'kind', original_value: 'b', value: 'b' },
+ {
+ entity_id: 'eid',
+ key: 'metadata.name',
+ original_value: 'n',
+ value: 'n',
+ },
{
entity_id: 'eid',
key: 'metadata.namespace',
+ original_value: null,
+ value: null,
+ },
+ {
+ entity_id: 'eid',
+ key: 'metadata.uid',
+ original_value: null,
+ value: null,
+ },
+ {
+ entity_id: 'eid',
+ key: 'metadata.namespace',
+ original_value: DEFAULT_NAMESPACE,
value: DEFAULT_NAMESPACE,
},
- { entity_id: 'eid', key: 'relations.t1', value: 'k:ns/a' },
- { entity_id: 'eid', key: 'relations.t2', value: 'k:ns/b' },
+ {
+ entity_id: 'eid',
+ key: 'relations.t1',
+ original_value: 'k:ns/a',
+ value: 'k:ns/a',
+ },
+ {
+ entity_id: 'eid',
+ key: 'relations.t2',
+ original_value: 'k:ns/b',
+ value: 'k:ns/b',
+ },
]);
});
diff --git a/plugins/catalog-backend/src/stitching/buildEntitySearch.ts b/plugins/catalog-backend/src/stitching/buildEntitySearch.ts
index 88a87df134..b97083f207 100644
--- a/plugins/catalog-backend/src/stitching/buildEntitySearch.ts
+++ b/plugins/catalog-backend/src/stitching/buildEntitySearch.ts
@@ -134,15 +134,30 @@ export function mapToRows(input: Kv[], entityId: string): DbSearchRow[] {
for (const { key: rawKey, value: rawValue } of input) {
const key = rawKey.toLocaleLowerCase('en-US');
if (rawValue === undefined || rawValue === null) {
- result.push({ entity_id: entityId, key, value: null });
+ result.push({
+ entity_id: entityId,
+ key,
+ original_value: null,
+ value: null,
+ });
} else {
const value = String(rawValue).toLocaleLowerCase('en-US');
if (key.length <= MAX_KEY_LENGTH) {
- result.push({
- entity_id: entityId,
- key,
- value: value.length <= MAX_VALUE_LENGTH ? value : null,
- });
+ if (value.length <= MAX_VALUE_LENGTH) {
+ result.push({
+ entity_id: entityId,
+ key,
+ original_value: String(rawValue),
+ value: value,
+ });
+ } else {
+ result.push({
+ entity_id: entityId,
+ key,
+ original_value: null,
+ value: null,
+ });
+ }
}
}
}
diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md
index e6774acf35..a11186f0fc 100644
--- a/plugins/catalog-common/CHANGELOG.md
+++ b/plugins/catalog-common/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-catalog-common
+## 1.0.9-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 1.0.9-next.0
### Patch Changes
diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json
index 29a525dc10..b0be0cc01e 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.9-next.0",
+ "version": "1.0.9-next.1",
"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 57cd9dc8a0..d579b84de4 100644
--- a/plugins/catalog-customized/CHANGELOG.md
+++ b/plugins/catalog-customized/CHANGELOG.md
@@ -1,5 +1,13 @@
# @internal/plugin-catalog-customized
+## 0.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.6.2-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+
## 0.0.5-next.0
### Patch Changes
diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json
index bde12058ae..32c8406320 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.5-next.0",
+ "version": "0.0.5-next.1",
"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 75373b040c..2c42f6d714 100644
--- a/plugins/catalog-graph/CHANGELOG.md
+++ b/plugins/catalog-graph/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-catalog-graph
+## 0.2.24-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.2.24-next.0
### Patch Changes
diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json
index 5e47890e75..ef30239045 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.24-next.0",
+ "version": "0.2.24-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx b/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx
index 72ec4b4aed..67aa230ce2 100644
--- a/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx
+++ b/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx
@@ -89,7 +89,7 @@ export const EntityRelationsGraph = (props: {
}) => {
const {
rootEntityNames,
- maxDepth = Number.POSITIVE_INFINITY,
+ maxDepth = 2,
unidirectional = true,
mergeRelations = true,
kinds,
diff --git a/plugins/catalog-graphql/CHANGELOG.md b/plugins/catalog-graphql/CHANGELOG.md
index da1abff0d7..0ea129e544 100644
--- a/plugins/catalog-graphql/CHANGELOG.md
+++ b/plugins/catalog-graphql/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-catalog-graphql
+## 0.3.16-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
## 0.3.16-next.0
### Patch Changes
diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json
index 735d6aa25d..ea2348d7cc 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.16-next.0",
+ "version": "0.3.16-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md
index 884080bb03..b161ac4110 100644
--- a/plugins/catalog-import/CHANGELOG.md
+++ b/plugins/catalog-import/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-catalog-import
+## 0.9.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+
## 0.9.2-next.0
### Patch Changes
diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json
index 71e5034443..89de554079 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.2-next.0",
+ "version": "0.9.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md
index ac31e15535..98f31a7498 100644
--- a/plugins/catalog-node/CHANGELOG.md
+++ b/plugins/catalog-node/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-catalog-node
+## 1.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+
## 1.2.2-next.0
### Patch Changes
diff --git a/plugins/catalog-node/api-report.md b/plugins/catalog-node/api-report.md
index 09a05ec7d9..9e9045db84 100644
--- a/plugins/catalog-node/api-report.md
+++ b/plugins/catalog-node/api-report.md
@@ -139,10 +139,16 @@ export type EntityProviderMutation =
| {
type: 'delta';
added: DeferredEntity[];
- removed: DeferredEntity[];
+ removed: (
+ | DeferredEntity
+ | {
+ entityRef: string;
+ locationKey?: string;
+ }
+ )[];
};
-// @public (undocumented)
+// @public
export type EntityProviderRefreshOptions = {
keys: string[];
};
diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json
index 3d426998b6..57440c4fa7 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.2.2-next.0",
+ "version": "1.2.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-node/src/api/provider.ts b/plugins/catalog-node/src/api/provider.ts
index fc9a172e0d..a576f32022 100644
--- a/plugins/catalog-node/src/api/provider.ts
+++ b/plugins/catalog-node/src/api/provider.ts
@@ -17,16 +17,26 @@
import { DeferredEntity } from '../processing';
/**
- * @public
* A 'full' mutation replaces all existing entities created by this entity provider with new ones.
* A 'delta' mutation can both add and remove entities provided by this provider. Previously provided
* entities from a 'full' mutation are not removed.
+ *
+ * @public
*/
export type EntityProviderMutation =
- | { type: 'full'; entities: DeferredEntity[] }
- | { type: 'delta'; added: DeferredEntity[]; removed: DeferredEntity[] };
+ | {
+ type: 'full';
+ entities: DeferredEntity[];
+ }
+ | {
+ type: 'delta';
+ added: DeferredEntity[];
+ removed: (DeferredEntity | { entityRef: string; locationKey?: string })[];
+ };
/**
+ * The options given to an entity refresh operation.
+ *
* @public
*/
export type EntityProviderRefreshOptions = {
@@ -34,30 +44,38 @@ export type EntityProviderRefreshOptions = {
};
/**
- * The EntityProviderConnection is the connection between the catalog and the entity provider.
- * The EntityProvider use this connection to add and remove entities from the catalog.
+ * The connection between the catalog and the entity provider.
+ * Entity providers use this connection to add and remove entities from the catalog.
+ *
* @public
*/
export interface EntityProviderConnection {
/**
- * Applies either a full or delta update to the catalog engine.
+ * Applies either a full or a delta update to the catalog engine.
*/
applyMutation(mutation: EntityProviderMutation): Promise;
/**
- * Schedules a refresh on all of the entities that has a matching refresh key associated with the provided keys.
+ * Schedules a refresh on all of the entities that have a matching refresh key associated with the provided keys.
*/
refresh(options: EntityProviderRefreshOptions): Promise;
}
/**
- * An EntityProvider is able to provide entities to the catalog.
+ * An entity provider is able to provide entities to the catalog.
* See https://backstage.io/docs/features/software-catalog/life-of-an-entity for more details.
+ *
* @public
*/
export interface EntityProvider {
- /** Unique provider name used internally for caching. */
+ /**
+ * The name of the provider, which must be unique for all providers that are
+ * active in a catalog, and stable over time since emitted entities are
+ * related to the provider by this name.
+ */
getProviderName(): string;
- /** Connect is called upon initialization by the catalog engine. */
+ /**
+ * Called upon initialization by the catalog engine.
+ */
connect(connection: EntityProviderConnection): Promise;
}
diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md
index 52247c1c3e..5bc4167626 100644
--- a/plugins/catalog-react/CHANGELOG.md
+++ b/plugins/catalog-react/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-catalog-react
+## 1.2.2-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
## 1.2.2-next.0
### Patch Changes
diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json
index b3a39b8397..11b9555a12 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.2.2-next.0",
+ "version": "1.2.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -54,7 +54,7 @@
"qs": "^6.9.4",
"react-use": "^17.2.4",
"yaml": "^2.0.0",
- "zen-observable": "^0.9.0"
+ "zen-observable": "^0.10.0"
},
"peerDependencies": {
"@types/react": "^16.13.1 || ^17.0.0",
diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md
index b5d431fdb1..787fe48d4b 100644
--- a/plugins/catalog/CHANGELOG.md
+++ b/plugins/catalog/CHANGELOG.md
@@ -1,5 +1,27 @@
# @backstage/plugin-catalog
+## 1.6.2-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- ca04d97b09: Handle refresh entity error in `AboutCard`.
+- a19cffbeed: Update search links to only have header as linkable text
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 1.6.2-next.0
### Patch Changes
diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json
index 697a3924a4..90324e8ac9 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.6.2-next.0",
+ "version": "1.6.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -52,7 +52,7 @@
"pluralize": "^8.0.0",
"react-helmet": "6.1.0",
"react-use": "^17.2.4",
- "zen-observable": "^0.9.0"
+ "zen-observable": "^0.10.0"
},
"peerDependencies": {
"@types/react": "^16.13.1 || ^17.0.0",
diff --git a/plugins/catalog/src/components/AboutCard/AboutCard.tsx b/plugins/catalog/src/components/AboutCard/AboutCard.tsx
index b7ccd49b31..cb48be2b26 100644
--- a/plugins/catalog/src/components/AboutCard/AboutCard.tsx
+++ b/plugins/catalog/src/components/AboutCard/AboutCard.tsx
@@ -26,7 +26,12 @@ import {
InfoCardVariants,
Link,
} from '@backstage/core-components';
-import { alertApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api';
+import {
+ alertApiRef,
+ errorApiRef,
+ useApi,
+ useRouteRef,
+} from '@backstage/core-plugin-api';
import {
ScmIntegrationIcon,
scmIntegrationsApiRef,
@@ -90,6 +95,7 @@ export function AboutCard(props: AboutCardProps) {
const scmIntegrationsApi = useApi(scmIntegrationsApiRef);
const catalogApi = useApi(catalogApiRef);
const alertApi = useApi(alertApiRef);
+ const errorApi = useApi(errorApiRef);
const viewTechdocLink = useRouteRef(viewTechDocRouteRef);
const entitySourceLocation = getEntitySourceLocation(
@@ -139,9 +145,13 @@ export function AboutCard(props: AboutCardProps) {
const allowRefresh =
entityLocation?.startsWith('url:') || entityLocation?.startsWith('file:');
const refreshEntity = useCallback(async () => {
- await catalogApi.refreshEntity(stringifyEntityRef(entity));
- alertApi.post({ message: 'Refresh scheduled', severity: 'info' });
- }, [catalogApi, alertApi, entity]);
+ try {
+ await catalogApi.refreshEntity(stringifyEntityRef(entity));
+ alertApi.post({ message: 'Refresh scheduled', severity: 'info' });
+ } catch (e) {
+ errorApi.post(e);
+ }
+ }, [catalogApi, alertApi, errorApi, entity]);
return (
diff --git a/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx b/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx
index a7307055c2..2e5cbe2899 100644
--- a/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx
+++ b/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx
@@ -60,6 +60,7 @@ export function CatalogSearchResultListItem(
props: CatalogSearchResultListItemProps,
) {
const result = props.result as any;
+ const highlight = props.highlight as ResultHighlight;
const classes = useStyles();
const analytics = useAnalytics();
@@ -71,7 +72,7 @@ export function CatalogSearchResultListItem(
};
return (
-
+ <>
{props.icon && {props.icon}}
@@ -79,22 +80,24 @@ export function CatalogSearchResultListItem(
className={classes.itemText}
primaryTypographyProps={{ variant: 'h6' }}
primary={
- props.highlight?.fields.title ? (
-
- ) : (
- result.title
- )
+
+ {highlight?.fields.title ? (
+
+ ) : (
+ result.title
+ )}
+
}
secondary={
- props.highlight?.fields.text ? (
+ highlight?.fields.text ? (
) : (
result.text
@@ -112,6 +115,6 @@ export function CatalogSearchResultListItem(
-
+ >
);
}
diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md
index bbee75ecdd..806d3a03a6 100644
--- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md
+++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-cicd-statistics-module-gitlab
+## 0.1.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/plugin-cicd-statistics@0.1.14-next.1
+
## 0.1.8-next.0
### Patch Changes
diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json
index e92d11a977..889d1c0d1f 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.8-next.0",
+ "version": "0.1.8-next.1",
"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 ab5ccbe085..2cd087fae9 100644
--- a/plugins/cicd-statistics/CHANGELOG.md
+++ b/plugins/cicd-statistics/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-cicd-statistics
+## 0.1.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
## 0.1.14-next.0
### Patch Changes
diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json
index 3f7c5e7f60..d458abf9e1 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.14-next.0",
+ "version": "0.1.14-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md
index 4fe29f3809..2dbd13eefd 100644
--- a/plugins/circleci/CHANGELOG.md
+++ b/plugins/circleci/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-circleci
+## 0.3.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.12-next.0
### Patch Changes
diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json
index cd895cf6f5..3419befe45 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.12-next.0",
+ "version": "0.3.12-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md
index 4cb2c10a48..55b7650ff2 100644
--- a/plugins/cloudbuild/CHANGELOG.md
+++ b/plugins/cloudbuild/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-cloudbuild
+## 0.3.12-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.12-next.0
### Patch Changes
diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json
index 1dda3e2844..9c6e415a65 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.12-next.0",
+ "version": "0.3.12-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md
index bbf6efe7fa..51a108a2d8 100644
--- a/plugins/code-climate/CHANGELOG.md
+++ b/plugins/code-climate/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-code-climate
+## 0.1.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.12-next.0
### Patch Changes
diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json
index 777233f328..2e53952aa6 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.12-next.0",
+ "version": "0.1.12-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md
index 4cce8cea7f..00085d9cf0 100644
--- a/plugins/code-coverage-backend/CHANGELOG.md
+++ b/plugins/code-coverage-backend/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-code-coverage-backend
+## 0.2.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.2.5-next.0
### Patch Changes
diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json
index e66d721d93..7c7e4d628a 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.5-next.0",
+ "version": "0.2.5-next.1",
"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 22fb44be06..184d03aadb 100644
--- a/plugins/code-coverage/CHANGELOG.md
+++ b/plugins/code-coverage/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-code-coverage
+## 0.2.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.2.5-next.0
### Patch Changes
diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json
index cab166a1e4..ca5ab9f8bd 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.5-next.0",
+ "version": "0.2.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md
index e1c6ae2238..c290aabdad 100644
--- a/plugins/codescene/CHANGELOG.md
+++ b/plugins/codescene/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-codescene
+## 0.1.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.7-next.0
### Patch Changes
diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json
index f932ffe3c2..49317fd54c 100644
--- a/plugins/codescene/package.json
+++ b/plugins/codescene/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-codescene",
- "version": "0.1.7-next.0",
+ "version": "0.1.7-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md
index 07d30d6538..c7aa34cfd6 100644
--- a/plugins/config-schema/CHANGELOG.md
+++ b/plugins/config-schema/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-config-schema
+## 0.1.35-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.35-next.0
### Patch Changes
diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json
index 991526ce05..0cfc3cbb28 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.35-next.0",
+ "version": "0.1.35-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,7 +34,7 @@
"@material-ui/lab": "4.0.0-alpha.57",
"jsonschema": "^1.2.6",
"react-use": "^17.2.4",
- "zen-observable": "^0.9.0"
+ "zen-observable": "^0.10.0"
},
"peerDependencies": {
"react": "^16.13.1 || ^17.0.0"
diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md
index 6127217642..14f4d90565 100644
--- a/plugins/cost-insights/CHANGELOG.md
+++ b/plugins/cost-insights/CHANGELOG.md
@@ -1,5 +1,22 @@
# @backstage/plugin-cost-insights
+## 0.12.1-next.1
+
+### Patch Changes
+
+- d379b6f070: Internal refactor to avoid usage of deprecated symbols
+- f97c7fd1f7: added an optional config entry `costInsights.engineerThreshold` to allow users to control the threshold value for the 'negligible' change in costs.
+- a5ecdb99f0: Making a possibility to hide a trending line in a cost insights plugin
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/test-utils@1.2.3-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-cost-insights-common@0.1.1
+
## 0.12.1-next.0
### Patch Changes
diff --git a/plugins/cost-insights/README.md b/plugins/cost-insights/README.md
index f65194551a..a7bcb0cb0a 100644
--- a/plugins/cost-insights/README.md
+++ b/plugins/cost-insights/README.md
@@ -222,6 +222,19 @@ costInsights:
rate: 3.5
```
+### Engineer Threshold (Optional; default 0.5)
+
+This threshold determines whether to show 'Negligible', or a percentage with a fraction of 'engineers' for cost savings or cost excess on top of the charts.
+A threshold of 0.5 means that `Negligible` is shown when the difference in costs is lower than that fraction of engineers in that time frame,
+and show `XX% or ~N engineers` when it's above the threshold.
+
+```yaml
+## ./app-config.yaml
+costInsights:
+ engineerCost: 200000
+ engineerThreshold: 0.5
+```
+
## Alerts
The CostInsightsApi `getAlerts` method may return any type of alert or recommendation (called collectively "Action Items" in Cost Insights) that implements the [Alert type](https://github.com/backstage/backstage/blob/master/plugins/cost-insights/src/types/Alert.ts). This allows you to deliver any alerts or recommendations specific to your infrastructure or company migrations.
diff --git a/plugins/cost-insights/api-report.md b/plugins/cost-insights/api-report.md
index 8ae49dcedc..9bc662dae1 100644
--- a/plugins/cost-insights/api-report.md
+++ b/plugins/cost-insights/api-report.md
@@ -237,6 +237,7 @@ export type ConfigContextProps = {
products: Product[];
icons: Icon[];
engineerCost: number;
+ engineerThreshold: number;
currencies: Currency[];
};
diff --git a/plugins/cost-insights/config.d.ts b/plugins/cost-insights/config.d.ts
index 5317485555..61a54f76e2 100644
--- a/plugins/cost-insights/config.d.ts
+++ b/plugins/cost-insights/config.d.ts
@@ -21,6 +21,11 @@ export interface Config {
*/
engineerCost: number;
+ /**
+ * @visibility frontend
+ */
+ engineerThreshold?: number;
+
/**
* @visibility frontend
*/
diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json
index 2e6b2d33f0..8ba7b25a8f 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.1-next.0",
+ "version": "0.12.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/cost-insights/src/components/CostGrowth/CostGrowth.test.tsx b/plugins/cost-insights/src/components/CostGrowth/CostGrowth.test.tsx
index 5f47544f7b..3da7af90fb 100644
--- a/plugins/cost-insights/src/components/CostGrowth/CostGrowth.test.tsx
+++ b/plugins/cost-insights/src/components/CostGrowth/CostGrowth.test.tsx
@@ -17,7 +17,7 @@
import React, { PropsWithChildren } from 'react';
import { renderInTestApp } from '@backstage/test-utils';
import { CostGrowth } from './CostGrowth';
-import { Currency, CurrencyType, Duration } from '../../types';
+import { ChangeThreshold, Currency, CurrencyType, Duration } from '../../types';
import { findAlways } from '../../utils/assert';
import { MockConfigProvider, MockCurrencyProvider } from '../../testUtils';
import { defaultCurrencies } from '../../utils/currency';
@@ -33,11 +33,16 @@ const MockContext = ({
children,
currency,
engineerCost,
+ engineerThreshold,
}: PropsWithChildren<{
currency: Currency;
engineerCost: number;
+ engineerThreshold?: number;
}>) => (
-
+
{children}
);
@@ -104,3 +109,30 @@ describe.each`
expect(getByText(expected)).toBeInTheDocument();
});
});
+
+describe.each`
+ ratio | amount | threshold | expected
+ ${0} | ${0} | ${0} | ${'less than an engineer'}
+ ${0} | ${0} | ${200} | ${'Negligible'}
+ ${ChangeThreshold.lower} | ${0.5} | ${0} | ${'less than an engineer'}
+ ${ChangeThreshold.lower} | ${0.5} | ${0.5} | ${'Negligible'}
+ ${ChangeThreshold.upper} | ${0.5} | ${0.000001} | ${'less than an engineer'}
+ ${ChangeThreshold.upper} | ${0.5} | ${0.5} | ${'Negligible'}
+ ${3} | ${500_000} | ${0} | ${`300% or ~30 engineers`}
+ ${3} | ${500_000} | ${0.5} | ${`300% or ~30 engineers`}
+ ${3} | ${500_000} | ${29} | ${'300% or ~30 engineers'}
+ ${3} | ${500_000} | ${30} | ${'Negligible'}
+`('', ({ ratio, amount, threshold, expected }) => {
+ it(`should display the correct difference the threshold is different. ratio: ${ratio} threshold:${threshold} expected:${expected}`, async () => {
+ const { getByText } = await renderInTestApp(
+
+
+ ,
+ );
+ expect(getByText(expected)).toBeInTheDocument();
+ });
+});
diff --git a/plugins/cost-insights/src/components/CostGrowth/CostGrowth.tsx b/plugins/cost-insights/src/components/CostGrowth/CostGrowth.tsx
index d0a4e7901a..51f9c61e7b 100644
--- a/plugins/cost-insights/src/components/CostGrowth/CostGrowth.tsx
+++ b/plugins/cost-insights/src/components/CostGrowth/CostGrowth.tsx
@@ -16,12 +16,7 @@
import React from 'react';
import classnames from 'classnames';
-import {
- CurrencyType,
- Duration,
- EngineerThreshold,
- GrowthType,
-} from '../../types';
+import { CurrencyType, Duration, GrowthType } from '../../types';
import { ChangeStatistic } from '@backstage/plugin-cost-insights-common';
import { rateOf } from '../../utils/currency';
import { growthOf } from '../../utils/change';
@@ -42,7 +37,7 @@ export const CostGrowth = (props: CostGrowthProps) => {
const { change, duration } = props;
const styles = useStyles();
- const { engineerCost } = useConfig();
+ const { engineerCost, engineerThreshold } = useConfig();
const [currency] = useCurrency();
// Only display costs in absolute values
@@ -55,7 +50,7 @@ export const CostGrowth = (props: CostGrowthProps) => {
// If a ratio cannot be calculated, don't format.
const growth = notEmpty(change.ratio)
- ? growthOf({ ratio: change.ratio, amount: engineers })
+ ? growthOf({ ratio: change.ratio, amount: engineers }, engineerThreshold)
: null;
// Determine if growth is significant enough to highlight
const classes = classnames({
@@ -63,7 +58,7 @@ export const CostGrowth = (props: CostGrowthProps) => {
[styles.savings]: growth === GrowthType.Savings,
});
- if (engineers < EngineerThreshold) {
+ if (engineers < engineerThreshold) {
return Negligible;
}
diff --git a/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.test.tsx b/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.test.tsx
index d0e7d3ff74..a83a520db2 100644
--- a/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.test.tsx
+++ b/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.test.tsx
@@ -18,6 +18,7 @@ import React from 'react';
import { renderInTestApp } from '@backstage/test-utils';
import { CostGrowthIndicator } from './CostGrowthIndicator';
import { ChangeThreshold, EngineerThreshold } from '../../types';
+import { MockConfigProvider } from '../../testUtils';
describe.each`
ratio | amount | ariaLabel
@@ -30,7 +31,9 @@ describe.each`
`('growthOf', ({ ratio, amount, ariaLabel }) => {
it(`should display the correct indicator for ${ariaLabel}`, async () => {
const { getByLabelText } = await renderInTestApp(
- ,
+
+
+ ,
);
expect(getByLabelText(ariaLabel)).toBeInTheDocument();
});
@@ -48,7 +51,9 @@ describe.each`
`('growthOf', ({ ratio, amount }) => {
it('should display the correct indicator for negligible growth', async () => {
const { queryByLabelText } = await renderInTestApp(
- ,
+
+
+ ,
);
expect(queryByLabelText('savings')).not.toBeInTheDocument();
expect(queryByLabelText('excess')).not.toBeInTheDocument();
diff --git a/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.tsx b/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.tsx
index 2591fd5a47..cf07d97d0a 100644
--- a/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.tsx
+++ b/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.tsx
@@ -23,6 +23,7 @@ import { growthOf } from '../../utils/change';
import { GrowthType } from '../../types';
import { useCostGrowthStyles as useStyles } from '../../utils/styles';
import { ChangeStatistic, Maybe } from '@backstage/plugin-cost-insights-common';
+import { useConfig } from '../../hooks';
/** @public */
export type CostGrowthIndicatorProps = TypographyProps & {
@@ -35,10 +36,12 @@ export type CostGrowthIndicatorProps = TypographyProps & {
/** @public */
export const CostGrowthIndicator = (props: CostGrowthIndicatorProps) => {
+ const { engineerThreshold } = useConfig();
const { change, formatter, className, ...extraProps } = props;
const classes = useStyles();
- const growth = growthOf(change);
+
+ const growth = growthOf(change, engineerThreshold);
const classNames = classnames(classes.indicator, className, {
[classes.excess]: growth === GrowthType.Excess,
diff --git a/plugins/cost-insights/src/hooks/useConfig.tsx b/plugins/cost-insights/src/hooks/useConfig.tsx
index 6095f97d49..d1b3a4788e 100644
--- a/plugins/cost-insights/src/hooks/useConfig.tsx
+++ b/plugins/cost-insights/src/hooks/useConfig.tsx
@@ -22,7 +22,7 @@ import React, {
useState,
} from 'react';
import { Config as BackstageConfig } from '@backstage/config';
-import { Currency, Icon, Metric, Product } from '../types';
+import { Currency, EngineerThreshold, Icon, Metric, Product } from '../types';
import { getIcon } from '../utils/navigation';
import { validateCurrencies, validateMetrics } from '../utils/config';
import { createCurrencyFormat, defaultCurrencies } from '../utils/currency';
@@ -70,6 +70,7 @@ export type ConfigContextProps = {
products: Product[];
icons: Icon[];
engineerCost: number;
+ engineerThreshold: number;
currencies: Currency[];
};
@@ -83,6 +84,7 @@ const defaultState: ConfigContextProps = {
products: [],
icons: [],
engineerCost: 0,
+ engineerThreshold: EngineerThreshold,
currencies: defaultCurrencies,
};
@@ -183,11 +185,19 @@ export const ConfigProvider = ({ children }: PropsWithChildren<{}>) => {
return c.getNumber('costInsights.engineerCost');
}
+ function getEngineerThreshold(): number {
+ return (
+ c.getOptionalNumber('costInsights.engineerThreshold') ??
+ defaultState.engineerThreshold
+ );
+ }
+
function getConfig() {
const baseCurrency = getBaseCurrency();
const products = getProducts();
const metrics = getMetrics();
const engineerCost = getEngineerCost();
+ const engineerThreshold = getEngineerThreshold();
const icons = getIcons();
const currencies = getCurrencies();
@@ -200,6 +210,7 @@ export const ConfigProvider = ({ children }: PropsWithChildren<{}>) => {
metrics,
products,
engineerCost,
+ engineerThreshold,
icons,
currencies,
}));
diff --git a/plugins/cost-insights/src/testUtils/providers.tsx b/plugins/cost-insights/src/testUtils/providers.tsx
index 46eab60163..9522dfb702 100644
--- a/plugins/cost-insights/src/testUtils/providers.tsx
+++ b/plugins/cost-insights/src/testUtils/providers.tsx
@@ -31,7 +31,7 @@ import {
ScrollContext,
ScrollContextProps,
} from '../hooks';
-import { Duration } from '../types';
+import { Duration, EngineerThreshold } from '../types';
import { createCurrencyFormat } from '../utils/currency';
export type MockFilterProviderProps = PropsWithChildren<
@@ -95,6 +95,7 @@ export const MockConfigProvider = (props: MockConfigProviderProps) => {
products: [],
icons: [],
engineerCost: 0,
+ engineerThreshold: EngineerThreshold,
currencies: [],
};
diff --git a/plugins/cost-insights/src/utils/change.test.ts b/plugins/cost-insights/src/utils/change.test.ts
index b17e15797e..1a0b9947f5 100644
--- a/plugins/cost-insights/src/utils/change.test.ts
+++ b/plugins/cost-insights/src/utils/change.test.ts
@@ -63,7 +63,7 @@ describe.each`
expected: GrowthType;
}) => {
it(`should display ${GrowthMap[expected]}`, () => {
- expect(growthOf({ ratio, amount })).toBe(expected);
+ expect(growthOf({ ratio, amount }, EngineerThreshold)).toBe(expected);
});
},
);
diff --git a/plugins/cost-insights/src/utils/change.ts b/plugins/cost-insights/src/utils/change.ts
index 3a0d19b123..43d58a021b 100644
--- a/plugins/cost-insights/src/utils/change.ts
+++ b/plugins/cost-insights/src/utils/change.ts
@@ -18,7 +18,6 @@ import {
Cost,
ChangeStatistic,
ChangeThreshold,
- EngineerThreshold,
GrowthType,
MetricData,
Duration,
@@ -29,8 +28,11 @@ import { inclusiveStartDateOf } from './duration';
import { notEmpty } from './assert';
// Used for displaying status colors
-export function growthOf(change: ChangeStatistic): GrowthType {
- const exceedsEngineerThreshold = Math.abs(change.amount) >= EngineerThreshold;
+export function growthOf(
+ change: ChangeStatistic,
+ engineerThreshold: number,
+): GrowthType {
+ const exceedsEngineerThreshold = Math.abs(change.amount) >= engineerThreshold;
if (notEmpty(change.ratio)) {
if (exceedsEngineerThreshold && change.ratio >= ChangeThreshold.upper) {
@@ -41,9 +43,12 @@ export function growthOf(change: ChangeStatistic): GrowthType {
return GrowthType.Savings;
}
} else {
- if (exceedsEngineerThreshold && change.amount > 0) return GrowthType.Excess;
- if (exceedsEngineerThreshold && change.amount < 0)
+ if (exceedsEngineerThreshold && change.amount > 0) {
+ return GrowthType.Excess;
+ }
+ if (exceedsEngineerThreshold && change.amount < 0) {
return GrowthType.Savings;
+ }
}
return GrowthType.Negligible;
diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md
index 7b77434dd0..90ff121044 100644
--- a/plugins/dynatrace/CHANGELOG.md
+++ b/plugins/dynatrace/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-dynatrace
+## 1.0.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 1.0.2-next.0
### Patch Changes
diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json
index 398cb270f8..1e0c6e9768 100644
--- a/plugins/dynatrace/package.json
+++ b/plugins/dynatrace/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-dynatrace",
- "version": "1.0.2-next.0",
+ "version": "1.0.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md
index f7014b4009..4783c2bebd 100644
--- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md
+++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-events-backend-module-aws-sqs
+## 0.1.1-next.1
+
+### Patch Changes
+
+- dd008a10c1: Upgrade to AWS SDK for Javascript v3
+- Updated dependencies
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json
index 4de90105f4..30a2478313 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.1-next.0",
+ "version": "0.1.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -23,7 +23,7 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
- "@aws-sdk/client-sqs": "^3.0.0",
+ "@aws-sdk/client-sqs": "^3.208.0",
"@backstage/backend-plugin-api": "workspace:^",
"@backstage/backend-tasks": "workspace:^",
"@backstage/config": "workspace:^",
@@ -33,6 +33,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
+ "@aws-sdk/types": "^3.208.0",
"@backstage/backend-common": "workspace:^",
"@backstage/backend-test-utils": "workspace:^",
"@backstage/cli": "workspace:^",
diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md
index b17918b6ee..b69fb89f86 100644
--- a/plugins/events-backend-module-azure/CHANGELOG.md
+++ b/plugins/events-backend-module-azure/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-events-backend-module-azure
+## 0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json
index 4202ecda47..9e503e4bb5 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.1-next.0",
+ "version": "0.1.1-next.1",
"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 fd687b453d..586f961391 100644
--- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md
+++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-events-backend-module-bitbucket-cloud
+## 0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json
index 84849f2278..016bf47856 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.1-next.0",
+ "version": "0.1.1-next.1",
"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 636d7370a6..51f72d3caa 100644
--- a/plugins/events-backend-module-gerrit/CHANGELOG.md
+++ b/plugins/events-backend-module-gerrit/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-events-backend-module-gerrit
+## 0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json
index 5048ef2a19..a9d655fd7c 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.1-next.0",
+ "version": "0.1.1-next.1",
"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 7bfc68de6e..98d9564bf1 100644
--- a/plugins/events-backend-module-github/CHANGELOG.md
+++ b/plugins/events-backend-module-github/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/plugin-events-backend-module-github
+## 0.1.1-next.1
+
+### Patch Changes
+
+- 0f46ec304c: Add `createGithubSignatureValidator(config)` which can be used
+ to create a validator used at an ingress for topic `github`.
+
+ On top, there is a new `githubWebhookEventsModule` for the new backend plugin API
+ which auto-registers the `HttpPostIngress` for topic `github` incl. the validator.
+
+ Please find more information at
+ https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-github/README.md.
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/events-backend-module-github/README.md b/plugins/events-backend-module-github/README.md
index b111b79dd0..fb0a0d1c35 100644
--- a/plugins/events-backend-module-github/README.md
+++ b/plugins/events-backend-module-github/README.md
@@ -41,3 +41,34 @@ Add the event router to the `EventsBackend`:
+ .addSubscribers(githubEventRouter);
// [...]
```
+
+### Signature Validator
+
+Add the signature validator for the topic `github`:
+
+```diff
+// at packages/backend/src/plugins/events.ts
++ import { createGithubSignatureValidator } from '@backstage/plugin-events-backend-module-github';
+// [...]
+ const http = HttpPostIngressEventPublisher.fromConfig({
+ config: env.config,
+ ingresses: {
++ github: {
++ validator: createGithubSignatureValidator(env.config),
++ },
+ },
+ logger: env.logger,
+ });
+```
+
+Additionally, you need to add the configuration:
+
+```yaml
+events:
+ modules:
+ github:
+ webhookSecret: your-secret-token
+```
+
+Configuration at GitHub:
+https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks
diff --git a/plugins/events-backend-module-github/api-report.md b/plugins/events-backend-module-github/api-report.md
index 25ce30523a..b2a4425ae6 100644
--- a/plugins/events-backend-module-github/api-report.md
+++ b/plugins/events-backend-module-github/api-report.md
@@ -4,9 +4,16 @@
```ts
import { BackendFeature } from '@backstage/backend-plugin-api';
+import { Config } from '@backstage/config';
import { EventParams } from '@backstage/plugin-events-node';
+import { RequestValidator } from '@backstage/plugin-events-node';
import { SubTopicEventRouter } from '@backstage/plugin-events-node';
+// @public
+export function createGithubSignatureValidator(
+ config: Config,
+): RequestValidator;
+
// @public
export class GithubEventRouter extends SubTopicEventRouter {
constructor();
@@ -18,4 +25,7 @@ export class GithubEventRouter extends SubTopicEventRouter {
export const githubEventRouterEventsModule: (
options?: undefined,
) => BackendFeature;
+
+// @alpha
+export const githubWebhookEventsModule: (options?: undefined) => BackendFeature;
```
diff --git a/plugins/events-backend-module-github/config.d.ts b/plugins/events-backend-module-github/config.d.ts
new file mode 100644
index 0000000000..692d8d4fb5
--- /dev/null
+++ b/plugins/events-backend-module-github/config.d.ts
@@ -0,0 +1,36 @@
+/*
+ * 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 interface Config {
+ events?: {
+ modules?: {
+ /**
+ * events-backend-module-github plugin configuration.
+ */
+ github?: {
+ /**
+ * Secret token for webhook requests used to verify signatures.
+ *
+ * See https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks
+ * for more details.
+ *
+ * @visibility secret
+ */
+ webhookSecret?: string;
+ };
+ };
+ };
+}
diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json
index 8816adcf79..a8b973976f 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.1-next.0",
+ "version": "0.1.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,7 +24,9 @@
},
"dependencies": {
"@backstage/backend-plugin-api": "workspace:^",
+ "@backstage/config": "workspace:^",
"@backstage/plugin-events-node": "workspace:^",
+ "@octokit/webhooks-methods": "^3.0.0",
"winston": "^3.2.1"
},
"devDependencies": {
@@ -35,6 +37,8 @@
},
"files": [
"alpha",
+ "config.d.ts",
"dist"
- ]
+ ],
+ "configSchema": "config.d.ts"
}
diff --git a/plugins/events-backend-module-github/src/http/createGithubSignatureValidator.test.ts b/plugins/events-backend-module-github/src/http/createGithubSignatureValidator.test.ts
new file mode 100644
index 0000000000..32d67437a8
--- /dev/null
+++ b/plugins/events-backend-module-github/src/http/createGithubSignatureValidator.test.ts
@@ -0,0 +1,102 @@
+/*
+ * 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 { ConfigReader } from '@backstage/config';
+import {
+ RequestDetails,
+ RequestRejectionDetails,
+ RequestValidationContext,
+} from '@backstage/plugin-events-node';
+import { sign } from '@octokit/webhooks-methods';
+import { createGithubSignatureValidator } from './createGithubSignatureValidator';
+
+class TestContext implements RequestValidationContext {
+ #details?: Partial;
+
+ reject(details?: Partial): void {
+ this.#details = details;
+ }
+
+ get details() {
+ return this.#details;
+ }
+}
+
+describe('createGithubSignatureValidator', () => {
+ const secret = 'valid-secret';
+ const configWithoutSecret = new ConfigReader({});
+ const configWithSecret = new ConfigReader({
+ events: {
+ modules: {
+ github: {
+ webhookSecret: secret,
+ },
+ },
+ },
+ });
+ const payload = { test: 'payload' };
+ const payloadString = JSON.stringify(payload);
+ const validSignature = sign({ secret, algorithm: 'sha256' }, payloadString);
+
+ const requestWithSignature = async (signature: string | undefined) => {
+ return {
+ body: payload,
+ headers: {
+ 'x-hub-signature-256': signature,
+ },
+ } as RequestDetails;
+ };
+
+ it('no secret configured, throw error', async () => {
+ expect(() => createGithubSignatureValidator(configWithoutSecret)).toThrow(
+ "Missing required config value at 'events.modules.github.webhookSecret'",
+ );
+ });
+
+ it('secret configured, reject request without signature', async () => {
+ const request = await requestWithSignature(undefined);
+ const context = new TestContext();
+
+ const validator = createGithubSignatureValidator(configWithSecret);
+ await validator(request, context);
+
+ expect(context.details).not.toBeUndefined();
+ expect(context.details?.status).toBe(403);
+ expect(context.details?.payload).toEqual({ message: 'invalid signature' });
+ });
+
+ it('secret configured, reject request with invalid signature', async () => {
+ const request = await requestWithSignature('invalid signature');
+ const context = new TestContext();
+
+ const validator = createGithubSignatureValidator(configWithSecret);
+ await validator(request, context);
+
+ expect(context.details).not.toBeUndefined();
+ expect(context.details?.status).toBe(403);
+ expect(context.details?.payload).toEqual({ message: 'invalid signature' });
+ });
+
+ it('secret configured, accept request with valid signature', async () => {
+ const request = await requestWithSignature(await validSignature);
+ const context = new TestContext();
+
+ const validator = createGithubSignatureValidator(configWithSecret);
+ await validator(request, context);
+
+ expect(context.details).toBeUndefined();
+ });
+});
diff --git a/plugins/events-backend-module-github/src/http/createGithubSignatureValidator.ts b/plugins/events-backend-module-github/src/http/createGithubSignatureValidator.ts
new file mode 100644
index 0000000000..e977640ce8
--- /dev/null
+++ b/plugins/events-backend-module-github/src/http/createGithubSignatureValidator.ts
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Config } from '@backstage/config';
+import {
+ RequestDetails,
+ RequestValidationContext,
+ RequestValidator,
+} from '@backstage/plugin-events-node';
+import { verify } from '@octokit/webhooks-methods';
+
+/**
+ * Validates that the request received is the expected GitHub request
+ * using the signature received with the `x-hub-signature-256` header
+ * which is based on a secret token configured at GitHub and here.
+ *
+ * See https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks
+ * for more details.
+ *
+ * @param config - root config
+ * @public
+ */
+export function createGithubSignatureValidator(
+ config: Config,
+): RequestValidator {
+ const secret = config.getString('events.modules.github.webhookSecret');
+
+ return async (
+ request: RequestDetails,
+ context: RequestValidationContext,
+ ): Promise => {
+ const signature = request.headers['x-hub-signature-256'] as
+ | string
+ | undefined;
+
+ if (
+ !signature ||
+ !(await verify(secret, JSON.stringify(request.body), signature))
+ ) {
+ context.reject({
+ status: 403,
+ payload: { message: 'invalid signature' },
+ });
+ }
+ };
+}
diff --git a/plugins/events-backend-module-github/src/index.ts b/plugins/events-backend-module-github/src/index.ts
index 672d82e6dc..8e5671d9d8 100644
--- a/plugins/events-backend-module-github/src/index.ts
+++ b/plugins/events-backend-module-github/src/index.ts
@@ -16,10 +16,12 @@
/**
* The module `github` for the Backstage backend plugin "events-backend"
- * adding an event router for GitHub.
+ * adding an event router and signature validator for GitHub.
*
* @packageDocumentation
*/
+export { createGithubSignatureValidator } from './http/createGithubSignatureValidator';
export { GithubEventRouter } from './router/GithubEventRouter';
export { githubEventRouterEventsModule } from './service/GithubEventRouterEventsModule';
+export { githubWebhookEventsModule } from './service/GithubWebhookEventsModule';
diff --git a/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.test.ts b/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.test.ts
new file mode 100644
index 0000000000..d02afb125d
--- /dev/null
+++ b/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.test.ts
@@ -0,0 +1,90 @@
+/*
+ * 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 { configServiceRef } from '@backstage/backend-plugin-api';
+import { startTestBackend } from '@backstage/backend-test-utils';
+import { ConfigReader } from '@backstage/config';
+import {
+ eventsExtensionPoint,
+ HttpPostIngressOptions,
+ RequestDetails,
+} from '@backstage/plugin-events-node';
+import { sign } from '@octokit/webhooks-methods';
+import { githubWebhookEventsModule } from './GithubWebhookEventsModule';
+
+describe('githubWebhookEventsModule', () => {
+ const secret = 'valid-secret';
+ const payload = { test: 'payload' };
+ const payloadString = JSON.stringify(payload);
+ const validSignature = sign({ secret, algorithm: 'sha256' }, payloadString);
+ const requestWithSignature = async (signature?: string) => {
+ return {
+ body: payload,
+ headers: {
+ 'x-hub-signature-256': signature,
+ },
+ } as RequestDetails;
+ };
+
+ it('should be correctly wired and set up', async () => {
+ let addedIngress: HttpPostIngressOptions | undefined;
+ const extensionPoint = {
+ addHttpPostIngress: (ingress: any) => {
+ addedIngress = ingress;
+ },
+ };
+
+ const config = new ConfigReader({
+ events: {
+ modules: {
+ github: {
+ webhookSecret: secret,
+ },
+ },
+ },
+ });
+
+ await startTestBackend({
+ extensionPoints: [[eventsExtensionPoint, extensionPoint]],
+ services: [[configServiceRef, config]],
+ features: [githubWebhookEventsModule()],
+ });
+
+ expect(addedIngress).not.toBeUndefined();
+ expect(addedIngress?.topic).toEqual('github');
+ expect(addedIngress?.validator).not.toBeUndefined();
+ const rejections: any[] = [];
+ const context = {
+ reject: (details: { status?: any; payload?: any }) => {
+ rejections.push(details);
+ },
+ };
+ await addedIngress!.validator!(await requestWithSignature(), context);
+ expect(rejections).toEqual([
+ {
+ status: 403,
+ payload: {
+ message: 'invalid signature',
+ },
+ },
+ ]);
+ await addedIngress!.validator!(
+ await requestWithSignature(await validSignature),
+ context,
+ );
+ expect(rejections.length).toEqual(1);
+ });
+});
diff --git a/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.ts b/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.ts
new file mode 100644
index 0000000000..d9f4046a5e
--- /dev/null
+++ b/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.ts
@@ -0,0 +1,48 @@
+/*
+ * 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 {
+ configServiceRef,
+ createBackendModule,
+} from '@backstage/backend-plugin-api';
+import { eventsExtensionPoint } from '@backstage/plugin-events-node';
+import { createGithubSignatureValidator } from '../http/createGithubSignatureValidator';
+
+/**
+ * Module for the events-backend plugin,
+ * registering an HTTP POST ingress with request validator
+ * which verifies the webhook signature based on a secret.
+ *
+ * @alpha
+ */
+export const githubWebhookEventsModule = createBackendModule({
+ pluginId: 'events',
+ moduleId: 'githubWebhook',
+ register(env) {
+ env.registerInit({
+ deps: {
+ config: configServiceRef,
+ events: eventsExtensionPoint,
+ },
+ async init({ config, events }) {
+ events.addHttpPostIngress({
+ topic: 'github',
+ validator: createGithubSignatureValidator(config),
+ });
+ },
+ });
+ },
+});
diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md
index 55f40a24eb..593fca46ae 100644
--- a/plugins/events-backend-module-gitlab/CHANGELOG.md
+++ b/plugins/events-backend-module-gitlab/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/plugin-events-backend-module-gitlab
+## 0.1.1-next.1
+
+### Patch Changes
+
+- 31fe8f256a: Add `createGitlabTokenValidator(config)` which can be used
+ to create a validator used at an ingress for topic `gitlab`.
+
+ On top, there is a new `gitlabWebhookEventsModule` for the new backend plugin API
+ which auto-registers the `HttpPostIngress` for topic `gitlab` incl. the validator.
+
+ Please find more information at
+ https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-gitlab/README.md.
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/events-backend-module-gitlab/README.md b/plugins/events-backend-module-gitlab/README.md
index dfbfcd9f4a..dbe9f7bfe3 100644
--- a/plugins/events-backend-module-gitlab/README.md
+++ b/plugins/events-backend-module-gitlab/README.md
@@ -40,3 +40,31 @@ Add the event router to the `EventsBackend`:
+ .addSubscribers(gitlabEventRouter);
// [...]
```
+
+### Token Validator
+
+Add the token validator for the topic `gitlab`:
+
+```diff
+// at packages/backend/src/plugins/events.ts
++ import { createGitlabTokenValidator } from '@backstage/plugin-events-backend-module-gitlab';
+// [...]
+ const http = HttpPostIngressEventPublisher.fromConfig({
+ config: env.config,
+ ingresses: {
++ gitlab: {
++ validator: createGitlabTokenValidator(env.config),
++ },
+ },
+ logger: env.logger,
+ });
+```
+
+Additionally, you need to add the configuration:
+
+```yaml
+events:
+ modules:
+ gitlab:
+ webhookSecret: your-secret-token
+```
diff --git a/plugins/events-backend-module-gitlab/api-report.md b/plugins/events-backend-module-gitlab/api-report.md
index 8b5183a8d0..8f130902a2 100644
--- a/plugins/events-backend-module-gitlab/api-report.md
+++ b/plugins/events-backend-module-gitlab/api-report.md
@@ -4,9 +4,14 @@
```ts
import { BackendFeature } from '@backstage/backend-plugin-api';
+import { Config } from '@backstage/config';
import { EventParams } from '@backstage/plugin-events-node';
+import { RequestValidator } from '@backstage/plugin-events-node';
import { SubTopicEventRouter } from '@backstage/plugin-events-node';
+// @public
+export function createGitlabTokenValidator(config: Config): RequestValidator;
+
// @public
export class GitlabEventRouter extends SubTopicEventRouter {
constructor();
@@ -18,4 +23,7 @@ export class GitlabEventRouter extends SubTopicEventRouter {
export const gitlabEventRouterEventsModule: (
options?: undefined,
) => BackendFeature;
+
+// @alpha
+export const gitlabWebhookEventsModule: (options?: undefined) => BackendFeature;
```
diff --git a/plugins/events-backend-module-gitlab/config.d.ts b/plugins/events-backend-module-gitlab/config.d.ts
new file mode 100644
index 0000000000..6d02533845
--- /dev/null
+++ b/plugins/events-backend-module-gitlab/config.d.ts
@@ -0,0 +1,36 @@
+/*
+ * 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 interface Config {
+ events?: {
+ modules?: {
+ /**
+ * events-backend-module-gitlab plugin configuration.
+ */
+ gitlab?: {
+ /**
+ * Secret token for webhook requests used to verify tokens.
+ *
+ * See https://docs.gitlab.com/ee/user/project/integrations/webhooks.html#validate-payloads-by-using-a-secret-token
+ * for more details.
+ *
+ * @visibility secret
+ */
+ webhookSecret?: string;
+ };
+ };
+ };
+}
diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json
index a376800ca5..4cfcf434ff 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.1-next.0",
+ "version": "0.1.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,6 +24,7 @@
},
"dependencies": {
"@backstage/backend-plugin-api": "workspace:^",
+ "@backstage/config": "workspace:^",
"@backstage/plugin-events-node": "workspace:^",
"winston": "^3.2.1"
},
@@ -35,6 +36,8 @@
},
"files": [
"alpha",
+ "config.d.ts",
"dist"
- ]
+ ],
+ "configSchema": "config.d.ts"
}
diff --git a/plugins/events-backend-module-gitlab/src/http/createGitlabTokenValidator.test.ts b/plugins/events-backend-module-gitlab/src/http/createGitlabTokenValidator.test.ts
new file mode 100644
index 0000000000..33e677450e
--- /dev/null
+++ b/plugins/events-backend-module-gitlab/src/http/createGitlabTokenValidator.test.ts
@@ -0,0 +1,98 @@
+/*
+ * 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 { ConfigReader } from '@backstage/config';
+import {
+ RequestDetails,
+ RequestRejectionDetails,
+ RequestValidationContext,
+} from '@backstage/plugin-events-node';
+import { createGitlabTokenValidator } from './createGitlabTokenValidator';
+
+class TestContext implements RequestValidationContext {
+ #details?: Partial;
+
+ reject(details?: Partial): void {
+ this.#details = details;
+ }
+
+ get details() {
+ return this.#details;
+ }
+}
+
+describe('createGitlabTokenValidator', () => {
+ const validToken = 'valid-token';
+ const configWithoutSecret = new ConfigReader({});
+ const configWithSecret = new ConfigReader({
+ events: {
+ modules: {
+ gitlab: {
+ webhookSecret: validToken,
+ },
+ },
+ },
+ });
+
+ const requestWithToken = (token: string | undefined) => {
+ return {
+ body: undefined,
+ headers: {
+ 'x-gitlab-token': token,
+ },
+ } as RequestDetails;
+ };
+
+ it('no secret configured, throw error', async () => {
+ expect(() => createGitlabTokenValidator(configWithoutSecret)).toThrow(
+ "Missing required config value at 'events.modules.gitlab.webhookSecret'",
+ );
+ });
+
+ it('secret configured, reject request without token', async () => {
+ const request = requestWithToken(undefined);
+ const context = new TestContext();
+
+ const validator = createGitlabTokenValidator(configWithSecret);
+ await validator(request, context);
+
+ expect(context.details).not.toBeUndefined();
+ expect(context.details?.status).toBe(403);
+ expect(context.details?.payload).toEqual({ message: 'invalid token' });
+ });
+
+ it('secret configured, reject request with invalid token', async () => {
+ const request = requestWithToken('invalid-token');
+ const context = new TestContext();
+
+ const validator = createGitlabTokenValidator(configWithSecret);
+ await validator(request, context);
+
+ expect(context.details).not.toBeUndefined();
+ expect(context.details?.status).toBe(403);
+ expect(context.details?.payload).toEqual({ message: 'invalid token' });
+ });
+
+ it('secret configured, accept request with valid token', async () => {
+ const request = requestWithToken(validToken);
+ const context = new TestContext();
+
+ const validator = createGitlabTokenValidator(configWithSecret);
+ await validator(request, context);
+
+ expect(context.details).toBeUndefined();
+ });
+});
diff --git a/plugins/events-backend-module-gitlab/src/http/createGitlabTokenValidator.ts b/plugins/events-backend-module-gitlab/src/http/createGitlabTokenValidator.ts
new file mode 100644
index 0000000000..9ebc054194
--- /dev/null
+++ b/plugins/events-backend-module-gitlab/src/http/createGitlabTokenValidator.ts
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Config } from '@backstage/config';
+import {
+ RequestDetails,
+ RequestValidationContext,
+ RequestValidator,
+} from '@backstage/plugin-events-node';
+
+/**
+ * Validates a configured secret token against the token received with the `x-gitlab-token` header.
+ *
+ * See https://docs.gitlab.com/ee/user/project/integrations/webhooks.html#validate-payloads-by-using-a-secret-token
+ * for more details.
+ *
+ * @param config - root config
+ * @public
+ */
+export function createGitlabTokenValidator(config: Config): RequestValidator {
+ const secret = config.getString('events.modules.gitlab.webhookSecret');
+
+ return async (
+ request: RequestDetails,
+ context: RequestValidationContext,
+ ): Promise => {
+ const token = request.headers['x-gitlab-token'] as string | undefined;
+
+ if (secret !== token) {
+ context.reject({
+ status: 403,
+ payload: { message: 'invalid token' },
+ });
+ }
+ };
+}
diff --git a/plugins/events-backend-module-gitlab/src/index.ts b/plugins/events-backend-module-gitlab/src/index.ts
index ea96244df4..859a6c69c0 100644
--- a/plugins/events-backend-module-gitlab/src/index.ts
+++ b/plugins/events-backend-module-gitlab/src/index.ts
@@ -16,10 +16,12 @@
/**
* The module "gitlab" for the Backstage backend plugin "events-backend"
- * adding an event router for GitLab.
+ * adding an event router and token validator for GitLab.
*
* @packageDocumentation
*/
+export { createGitlabTokenValidator } from './http/createGitlabTokenValidator';
export { GitlabEventRouter } from './router/GitlabEventRouter';
export { gitlabEventRouterEventsModule } from './service/GitlabEventRouterEventsModule';
+export { gitlabWebhookEventsModule } from './service/GitlabWebhookEventsModule';
diff --git a/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.test.ts b/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.test.ts
new file mode 100644
index 0000000000..594be74ab8
--- /dev/null
+++ b/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.test.ts
@@ -0,0 +1,82 @@
+/*
+ * 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 { configServiceRef } from '@backstage/backend-plugin-api';
+import { startTestBackend } from '@backstage/backend-test-utils';
+import { ConfigReader } from '@backstage/config';
+import {
+ eventsExtensionPoint,
+ HttpPostIngressOptions,
+ RequestDetails,
+} from '@backstage/plugin-events-node';
+import { gitlabWebhookEventsModule } from './GitlabWebhookEventsModule';
+
+describe('gitlabWebhookEventsModule', () => {
+ const requestWithToken = (token?: string) => {
+ return {
+ body: undefined,
+ headers: {
+ 'x-gitlab-token': token,
+ },
+ } as RequestDetails;
+ };
+
+ it('should be correctly wired and set up', async () => {
+ let addedIngress: HttpPostIngressOptions | undefined;
+ const extensionPoint = {
+ addHttpPostIngress: (ingress: any) => {
+ addedIngress = ingress;
+ },
+ };
+
+ const config = new ConfigReader({
+ events: {
+ modules: {
+ gitlab: {
+ webhookSecret: 'test-secret',
+ },
+ },
+ },
+ });
+
+ await startTestBackend({
+ extensionPoints: [[eventsExtensionPoint, extensionPoint]],
+ services: [[configServiceRef, config]],
+ features: [gitlabWebhookEventsModule()],
+ });
+
+ expect(addedIngress).not.toBeUndefined();
+ expect(addedIngress?.topic).toEqual('gitlab');
+ expect(addedIngress?.validator).not.toBeUndefined();
+ const rejections: any[] = [];
+ const context = {
+ reject: (details: { status?: any; payload?: any }) => {
+ rejections.push(details);
+ },
+ };
+ await addedIngress!.validator!(requestWithToken(), context);
+ expect(rejections).toEqual([
+ {
+ status: 403,
+ payload: {
+ message: 'invalid token',
+ },
+ },
+ ]);
+ await addedIngress!.validator!(requestWithToken('test-secret'), context);
+ expect(rejections.length).toEqual(1);
+ });
+});
diff --git a/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.ts b/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.ts
new file mode 100644
index 0000000000..562fdb9cf5
--- /dev/null
+++ b/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.ts
@@ -0,0 +1,50 @@
+/*
+ * 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 {
+ configServiceRef,
+ createBackendModule,
+} from '@backstage/backend-plugin-api';
+import { eventsExtensionPoint } from '@backstage/plugin-events-node';
+import { createGitlabTokenValidator } from '../http/createGitlabTokenValidator';
+
+/**
+ * Module for the events-backend plugin,
+ * registering an HTTP POST ingress with request validator
+ * which verifies the webhook token based on a secret.
+ *
+ * Registers the {@link GitlabEventRouter}.
+ *
+ * @alpha
+ */
+export const gitlabWebhookEventsModule = createBackendModule({
+ pluginId: 'events',
+ moduleId: 'gitlabWebhook',
+ register(env) {
+ env.registerInit({
+ deps: {
+ config: configServiceRef,
+ events: eventsExtensionPoint,
+ },
+ async init({ config, events }) {
+ events.addHttpPostIngress({
+ topic: 'gitlab',
+ validator: createGitlabTokenValidator(config),
+ });
+ },
+ });
+ },
+});
diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md
index 0ceab063dc..fdab7ef51c 100644
--- a/plugins/events-backend-test-utils/CHANGELOG.md
+++ b/plugins/events-backend-test-utils/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-events-backend-test-utils
+## 0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.2.0-next.1
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json
index 2f573795ba..8cfb19c761 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.1-next.0",
+ "version": "0.1.1-next.1",
"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 aef1c3a814..b3efbe8a44 100644
--- a/plugins/events-backend/CHANGELOG.md
+++ b/plugins/events-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-events-backend
+## 0.2.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-events-node@0.2.0-next.1
+
## 0.2.0-next.0
### Minor Changes
diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json
index ec07e3a287..bb872b6120 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.0-next.0",
+ "version": "0.2.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.test.ts b/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.test.ts
index 28f3ddcac4..72e0b94c57 100644
--- a/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.test.ts
+++ b/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.test.ts
@@ -51,21 +51,21 @@ describe('HttpPostIngressEventPublisher', () => {
const notFoundResponse = await request(app)
.post('/http/unknown')
- .timeout(100)
+ .timeout(1000)
.send({ test: 'data' });
expect(notFoundResponse.status).toBe(404);
const response1 = await request(app)
.post('/http/testA')
.set('X-Custom-Header', 'test-value')
- .timeout(100)
+ .timeout(1000)
.send({ testA: 'data' });
expect(response1.status).toBe(202);
const response2 = await request(app)
.post('/http/testB')
.set('X-Custom-Header', 'test-value')
- .timeout(100)
+ .timeout(1000)
.send({ testB: 'data' });
expect(response2.status).toBe(202);
@@ -151,13 +151,13 @@ describe('HttpPostIngressEventPublisher', () => {
const response1 = await request(app)
.post('/http/testA')
- .timeout(100)
+ .timeout(1000)
.send({ test: 'data' });
expect(response1.status).toBe(202);
const response2 = await request(app)
.post('/http/testB')
- .timeout(100)
+ .timeout(1000)
.send({ test: 'data' });
expect(response2.status).toBe(400);
expect(response2.body).toEqual({ message: 'wrong signature' });
@@ -165,7 +165,7 @@ describe('HttpPostIngressEventPublisher', () => {
const response3 = await request(app)
.post('/http/testB')
.set('X-Test-Signature', 'wrong')
- .timeout(100)
+ .timeout(1000)
.send({ test: 'data' });
expect(response3.status).toBe(400);
expect(response3.body).toEqual({ message: 'wrong signature' });
@@ -173,20 +173,20 @@ describe('HttpPostIngressEventPublisher', () => {
const response4 = await request(app)
.post('/http/testB')
.set('X-Test-Signature', 'testB-signature')
- .timeout(100)
+ .timeout(1000)
.send({ test: 'data' });
expect(response4.status).toBe(202);
const response5 = await request(app)
.post('/http/testC')
- .timeout(100)
+ .timeout(1000)
.send({ test: 'data' });
expect(response5.status).toBe(404);
expect(response5.body).toEqual({});
const response6 = await request(app)
.post('/http/testD')
- .timeout(100)
+ .timeout(1000)
.send({ test: 'data' });
expect(response6.status).toBe(403);
expect(response6.body).toEqual({});
diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md
index 0a67f77dfd..15f411de9b 100644
--- a/plugins/events-node/CHANGELOG.md
+++ b/plugins/events-node/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-events-node
+## 0.2.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.5-next.1
+
## 0.2.0-next.0
### Minor Changes
diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json
index 0c6fbeef05..490304769c 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.0-next.0",
+ "version": "0.2.0-next.1",
"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 d279bd2f3a..736398a303 100644
--- a/plugins/example-todo-list-backend/CHANGELOG.md
+++ b/plugins/example-todo-list-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @internal/plugin-todo-list-backend
+## 1.0.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 1.0.8-next.0
### Patch Changes
diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json
index 23cce5adbf..698f18a56b 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.8-next.0",
+ "version": "1.0.8-next.1",
"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 15c3b64667..16a43bbec9 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.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
## 1.0.7-next.0
### Patch Changes
diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json
index 6f8eca4c75..5633c65bc1 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.7-next.0",
+ "version": "1.0.7-next.1",
"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 0023dbfe8b..081451c85b 100644
--- a/plugins/example-todo-list/CHANGELOG.md
+++ b/plugins/example-todo-list/CHANGELOG.md
@@ -1,5 +1,14 @@
# @internal/plugin-todo-list
+## 1.0.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
## 1.0.8-next.0
### Patch Changes
diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json
index 95ef8d5238..a27df640d2 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.8-next.0",
+ "version": "1.0.8-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/example-todo-list/src/components/TodoListPage/TodoListPage.tsx b/plugins/example-todo-list/src/components/TodoListPage/TodoListPage.tsx
index 6071502fdb..9185c37419 100644
--- a/plugins/example-todo-list/src/components/TodoListPage/TodoListPage.tsx
+++ b/plugins/example-todo-list/src/components/TodoListPage/TodoListPage.tsx
@@ -164,7 +164,7 @@ function EditModal({
onSubmit,
}: {
todo?: Todo;
- onSubmit(todo: Todo): any;
+ onSubmit(t: Todo): any;
onCancel(): any;
}) {
const title = useRef('');
diff --git a/plugins/explore-backend/.eslintrc.js b/plugins/explore-backend/.eslintrc.js
new file mode 100644
index 0000000000..e2a53a6ad2
--- /dev/null
+++ b/plugins/explore-backend/.eslintrc.js
@@ -0,0 +1 @@
+module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md
new file mode 100644
index 0000000000..90fbc1a75c
--- /dev/null
+++ b/plugins/explore-backend/CHANGELOG.md
@@ -0,0 +1,19 @@
+# @backstage/plugin-explore-backend
+
+## 0.0.1-next.0
+
+### Patch Changes
+
+- 4dec6f16be: Added new `@backstage/plugin-explore-backend` & `@backstage/plugin-explore-common` packages.
+
+ This deprecates the `ExploreToolsConfig` API (in `@backstage/plugin-explore-react`) which is replaced by the `ExploreApi` & `ExploreClient`. The list of `ExploreTool` data can now be provided on the backend by either using the supplied `StaticExploreToolProvider` or by implementing a custom `ExploreToolProvider`. See the [explore-backend README](https://github.com/backstage/backstage/blob/master/plugins/explore-backend/README.md) for full details.
+
+ NOTE: Existing installations that have customized the `ExploreToolConfig` will continue to work through the new `ExploreClient`. However, existing data should be migrated over to new `explore-backend` plugin as `ExploreToolConfig` will be removed in the future.
+
+ BREAKING CHANGE: If you have previously installed the `explore` plugin, but not yet customized the `ExploreToolConfig` API in your `packages/app`, this will result in an empty list of tools.
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-explore-common@0.0.1-next.0
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
diff --git a/plugins/explore-backend/README.md b/plugins/explore-backend/README.md
new file mode 100644
index 0000000000..d1714806f4
--- /dev/null
+++ b/plugins/explore-backend/README.md
@@ -0,0 +1,144 @@
+# explore-backend
+
+The `explore-backend` plugin provides a backend service for the Explore plugin.
+This allows your organizations tools to be surfaced in the Explore plugin
+through an API. It also provides a search collator to make it possible to search
+for these tools.
+
+## Getting started
+
+### Install the Package
+
+```bash
+# From your Backstage root directory
+yarn add --cwd packages/backend @backstage/plugin-explore-backend
+```
+
+### Adding the plugin to your `packages/backend`
+
+You'll need to add the plugin to the router in your `backend` package. You can
+do this by creating a file called `packages/backend/src/plugins/explore.ts`
+
+```ts
+import {
+ createRouter,
+ StaticExploreToolProvider,
+} from '@backstage/plugin-explore-backend';
+import { Router } from 'express';
+import { PluginEnvironment } from '../types';
+
+// List of tools you want to surface in the Explore plugin "Tools" page.
+const tools: ExploreTool[] = [
+ {
+ title: 'New Relic',
+ description:'new relic plugin',
+ url: '/newrelic',
+ image: 'https://i.imgur.com/L37ikrX.jpg',
+ tags: ['newrelic', 'proxy', 'nerdGraph'],
+ },
+ ...
+];
+
+export default async function createPlugin(
+ env: PluginEnvironment,
+): Promise {
+ return await createRouter({
+ logger: env.logger,
+ toolProvider: StaticExploreToolProvider.fromData(exploreTools),
+ });
+}
+```
+
+With the `explore.ts` router setup in place, add the router to
+`packages/backend/src/index.ts`:
+
+```diff
++import explore from './plugins/explore';
+
+async function main() {
+ ...
+ const createEnv = makeCreateEnv(config);
+
+ const catalogEnv = useHotMemoize(module, () => createEnv('catalog'));
++ const exploreEnv = useHotMemoize(module, () => createEnv('explore'));
+
+ const apiRouter = Router();
++ apiRouter.use('/explore', await explore(exploreEnv));
+ ...
+ apiRouter.use(notFoundHandler());
+```
+
+### Wire up Search Indexing
+
+To index explore tools you will need to register the search collator in the
+`packages/backend/src/plugins/search.ts` file.
+
+```diff
++import { ToolDocumentCollatorFactory } from '@backstage/plugin-explore-backend';
+
+async function createSearchEngine(
+ env: PluginEnvironment,
+): Promise {
+ ...
++ indexBuilder.addCollator({
++ schedule,
++ factory: ToolDocumentCollatorFactory.fromConfig(env.config, {
++ discovery: env.discovery,
++ logger: env.logger,
++ }),
++ });
+ ...
+}
+```
+
+### Wire up the Frontend
+
+See [the explore plugin README](../explore/README.md) for more information.
+
+## Explore Tool Customization
+
+The `explore-backend` uses the `ExploreToolProvider` interface to provide a list
+of tools used in your organization and/or within your Backstage instance. This
+can be customized to provide tools from any source. For example you could create
+a `CustomExploreToolProvider` that queries an internal for tools in your
+`packages/backend/src/plugins/explore.ts` file.
+
+```ts
+import {
+ createRouter,
+ StaticExploreToolProvider,
+} from '@backstage/plugin-explore-backend';
+import { Router } from 'express';
+import { PluginEnvironment } from '../types';
+
+class CustomExploreToolProvider implements ExploreToolProvider {
+ async getTools(
+ request: GetExploreToolsRequest,
+ ): Promise {
+ const externalTools = await queryExternalTools(request);
+
+ const tools: ExploreTool[] = [
+ ...externalTools,
+ // Backstage Tools
+ {
+ title: 'New Relic',
+ description: 'new relic plugin',
+ url: '/newrelic',
+ image: 'https://i.imgur.com/L37ikrX.jpg',
+ tags: ['newrelic', 'proxy', 'nerdGraph'],
+ },
+ ];
+
+ return { tools };
+ }
+}
+
+export default async function createPlugin(
+ env: PluginEnvironment,
+): Promise {
+ return await createRouter({
+ logger: env.logger,
+ toolProvider: new CustomExploreToolProvider(),
+ });
+}
+```
diff --git a/plugins/explore-backend/api-report.md b/plugins/explore-backend/api-report.md
new file mode 100644
index 0000000000..cc112ed3cc
--- /dev/null
+++ b/plugins/explore-backend/api-report.md
@@ -0,0 +1,66 @@
+## API Report File for "@backstage/plugin-explore-backend"
+
+> 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';
+
+// @public (undocumented)
+export function createRouter(options: RouterOptions): Promise;
+
+// @public (undocumented)
+export interface ExploreToolProvider {
+ getTools(request: GetExploreToolsRequest): Promise;
+}
+
+// @public (undocumented)
+export interface RouterOptions {
+ // (undocumented)
+ logger: Logger;
+ // (undocumented)
+ toolProvider: ExploreToolProvider;
+}
+
+// @public
+export class StaticExploreToolProvider implements ExploreToolProvider {
+ // (undocumented)
+ static fromData(tools: ExploreTool[]): StaticExploreToolProvider;
+ // (undocumented)
+ getTools(request: GetExploreToolsRequest): Promise;
+}
+
+// @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/explore-backend/package.json b/plugins/explore-backend/package.json
new file mode 100644
index 0000000000..8a23c22856
--- /dev/null
+++ b/plugins/explore-backend/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "@backstage/plugin-explore-backend",
+ "version": "0.0.1-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"
+ },
+ "backstage": {
+ "role": "backend-plugin"
+ },
+ "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/backend-common": "workspace:^",
+ "@backstage/config": "workspace:^",
+ "@backstage/plugin-explore-common": "workspace:^",
+ "@backstage/plugin-search-common": "workspace:^",
+ "@types/express": "*",
+ "express": "^4.18.1",
+ "express-promise-router": "^4.1.0",
+ "lodash": "^4.17.21",
+ "node-fetch": "^2.6.7",
+ "winston": "^3.2.1",
+ "yn": "^4.0.0"
+ },
+ "devDependencies": {
+ "@backstage/cli": "workspace:^",
+ "@types/supertest": "^2.0.8",
+ "msw": "^0.47.0",
+ "supertest": "^6.2.4"
+ },
+ "files": [
+ "dist"
+ ]
+}
diff --git a/plugins/explore-backend/src/example/exampleTools.ts b/plugins/explore-backend/src/example/exampleTools.ts
new file mode 100644
index 0000000000..3726e4c5dd
--- /dev/null
+++ b/plugins/explore-backend/src/example/exampleTools.ts
@@ -0,0 +1,98 @@
+/*
+ * 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 { ExploreTool } from '@backstage/plugin-explore-common';
+
+/**
+ * @private Example only - do not use in production
+ */
+export const exampleTools: ExploreTool[] = [
+ {
+ title: 'New Relic',
+ description:
+ 'Observability platform built to help engineers create and monitor their software',
+ url: '/newrelic',
+ image: 'https://i.imgur.com/L37ikrX.jpg',
+ tags: ['newrelic', 'performance', 'monitoring', 'errors', 'alerting'],
+ },
+ {
+ title: 'CircleCI',
+ description:
+ 'Provides builds overview, detailed build info and retriggering functionality for CircleCI.',
+ url: '/circleci',
+ image: 'https://miro.medium.com/max/1200/1*hkTBp22vLAqlIHkrkZHPnw.png',
+ tags: ['circleci', 'ci', 'dev'],
+ },
+ {
+ title: 'Sentry',
+ description:
+ 'Self-hosted and cloud-based error monitoring that helps software teams discover, triage, and prioritize errors in real-time.',
+ url: '/sentry',
+ image: 'https://sentry-brand.storage.googleapis.com/sentry-logo-black.png',
+ tags: ['sentry', 'monitoring', 'errors'],
+ },
+ {
+ title: 'Lighthouse',
+ description:
+ "Google's Lighthouse tool is a great resource for benchmarking and improving the accessibility, performance, SEO, and best practices of your website.",
+ url: '/lighthouse',
+ image:
+ 'https://raw.githubusercontent.com/GoogleChrome/lighthouse/8b3d7f052b2e64dd857e741d7395647f487697e7/assets/lighthouse-logo.png',
+ tags: ['web', 'seo', 'accessibility', 'performance'],
+ },
+ {
+ title: 'Tech Radar',
+ description:
+ 'Tech Radar is a list of technologies, complemented by an assessment result, called ring assignment.',
+ url: '/tech-radar',
+ image:
+ 'https://storage.googleapis.com/wf-blogs-engineering-media/2018/09/fe13bb32-wf-tech-radar-hero-1024x597.png',
+ tags: ['standards', 'landscape'],
+ },
+ {
+ title: 'Cost Insights',
+ description: 'Insights into cloud costs for your organization.',
+ url: '/cost-insights',
+ image: 'https://cloud.google.com/images/press/logo-cloud.png',
+ tags: ['cloud', 'finops'],
+ },
+ {
+ title: 'GraphiQL',
+ description:
+ 'Integrates GraphiQL as a tool to browse GraphiQL endpoints inside Backstage.',
+ url: '/graphiql',
+ image:
+ 'https://camo.githubusercontent.com/517398c3fbe0687d3d4dcbe05da82970b882e75a/68747470733a2f2f64337676366c703535716a6171632e636c6f756466726f6e742e6e65742f6974656d732f33413061324e314c3346324f304c3377326e316a2f477261706869514c382e706e673f582d436c6f75644170702d56697369746f722d49643d3433363432',
+ tags: ['graphql', 'dev'],
+ },
+ {
+ title: 'GitOps Clusters',
+ description:
+ 'Create GitOps-managed clusters with Backstage. Currently supports EKS flavors and profiles like Machine Learning Ops (MLOps)',
+ url: '/gitops-clusters',
+ image: 'https://miro.medium.com/max/801/1*R28u8gj-hVdDFISoYqPhrQ.png',
+ tags: ['gitops', 'dev'],
+ },
+ {
+ title: 'Rollbar',
+ description:
+ 'Error monitoring and crash reporting for agile development and continuous delivery',
+ url: '/rollbar',
+ image:
+ 'https://images.ctfassets.net/cj4mgtttlyx7/4DfiWj9CbuHBi10uWK7JHn/5e94a6c5dbd5d50bdcd8d9e78f88689b/rollbar-seo.png',
+ tags: ['rollbar', 'monitoring', 'errors'],
+ },
+];
diff --git a/plugins/explore-backend/src/index.ts b/plugins/explore-backend/src/index.ts
new file mode 100644
index 0000000000..a0e7216621
--- /dev/null
+++ b/plugins/explore-backend/src/index.ts
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ */
+
+/**
+ * A Backstage plugin for building an exploration page of your software ecosystem
+ *
+ * @packageDocumentation
+ */
+
+export * from './search';
+export * from './service';
+export * from './tools';
+
+/**
+ * @internal Example only - do not use in production
+ */
+export { exampleTools } from './example/exampleTools';
diff --git a/plugins/explore-backend/src/run.ts b/plugins/explore-backend/src/run.ts
new file mode 100644
index 0000000000..d945aa13f0
--- /dev/null
+++ b/plugins/explore-backend/src/run.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { getRootLogger } from '@backstage/backend-common';
+import yn from 'yn';
+import { startStandaloneServer } from './service/standaloneServer';
+
+const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007;
+const enableCors = yn(process.env.PLUGIN_CORS, { default: false });
+const logger = getRootLogger();
+
+startStandaloneServer({ port, enableCors, logger }).catch(err => {
+ logger.error(err);
+ process.exit(1);
+});
+
+process.on('SIGINT', () => {
+ logger.info('CTRL+C pressed; exiting.');
+ process.exit(0);
+});
diff --git a/plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts b/plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts
new file mode 100644
index 0000000000..dd9872acec
--- /dev/null
+++ b/plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts
@@ -0,0 +1,101 @@
+/*
+ * 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 { PluginEndpointDiscovery } from '@backstage/backend-common';
+import { Config } from '@backstage/config';
+import { ExploreTool } from '@backstage/plugin-explore-common';
+import {
+ DocumentCollatorFactory,
+ IndexableDocument,
+} from '@backstage/plugin-search-common';
+import fetch from 'node-fetch';
+import { Readable } from 'stream';
+import { Logger } from 'winston';
+
+/**
+ * Extended IndexableDocument with explore tool specific properties
+ *
+ * @public
+ */
+export interface ToolDocument extends IndexableDocument, ExploreTool {}
+
+/**
+ * The options for the {@link ToolDocumentCollatorFactory}.
+ *
+ * @public
+ */
+export type ToolDocumentCollatorFactoryOptions = {
+ discovery: PluginEndpointDiscovery;
+ logger: Logger;
+};
+
+/**
+ * Search collator responsible for collecting explore tools to index.
+ *
+ * @public
+ */
+export class ToolDocumentCollatorFactory implements DocumentCollatorFactory {
+ public readonly type: string = 'tools';
+
+ private readonly discovery: PluginEndpointDiscovery;
+ private readonly logger: Logger;
+
+ private constructor(options: ToolDocumentCollatorFactoryOptions) {
+ this.discovery = options.discovery;
+ this.logger = options.logger;
+ }
+
+ static fromConfig(
+ _config: Config,
+ options: ToolDocumentCollatorFactoryOptions,
+ ) {
+ return new ToolDocumentCollatorFactory(options);
+ }
+
+ async getCollator() {
+ return Readable.from(this.execute());
+ }
+
+ async *execute(): AsyncGenerator {
+ this.logger.info('Starting collation of explore tools');
+
+ const tools = await this.fetchTools();
+
+ for (const tool of tools) {
+ yield {
+ ...tool,
+ text: tool.description,
+ location: tool.url,
+ };
+ }
+
+ this.logger.info('Finished collation of explore tools');
+ }
+
+ private async fetchTools() {
+ const baseUrl = await this.discovery.getBaseUrl('explore');
+ const response = await fetch(`${baseUrl}/tools`);
+
+ if (!response.ok) {
+ throw new Error(
+ `Failed to explore fetch tools, ${response.status}: ${response.statusText}`,
+ );
+ }
+
+ const data = await response.json();
+ return data.tools;
+ }
+}
diff --git a/plugins/explore-backend/src/search/index.ts b/plugins/explore-backend/src/search/index.ts
new file mode 100644
index 0000000000..70e9414652
--- /dev/null
+++ b/plugins/explore-backend/src/search/index.ts
@@ -0,0 +1,21 @@
+/*
+ * 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 { ToolDocumentCollatorFactory } from './ToolDocumentCollatorFactory';
+export type {
+ ToolDocument,
+ ToolDocumentCollatorFactoryOptions,
+} from './ToolDocumentCollatorFactory';
diff --git a/plugins/explore-backend/src/service/index.ts b/plugins/explore-backend/src/service/index.ts
new file mode 100644
index 0000000000..8727bd620b
--- /dev/null
+++ b/plugins/explore-backend/src/service/index.ts
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { createRouter } from './router';
+export type { RouterOptions } from './router';
diff --git a/plugins/explore-backend/src/service/router.test.ts b/plugins/explore-backend/src/service/router.test.ts
new file mode 100644
index 0000000000..5fe5b6c6a3
--- /dev/null
+++ b/plugins/explore-backend/src/service/router.test.ts
@@ -0,0 +1,65 @@
+/*
+ * 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 { getVoidLogger } from '@backstage/backend-common';
+import {
+ ExploreTool,
+ GetExploreToolsRequest,
+} from '@backstage/plugin-explore-common';
+import express from 'express';
+import request from 'supertest';
+import { ExploreToolProvider } from '../tools';
+import { createRouter } from './router';
+
+const mockTools: ExploreTool[] = [
+ { title: 'Tool 1', url: 'https://example.com/tool1', image: '' },
+ { title: 'Tool 2', url: 'https://example.com/tool2', image: '' },
+ { title: 'Tool 3', url: 'https://example.com/tool2', image: '' },
+];
+
+describe('createRouter', () => {
+ let app: express.Express;
+ const toolProvider: ExploreToolProvider = {
+ getTools: async ({}: GetExploreToolsRequest) => {
+ return {
+ tools: mockTools,
+ };
+ },
+ };
+
+ beforeAll(async () => {
+ const router = await createRouter({
+ logger: getVoidLogger(),
+ toolProvider,
+ });
+ app = express().use(router);
+ });
+
+ beforeEach(() => {
+ jest.resetAllMocks();
+ });
+
+ describe('GET /tools', () => {
+ it('returns ok', async () => {
+ const response = await request(app).get('/tools');
+
+ expect(response.status).toEqual(200);
+ expect(response.body).toEqual(
+ expect.objectContaining({ tools: mockTools }),
+ );
+ });
+ });
+});
diff --git a/plugins/explore-backend/src/service/router.ts b/plugins/explore-backend/src/service/router.ts
new file mode 100644
index 0000000000..393736529a
--- /dev/null
+++ b/plugins/explore-backend/src/service/router.ts
@@ -0,0 +1,65 @@
+/*
+ * 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 { errorHandler } from '@backstage/backend-common';
+import { GetExploreToolsRequest } from '@backstage/plugin-explore-common';
+import express from 'express';
+import Router from 'express-promise-router';
+import { Logger } from 'winston';
+import { ExploreToolProvider } from '../tools';
+
+/**
+ * @public
+ */
+export interface RouterOptions {
+ logger: Logger;
+ toolProvider: ExploreToolProvider;
+}
+
+/**
+ * @public
+ */
+export async function createRouter(
+ options: RouterOptions,
+): Promise {
+ const { toolProvider } = options;
+
+ const router = Router();
+ router.use(express.json());
+
+ router.get('/tools', async (request, response) => {
+ const requestQuery = parseExploreToolRequestQuery(request.query);
+ const result = await toolProvider.getTools(requestQuery);
+ response.json(result);
+ });
+
+ router.use(errorHandler());
+
+ return router;
+}
+
+function parseExploreToolRequestQuery(
+ params: Record,
+): GetExploreToolsRequest {
+ // TODO: Implement proper query parsing for the filters
+ // Also consider using a `filter` query string like catalog client does
+ return {
+ filter: {
+ tags: [...[(params?.tag as any) ?? []]].flat(),
+ lifecycle: [...[(params?.lifecycle as any) ?? []]].flat(),
+ },
+ };
+}
diff --git a/plugins/explore-backend/src/service/standaloneServer.ts b/plugins/explore-backend/src/service/standaloneServer.ts
new file mode 100644
index 0000000000..6cf5852f18
--- /dev/null
+++ b/plugins/explore-backend/src/service/standaloneServer.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 { createServiceBuilder } from '@backstage/backend-common';
+import { GetExploreToolsRequest } from '@backstage/plugin-explore-common';
+import { Server } from 'http';
+import { Logger } from 'winston';
+import { createRouter } from './router';
+
+export interface ServerOptions {
+ port: number;
+ enableCors: boolean;
+ logger: Logger;
+}
+
+export async function startStandaloneServer(
+ options: ServerOptions,
+): Promise {
+ const logger = options.logger.child({
+ service: 'explore-backend',
+ });
+
+ logger.debug('Starting application server...');
+
+ const router = await createRouter({
+ logger,
+ toolProvider: {
+ getTools: async ({}: GetExploreToolsRequest) => {
+ return {
+ filter: undefined,
+ tools: [
+ { title: 'Tool 1', url: 'https://example.com/tool1', image: '' },
+ { title: 'Tool 2', url: 'https://example.com/tool2', image: '' },
+ { title: 'Tool 3', url: 'https://example.com/tool2', image: '' },
+ ],
+ };
+ },
+ },
+ });
+
+ let service = createServiceBuilder(module)
+ .setPort(options.port)
+ .addRouter('/explore-backend', router);
+ if (options.enableCors) {
+ service = service.enableCors({ origin: 'http://localhost:3000' });
+ }
+
+ return await service.start().catch(err => {
+ logger.error(err);
+ process.exit(1);
+ });
+}
+
+module.hot?.accept();
diff --git a/plugins/explore-backend/src/setupTests.ts b/plugins/explore-backend/src/setupTests.ts
new file mode 100644
index 0000000000..813cdeaae3
--- /dev/null
+++ b/plugins/explore-backend/src/setupTests.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export {};
diff --git a/plugins/explore-backend/src/tools/index.ts b/plugins/explore-backend/src/tools/index.ts
new file mode 100644
index 0000000000..5e605e0142
--- /dev/null
+++ b/plugins/explore-backend/src/tools/index.ts
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { StaticExploreToolProvider } from './providers/StaticExploreToolProvider';
+export * from './types';
diff --git a/plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.test.ts b/plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.test.ts
new file mode 100644
index 0000000000..626426eed9
--- /dev/null
+++ b/plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.test.ts
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { ExploreTool } from '@backstage/plugin-explore-common';
+import { StaticExploreToolProvider } from './StaticExploreToolProvider';
+
+describe('StaticExploreToolProvider', () => {
+ const tool1: ExploreTool = {
+ title: 'Tool 1',
+ image: 'https://example/image.png',
+ url: 'https://example.com',
+ lifecycle: 'production',
+ tags: ['tag1', 'tag2'],
+ };
+ const tool2: ExploreTool = {
+ ...tool1,
+ title: 'Tool 2',
+ lifecycle: 'production',
+ tags: ['tag1'],
+ };
+ const tool3: ExploreTool = {
+ ...tool1,
+ title: 'Tool 3',
+ lifecycle: 'experimental',
+ tags: ['tag2'],
+ };
+ const allTools: ExploreTool[] = [tool1, tool2, tool3];
+
+ describe('getTools', () => {
+ it('returns a list of all tools', async () => {
+ const provider = StaticExploreToolProvider.fromData(allTools);
+
+ await expect(provider.getTools({})).resolves.toEqual({
+ tools: allTools,
+ });
+ });
+
+ it.each([
+ [['tag1'], [tool1, tool2]],
+ [['tag2'], [tool1, tool3]],
+ [[], allTools],
+ ])(
+ 'returns % when filtered by tags %',
+ async (tagFilter, expectedTools) => {
+ const provider = StaticExploreToolProvider.fromData(allTools);
+
+ await expect(
+ provider.getTools({ filter: { tags: tagFilter } }),
+ ).resolves.toEqual({
+ tools: expectedTools,
+ });
+ },
+ );
+
+ it.each([
+ [['production'], [tool1, tool2]],
+ [['experimental'], [tool3]],
+ [[], allTools],
+ ])(
+ 'returns % when filtered by lifecycle %',
+ async (lifecycleFilter, expectedTools) => {
+ const provider = StaticExploreToolProvider.fromData(allTools);
+
+ await expect(
+ provider.getTools({ filter: { lifecycle: lifecycleFilter } }),
+ ).resolves.toEqual({
+ tools: expectedTools,
+ });
+ },
+ );
+ });
+});
diff --git a/plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.ts b/plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.ts
new file mode 100644
index 0000000000..ad8bcafada
--- /dev/null
+++ b/plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.ts
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {
+ ExploreTool,
+ GetExploreToolsRequest,
+ GetExploreToolsResponse,
+} from '@backstage/plugin-explore-common';
+import { intersection, isEmpty } from 'lodash';
+import { ExploreToolProvider } from '../types';
+
+const anyOf = (prop: T | T[], matches: T[]) =>
+ isEmpty(matches)
+ ? true
+ : intersection([...[prop]].flat(), matches)?.length > 0;
+
+/**
+ * A basic ExploreToolProvider implementation using static data.
+ *
+ * @public
+ */
+export class StaticExploreToolProvider implements ExploreToolProvider {
+ private readonly tools: ExploreTool[];
+
+ static fromData(tools: ExploreTool[]) {
+ return new StaticExploreToolProvider(tools);
+ }
+
+ private constructor(tools: ExploreTool[]) {
+ this.tools = tools;
+ }
+
+ async getTools(
+ request: GetExploreToolsRequest,
+ ): Promise {
+ const { filter } = request ?? {};
+ const tags = filter?.tags ?? [];
+ const lifecycles = filter?.lifecycle ?? [];
+
+ const tools = this.tools.filter(
+ t => anyOf(t.tags ?? [], tags) && anyOf(t.lifecycle ?? [], lifecycles),
+ );
+
+ return { tools };
+ }
+}
diff --git a/plugins/explore-backend/src/tools/types.ts b/plugins/explore-backend/src/tools/types.ts
new file mode 100644
index 0000000000..3870924a50
--- /dev/null
+++ b/plugins/explore-backend/src/tools/types.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 {
+ GetExploreToolsRequest,
+ GetExploreToolsResponse,
+} from '@backstage/plugin-explore-common';
+
+/**
+ * @public
+ */
+export interface ExploreToolProvider {
+ /**
+ * Gets a list of explore tools filtered by the request options.
+ *
+ * @param request - The request options {@link @backstage/plugin-explore-common#GetExploreToolsRequest}.
+ * @returns The response {@link @backstage/plugin-explore-common#GetExploreToolsResponse}.
+ */
+ getTools(request: GetExploreToolsRequest): Promise;
+}
diff --git a/plugins/explore-common/.eslintrc.js b/plugins/explore-common/.eslintrc.js
new file mode 100644
index 0000000000..e2a53a6ad2
--- /dev/null
+++ b/plugins/explore-common/.eslintrc.js
@@ -0,0 +1 @@
+module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
diff --git a/plugins/explore-common/CHANGELOG.md b/plugins/explore-common/CHANGELOG.md
new file mode 100644
index 0000000000..794fe6d995
--- /dev/null
+++ b/plugins/explore-common/CHANGELOG.md
@@ -0,0 +1,13 @@
+# @backstage/plugin-explore-common
+
+## 0.0.1-next.0
+
+### Patch Changes
+
+- 4dec6f16be: Added new `@backstage/plugin-explore-backend` & `@backstage/plugin-explore-common` packages.
+
+ This deprecates the `ExploreToolsConfig` API (in `@backstage/plugin-explore-react`) which is replaced by the `ExploreApi` & `ExploreClient`. The list of `ExploreTool` data can now be provided on the backend by either using the supplied `StaticExploreToolProvider` or by implementing a custom `ExploreToolProvider`. See the [explore-backend README](https://github.com/backstage/backstage/blob/master/plugins/explore-backend/README.md) for full details.
+
+ NOTE: Existing installations that have customized the `ExploreToolConfig` will continue to work through the new `ExploreClient`. However, existing data should be migrated over to new `explore-backend` plugin as `ExploreToolConfig` will be removed in the future.
+
+ BREAKING CHANGE: If you have previously installed the `explore` plugin, but not yet customized the `ExploreToolConfig` API in your `packages/app`, this will result in an empty list of tools.
diff --git a/plugins/explore-common/README.md b/plugins/explore-common/README.md
new file mode 100644
index 0000000000..7e8c835660
--- /dev/null
+++ b/plugins/explore-common/README.md
@@ -0,0 +1,3 @@
+# explore-common
+
+Shared types for the `explore` plugin.
diff --git a/plugins/explore-common/api-report.md b/plugins/explore-common/api-report.md
new file mode 100644
index 0000000000..c9a552267c
--- /dev/null
+++ b/plugins/explore-common/api-report.md
@@ -0,0 +1,31 @@
+## API Report File for "@backstage/plugin-explore-common"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+// @public (undocumented)
+export type ExploreTool = {
+ title: string;
+ description?: string;
+ url: string;
+ image: string;
+ tags?: string[];
+ lifecycle?: string;
+};
+
+// @public (undocumented)
+export type ExploreToolFilter = {
+ tags?: string[];
+ lifecycle?: string[];
+};
+
+// @public (undocumented)
+export type GetExploreToolsRequest = {
+ filter?: ExploreToolFilter;
+};
+
+// @public (undocumented)
+export type GetExploreToolsResponse = {
+ tools: ExploreTool[];
+};
+```
diff --git a/plugins/explore-common/package.json b/plugins/explore-common/package.json
new file mode 100644
index 0000000000..5887a26d06
--- /dev/null
+++ b/plugins/explore-common/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "@backstage/plugin-explore-common",
+ "description": "Common functionalities for the explore plugin",
+ "version": "0.0.1-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"
+ },
+ "backstage": {
+ "role": "common-library"
+ },
+ "homepage": "https://backstage.io",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/backstage/backstage",
+ "directory": "plugins/explore-common"
+ },
+ "keywords": [
+ "backstage"
+ ],
+ "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": "workspace:^"
+ },
+ "files": [
+ "dist"
+ ]
+}
diff --git a/plugins/explore-common/src/index.ts b/plugins/explore-common/src/index.ts
new file mode 100644
index 0000000000..d829a62e63
--- /dev/null
+++ b/plugins/explore-common/src/index.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.
+ */
+
+/**
+ * Common functionalities for the explore plugin.
+ *
+ * @packageDocumentation
+ */
+
+export * from './tools';
diff --git a/plugins/explore-common/src/tools/api.ts b/plugins/explore-common/src/tools/api.ts
new file mode 100644
index 0000000000..256671c1af
--- /dev/null
+++ b/plugins/explore-common/src/tools/api.ts
@@ -0,0 +1,46 @@
+/*
+ * 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 { ExploreTool } from './types';
+
+/**
+ * @public
+ */
+export type ExploreToolFilter = {
+ /**
+ * Filter by a list of tags
+ */
+ tags?: string[];
+
+ /**
+ * Filter by a list of lifecycle strings
+ */
+ lifecycle?: string[];
+};
+
+/**
+ * @public
+ */
+export type GetExploreToolsRequest = {
+ filter?: ExploreToolFilter;
+};
+
+/**
+ * @public
+ */
+export type GetExploreToolsResponse = {
+ tools: ExploreTool[];
+};
diff --git a/plugins/explore-common/src/tools/index.ts b/plugins/explore-common/src/tools/index.ts
new file mode 100644
index 0000000000..50a9b9f649
--- /dev/null
+++ b/plugins/explore-common/src/tools/index.ts
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+
+/**
+ * Common functionalities for the explore plugin.
+ *
+ * @packageDocumentation
+ */
+
+export * from './api';
+export * from './types';
diff --git a/plugins/explore-common/src/tools/types.ts b/plugins/explore-common/src/tools/types.ts
new file mode 100644
index 0000000000..25f995f807
--- /dev/null
+++ b/plugins/explore-common/src/tools/types.ts
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+/**
+ * @public
+ */
+export type ExploreTool = {
+ title: string;
+ description?: string;
+ url: string;
+ image: string;
+ tags?: string[];
+ lifecycle?: string;
+};
diff --git a/plugins/explore-react/CHANGELOG.md b/plugins/explore-react/CHANGELOG.md
index 556b919b4f..f4f4b98ebe 100644
--- a/plugins/explore-react/CHANGELOG.md
+++ b/plugins/explore-react/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-explore-react
+## 0.0.24-next.1
+
+### Patch Changes
+
+- 4dec6f16be: Added new `@backstage/plugin-explore-backend` & `@backstage/plugin-explore-common` packages.
+
+ This deprecates the `ExploreToolsConfig` API (in `@backstage/plugin-explore-react`) which is replaced by the `ExploreApi` & `ExploreClient`. The list of `ExploreTool` data can now be provided on the backend by either using the supplied `StaticExploreToolProvider` or by implementing a custom `ExploreToolProvider`. See the [explore-backend README](https://github.com/backstage/backstage/blob/master/plugins/explore-backend/README.md) for full details.
+
+ NOTE: Existing installations that have customized the `ExploreToolConfig` will continue to work through the new `ExploreClient`. However, existing data should be migrated over to new `explore-backend` plugin as `ExploreToolConfig` will be removed in the future.
+
+ BREAKING CHANGE: If you have previously installed the `explore` plugin, but not yet customized the `ExploreToolConfig` API in your `packages/app`, this will result in an empty list of tools.
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-explore-common@0.0.1-next.0
+
## 0.0.24-next.0
### Patch Changes
diff --git a/plugins/explore-react/api-report.md b/plugins/explore-react/api-report.md
index 8a9d2b8b13..61b3cbee2d 100644
--- a/plugins/explore-react/api-report.md
+++ b/plugins/explore-react/api-report.md
@@ -4,23 +4,17 @@
```ts
import { ApiRef } from '@backstage/core-plugin-api';
+import * as common from '@backstage/plugin-explore-common';
-// @public (undocumented)
-export type ExploreTool = {
- title: string;
- description?: string;
- url: string;
- image: string;
- tags?: string[];
- lifecycle?: string;
-};
+// @public @deprecated (undocumented)
+export type ExploreTool = common.ExploreTool;
-// @public (undocumented)
+// @public @deprecated (undocumented)
export interface ExploreToolsConfig {
// (undocumented)
getTools: () => Promise;
}
-// @public (undocumented)
+// @public @deprecated (undocumented)
export const exploreToolsConfigRef: ApiRef;
```
diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json
index 879a00daa9..38503c7f5f 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.24-next.0",
+ "version": "0.0.24-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -32,7 +32,8 @@
"start": "backstage-cli package start"
},
"dependencies": {
- "@backstage/core-plugin-api": "workspace:^"
+ "@backstage/core-plugin-api": "workspace:^",
+ "@backstage/plugin-explore-common": "workspace:^"
},
"devDependencies": {
"@backstage/cli": "workspace:^",
diff --git a/plugins/explore-react/src/tools/api.ts b/plugins/explore-react/src/tools/api.ts
index 0fae2ce0fb..32dccfb5dd 100644
--- a/plugins/explore-react/src/tools/api.ts
+++ b/plugins/explore-react/src/tools/api.ts
@@ -16,22 +16,29 @@
import { createApiRef } from '@backstage/core-plugin-api';
-/** @public */
+/**
+ * Deprecated types moved to `@backstage/plugin-explore-common`
+ */
+import * as common from '@backstage/plugin-explore-common';
+
+/**
+ * @deprecated Use ExploreTool from `@backstage/plugin-explore-common`
+ * @public
+ */
+export type ExploreTool = common.ExploreTool;
+
+/**
+ * @deprecated Use exploreApiRef from `@backstage/plugin-explore` & the `@backstage/plugin-explore-backend`
+ * @public
+ */
export const exploreToolsConfigRef = createApiRef({
id: 'plugin.explore.toolsconfig',
});
-/** @public */
-export type ExploreTool = {
- title: string;
- description?: string;
- url: string;
- image: string;
- tags?: string[];
- lifecycle?: string;
-};
-
-/** @public */
+/**
+ * @deprecated Use ExploreApi from `@backstage/plugin-explore` & the `@backstage/plugin-explore-backend`
+ * @public
+ */
export interface ExploreToolsConfig {
getTools: () => Promise;
}
diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md
index 6ed2646da9..4b4f15a668 100644
--- a/plugins/explore/CHANGELOG.md
+++ b/plugins/explore/CHANGELOG.md
@@ -1,5 +1,29 @@
# @backstage/plugin-explore
+## 0.3.43-next.1
+
+### Patch Changes
+
+- 4dec6f16be: Added new `@backstage/plugin-explore-backend` & `@backstage/plugin-explore-common` packages.
+
+ This deprecates the `ExploreToolsConfig` API (in `@backstage/plugin-explore-react`) which is replaced by the `ExploreApi` & `ExploreClient`. The list of `ExploreTool` data can now be provided on the backend by either using the supplied `StaticExploreToolProvider` or by implementing a custom `ExploreToolProvider`. See the [explore-backend README](https://github.com/backstage/backstage/blob/master/plugins/explore-backend/README.md) for full details.
+
+ NOTE: Existing installations that have customized the `ExploreToolConfig` will continue to work through the new `ExploreClient`. However, existing data should be migrated over to new `explore-backend` plugin as `ExploreToolConfig` will be removed in the future.
+
+ BREAKING CHANGE: If you have previously installed the `explore` plugin, but not yet customized the `ExploreToolConfig` API in your `packages/app`, this will result in an empty list of tools.
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/plugin-explore-common@0.0.1-next.0
+ - @backstage/plugin-explore-react@0.0.24-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 0.3.43-next.0
### Patch Changes
diff --git a/plugins/explore/README.md b/plugins/explore/README.md
index 94ab0984a0..0204f34714 100644
--- a/plugins/explore/README.md
+++ b/plugins/explore/README.md
@@ -1,42 +1,105 @@
# explore
Welcome to the explore plugin!
+
This plugin helps to visualize the domains and tools in your ecosystem.
-## Getting started
+## Setup
-To install the plugin, add and bind the route in `App.tsx`:
+The following sections will help you get the Explore plugin setup and running.
-```typescript
-import { ExplorePage, explorePlugin } from '@backstage/plugin-explore';
+### Backend
-...
+You need to setup the
+[Explore backend plugin](https://github.com/backstage/backstage/tree/master/plugins/explore-backend)
+before you move forward with any of these steps if you haven't already.
-bindRoutes({ bind }) {
- ...
- bind(explorePlugin.externalRoutes, {
- catalogEntity: catalogPlugin.routes.catalogEntity,
- });
-},
+### Installation
-...
+Install this plugin:
-} />
+```bash
+# From your Backstage root directory
+yarn --cwd packages/app add @backstage/plugin-explore
```
-And add a link to the sidebar in `Root.tsx`:
+### Add the plugin to your `packages/app`
-```typescript
-import LayersIcon from '@material-ui/icons/Layers';
+Add the root page that the playlist plugin provides to your app. You can choose
+any path for the route, but we recommend the following:
+
+```diff
+// packages/app/src/App.tsx
++ import { ExplorePage, explorePlugin } from '@backstage/plugin-explore';
...
-
+
+ } />
+ }>
+ {entityPage}
+
++ } />
+ ...
+
+```
+
+You may also want to add a link to the playlist page to your application
+sidebar:
+
+```diff
+// packages/app/src/components/Root/Root.tsx
++import LayersIcon from '@material-ui/icons/Layers';
+
+export const Root = ({ children }: PropsWithChildren<{}>) => (
+
+
++
+ ...
+
+```
+
+### Use search result list item for Explore Tools
+
+When you have your `packages/app/src/components/search/SearchPage.tsx` file
+ready to make modifications, add the following code snippet to add the
+`ToolSearchResultListItem` when the type of the search results are
+`tool`.
+
+```diff
++import { ToolSearchResultListItem } from '@backstage/plugin-explore';
+
+const SearchPage = () => {
+ ...
+
+ {({ results }) => (
+
+ {results.map(({ type, document, highlight, rank }) => {
+ switch (type) {
+ ...
++ case 'tools':
++ return (
++ }
++ key={document.location}
++ result={document}
++ highlight={highlight}
++ rank={rank}
++ />
++ );
+ }
+ })}
+
+ )}
+ ...
+
+...
```
## Customization
-Create a custom explore page in `packages/app/src/components/explore/ExplorePage.tsx`.
+Create a custom explore page in
+`packages/app/src/components/explore/ExplorePage.tsx`.
```tsx
import {
@@ -68,7 +131,7 @@ export const explorePage = ;
Now register the new explore page in `packages/app/src/App.tsx`.
```diff
-+ import { explorePage } from './components/explore/ExplorePage';
++import { explorePage } from './components/explore/ExplorePage';
const routes = (
@@ -79,39 +142,3 @@ const routes = (
);
```
-
-## ToolExplorer Content Customization
-
-Override the `exploreToolsConfigRef` API in `/packages/app/src/apis.ts`.
-
-```tsx
-import { exploreToolsConfigRef } from '@backstage/plugin-explore-react';
-
-export const apis: AnyApiFactory[] = [
- ...
-
- createApiFactory({
- api: exploreToolsConfigRef,
- deps: {},
- factory: () => ({
- async getTools() {
- return tools;
- },
- /* e.g. tools = [
- {
- title: 'New Relic',
- description:'new relic plugin,
- url: '/newrelic',
- image: 'https://i.imgur.com/L37ikrX.jpg',
- tags: ['newrelic', 'proxy', 'nerdGraph'],
- },
- ]
- */
- }),
- }),
-
- ....
-
-];
-
-```
diff --git a/plugins/explore/api-report.md b/plugins/explore/api-report.md
index 9653c0fb63..d184ce01a4 100644
--- a/plugins/explore/api-report.md
+++ b/plugins/explore/api-report.md
@@ -5,10 +5,19 @@
```ts
///
+import { ApiRef } from '@backstage/core-plugin-api';
import { BackstagePlugin } from '@backstage/core-plugin-api';
import { default as default_2 } from 'react';
+import { DiscoveryApi } from '@backstage/core-plugin-api';
import { DomainEntity } from '@backstage/catalog-model';
+import { ExploreToolsConfig } from '@backstage/plugin-explore-react';
import { ExternalRouteRef } from '@backstage/core-plugin-api';
+import { FetchApi } from '@backstage/core-plugin-api';
+import { GetExploreToolsRequest } from '@backstage/plugin-explore-common';
+import { GetExploreToolsResponse } from '@backstage/plugin-explore-common';
+import { IndexableDocument } from '@backstage/plugin-search-common';
+import { ReactNode } from 'react';
+import { ResultHighlight } from '@backstage/plugin-search-common';
import { RouteRef } from '@backstage/core-plugin-api';
import { TabProps } from '@material-ui/core';
@@ -30,6 +39,29 @@ export const DomainExplorerContent: (props: {
title?: string | undefined;
}) => JSX.Element;
+// @public
+export interface ExploreApi {
+ getTools(request?: GetExploreToolsRequest): Promise;
+}
+
+// @public (undocumented)
+export const exploreApiRef: ApiRef;
+
+// @public
+export class ExploreClient implements ExploreApi {
+ constructor({
+ discoveryApi,
+ fetchApi,
+ exploreToolsConfig,
+ }: {
+ discoveryApi: DiscoveryApi;
+ fetchApi: FetchApi;
+ exploreToolsConfig?: ExploreToolsConfig;
+ });
+ // (undocumented)
+ getTools(request?: GetExploreToolsRequest): Promise;
+}
+
// @public
export const ExploreLayout: {
(props: ExploreLayoutProps): JSX.Element;
@@ -91,4 +123,21 @@ export type SubRoute = {
export const ToolExplorerContent: (props: {
title?: string | undefined;
}) => JSX.Element;
+
+// @public (undocumented)
+export function ToolSearchResultListItem(
+ props: ToolSearchResultListItemProps,
+): JSX.Element;
+
+// @public
+export interface ToolSearchResultListItemProps {
+ // (undocumented)
+ highlight?: ResultHighlight;
+ // (undocumented)
+ icon?: ReactNode;
+ // (undocumented)
+ rank?: number;
+ // (undocumented)
+ result: IndexableDocument;
+}
```
diff --git a/plugins/explore/package.json b/plugins/explore/package.json
index f8388df6e8..793628a0bd 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.3.43-next.0",
+ "version": "0.3.43-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,8 +35,12 @@
"@backstage/catalog-model": "workspace:^",
"@backstage/core-components": "workspace:^",
"@backstage/core-plugin-api": "workspace:^",
+ "@backstage/errors": "workspace:^",
"@backstage/plugin-catalog-react": "workspace:^",
+ "@backstage/plugin-explore-common": "workspace:^",
"@backstage/plugin-explore-react": "workspace:^",
+ "@backstage/plugin-search-common": "workspace:^",
+ "@backstage/plugin-search-react": "workspace:^",
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
diff --git a/plugins/explore/src/api/ExploreApi.ts b/plugins/explore/src/api/ExploreApi.ts
new file mode 100644
index 0000000000..ef9eb646b7
--- /dev/null
+++ b/plugins/explore/src/api/ExploreApi.ts
@@ -0,0 +1,42 @@
+/*
+ * 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 { createApiRef } from '@backstage/core-plugin-api';
+import {
+ GetExploreToolsRequest,
+ GetExploreToolsResponse,
+} from '@backstage/plugin-explore-common';
+
+/**
+ * Interface for the explore plugin.
+ *
+ * @public
+ */
+export interface ExploreApi {
+ /**
+ * Returns a list of explore tools.
+ *
+ * @param request - The The request query options
+ */
+ getTools(request?: GetExploreToolsRequest): Promise;
+}
+
+/**
+ * @public
+ */
+export const exploreApiRef = createApiRef({
+ id: 'plugin.explore.service',
+});
diff --git a/plugins/explore/src/api/ExploreClient.test.ts b/plugins/explore/src/api/ExploreClient.test.ts
new file mode 100644
index 0000000000..bbec568a09
--- /dev/null
+++ b/plugins/explore/src/api/ExploreClient.test.ts
@@ -0,0 +1,114 @@
+/*
+ * 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 {
+ ExploreTool,
+ GetExploreToolsResponse,
+} from '@backstage/plugin-explore-common';
+import { MockFetchApi, setupRequestMockHandlers } from '@backstage/test-utils';
+import { rest } from 'msw';
+import { setupServer } from 'msw/node';
+import { ExploreClient } from './ExploreClient';
+
+const server = setupServer();
+
+describe('ExploreClient', () => {
+ setupRequestMockHandlers(server);
+
+ const mockBaseUrl = 'http://backstage/api/explore';
+ const discoveryApi = { getBaseUrl: async () => mockBaseUrl };
+ const fetchApi = new MockFetchApi();
+
+ let client: ExploreClient;
+ beforeEach(() => {
+ client = new ExploreClient({ discoveryApi, fetchApi });
+ });
+
+ describe('getTools', () => {
+ const mockTools: ExploreTool[] = [
+ {
+ title: 'Tool 1',
+ image: 'https://example.com/image.png',
+ url: 'https://example.com',
+ },
+ {
+ title: 'Tool 2',
+ image: 'https://example.com/image.png',
+ url: 'https://example.com',
+ },
+ ];
+
+ it('should fetch data from the explore-backend', async () => {
+ const expectedResponse: GetExploreToolsResponse = {
+ tools: mockTools,
+ };
+
+ server.use(
+ rest.get(`${mockBaseUrl}/tools`, (_, res, ctx) =>
+ res(ctx.json(expectedResponse)),
+ ),
+ );
+
+ const response = await client.getTools();
+ expect(response).toEqual(expectedResponse);
+ });
+
+ it('should request explore tools with specific filters', async () => {
+ const expectedResponse: GetExploreToolsResponse = {
+ tools: mockTools,
+ };
+
+ server.use(
+ rest.get(`${mockBaseUrl}/tools`, (req, res, ctx) => {
+ expect(req.url.search).toBe('?tag=a&tag=b&lifecycle=alpha');
+ return res(ctx.json(expectedResponse));
+ }),
+ );
+
+ const response = await client.getTools({
+ filter: { tags: ['a', 'b'], lifecycle: ['alpha'] },
+ });
+ expect(response).toEqual(expectedResponse);
+ });
+ });
+
+ describe('when using exploreToolsConfig for backwards compatibility', () => {
+ const mockExploreToolsConfig = {
+ getTools: jest.fn(),
+ };
+
+ beforeEach(() => {
+ client = new ExploreClient({
+ discoveryApi,
+ fetchApi,
+ exploreToolsConfig: mockExploreToolsConfig,
+ });
+ });
+
+ it('should return data from the deprecated api', async () => {
+ mockExploreToolsConfig.getTools.mockResolvedValue([
+ {
+ title: 'Some Tool',
+ image: 'https://example.com/image.png',
+ url: 'https://example.com',
+ },
+ ]);
+
+ await client.getTools();
+ expect(mockExploreToolsConfig.getTools).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/plugins/explore/src/api/ExploreClient.ts b/plugins/explore/src/api/ExploreClient.ts
new file mode 100644
index 0000000000..e913aeb041
--- /dev/null
+++ b/plugins/explore/src/api/ExploreClient.ts
@@ -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 { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';
+import { ResponseError } from '@backstage/errors';
+import {
+ GetExploreToolsRequest,
+ GetExploreToolsResponse,
+} from '@backstage/plugin-explore-common';
+import { ExploreToolsConfig } from '@backstage/plugin-explore-react';
+import { ExploreApi } from './ExploreApi';
+
+/**
+ * Default implementation of the ExploreApi.
+ *
+ * @public
+ */
+export class ExploreClient implements ExploreApi {
+ private readonly discoveryApi: DiscoveryApi;
+ private readonly fetchApi: FetchApi;
+ // NOTE: This will be removed in the future as it is replaced by the ExploreApi.getTools method
+ private readonly exploreToolsConfig: ExploreToolsConfig | undefined;
+
+ /**
+ * @remarks The exploreToolsConfig is for backwards compatibility with the exporeToolsConfigRef
+ * and will be removed in the future.
+ */
+ constructor({
+ discoveryApi,
+ fetchApi,
+ exploreToolsConfig = undefined,
+ }: {
+ discoveryApi: DiscoveryApi;
+ fetchApi: FetchApi;
+ exploreToolsConfig?: ExploreToolsConfig;
+ }) {
+ this.discoveryApi = discoveryApi;
+ this.fetchApi = fetchApi;
+ this.exploreToolsConfig = exploreToolsConfig;
+ }
+
+ async getTools(
+ request: GetExploreToolsRequest = {},
+ ): Promise {
+ // NOTE: This will be removed in the future as it is replaced by the ExploreApi.getTools method
+ if (this.exploreToolsConfig) {
+ const tools = await this.exploreToolsConfig.getTools();
+ if (tools) {
+ return { tools };
+ }
+ }
+
+ const { fetch } = this.fetchApi;
+
+ const filter = request.filter ?? {};
+ const baseUrl = await this.discoveryApi.getBaseUrl('explore');
+
+ const tags = filter?.tags?.map(t => `tag=${encodeURIComponent(t)}`) ?? [];
+ const lifecycles =
+ filter?.lifecycle?.map(l => `lifecycle=${encodeURIComponent(l)}`) ?? [];
+ const query = [...tags, ...lifecycles].join('&');
+
+ const response = await fetch(`${baseUrl}/tools?${query}`);
+
+ if (!response.ok) {
+ throw await ResponseError.fromResponse(response);
+ }
+
+ return response.json() as Promise;
+ }
+}
diff --git a/plugins/explore/src/api/index.ts b/plugins/explore/src/api/index.ts
new file mode 100644
index 0000000000..387393f231
--- /dev/null
+++ b/plugins/explore/src/api/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 { ExploreClient } from './ExploreClient';
+export { exploreApiRef } from './ExploreApi';
+export type { ExploreApi } from './ExploreApi';
diff --git a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx
index da35c9fa39..f3cca5642f 100644
--- a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx
+++ b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx
@@ -14,25 +14,23 @@
* limitations under the License.
*/
-import {
- ExploreTool,
- exploreToolsConfigRef,
-} from '@backstage/plugin-explore-react';
+import { ExploreTool } from '@backstage/plugin-explore-common';
import { renderInTestApp, TestApiProvider } from '@backstage/test-utils';
import { lightTheme } from '@backstage/theme';
import { ThemeProvider } from '@material-ui/core';
import { waitFor } from '@testing-library/react';
import React from 'react';
+import { exploreApiRef } from '../../api';
import { ToolExplorerContent } from './ToolExplorerContent';
describe('', () => {
- const exploreToolsConfigApi: jest.Mocked = {
+ const exploreApi: jest.Mocked = {
getTools: jest.fn(),
};
const Wrapper = ({ children }: { children?: React.ReactNode }) => (
-
+
{children}
@@ -63,7 +61,7 @@ describe('', () => {
tags: ['standards', 'landscape'],
},
];
- exploreToolsConfigApi.getTools.mockResolvedValue(tools);
+ exploreApi.getTools.mockResolvedValue({ tools });
const { getByText } = await renderInTestApp(
@@ -78,7 +76,7 @@ describe('', () => {
});
it('renders a custom title', async () => {
- exploreToolsConfigApi.getTools.mockResolvedValue([]);
+ exploreApi.getTools.mockResolvedValue({ tools: [] });
const { getByText } = await renderInTestApp(
@@ -90,7 +88,7 @@ describe('', () => {
});
it('renders empty state', async () => {
- exploreToolsConfigApi.getTools.mockResolvedValue([]);
+ exploreApi.getTools.mockResolvedValue({ tools: [] });
const { getByText } = await renderInTestApp(
diff --git a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx
index 5404c67393..d9cd3a512c 100644
--- a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx
+++ b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-import { exploreToolsConfigRef } from '@backstage/plugin-explore-react';
import React from 'react';
import useAsync from 'react-use/lib/useAsync';
import { ToolCard } from '../ToolCard';
@@ -28,16 +27,18 @@ import {
WarningPanel,
} from '@backstage/core-components';
import { useApi } from '@backstage/core-plugin-api';
+import { exploreApiRef } from '../../api';
const Body = () => {
- const exploreToolsConfigApi = useApi(exploreToolsConfigRef);
+ const exploreApi = useApi(exploreApiRef);
+
const {
value: tools,
loading,
error,
} = useAsync(async () => {
- return await exploreToolsConfigApi.getTools();
- }, [exploreToolsConfigApi]);
+ return (await exploreApi.getTools())?.tools;
+ }, [exploreApi]);
if (loading) {
return ;
diff --git a/plugins/explore/src/components/ToolSearchResultListItem/ToolSearchResultListItem.tsx b/plugins/explore/src/components/ToolSearchResultListItem/ToolSearchResultListItem.tsx
new file mode 100644
index 0000000000..3f5a515efb
--- /dev/null
+++ b/plugins/explore/src/components/ToolSearchResultListItem/ToolSearchResultListItem.tsx
@@ -0,0 +1,115 @@
+/*
+ * 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 React, { ReactNode } from 'react';
+import {
+ Box,
+ Chip,
+ Divider,
+ ListItem,
+ ListItemIcon,
+ ListItemText,
+ makeStyles,
+} from '@material-ui/core';
+import { Link } from '@backstage/core-components';
+import { useAnalytics } from '@backstage/core-plugin-api';
+import {
+ IndexableDocument,
+ ResultHighlight,
+} from '@backstage/plugin-search-common';
+import { HighlightedSearchResultText } from '@backstage/plugin-search-react';
+
+const useStyles = makeStyles({
+ flexContainer: {
+ flexWrap: 'wrap',
+ },
+ itemText: {
+ width: '100%',
+ wordBreak: 'break-all',
+ marginBottom: '1rem',
+ },
+});
+
+/**
+ * Props for {@link ToolSearchResultListItem}.
+ *
+ * @public
+ */
+export interface ToolSearchResultListItemProps {
+ icon?: ReactNode;
+ result: IndexableDocument;
+ highlight?: ResultHighlight;
+ rank?: number;
+}
+
+/** @public */
+export function ToolSearchResultListItem(props: ToolSearchResultListItemProps) {
+ const result = props.result as any;
+
+ const classes = useStyles();
+ const analytics = useAnalytics();
+ const handleClick = () => {
+ analytics.captureEvent('discover', result.title, {
+ attributes: { to: result.location },
+ value: props.rank,
+ });
+ };
+
+ return (
+ <>
+
+ {props.icon && {props.icon}}
+
+
+ {props.highlight?.fields.title ? (
+
+ ) : (
+ result.title
+ )}
+
+ }
+ secondary={
+ props.highlight?.fields.text ? (
+
+ ) : (
+ result.text
+ )
+ }
+ />
+
+ {result.tags &&
+ result.tags.map((tag: string) => (
+
+ ))}
+
+
+
+
+ >
+ );
+}
diff --git a/plugins/explore/src/components/ToolSearchResultListItem/index.ts b/plugins/explore/src/components/ToolSearchResultListItem/index.ts
new file mode 100644
index 0000000000..1dfdd64b5b
--- /dev/null
+++ b/plugins/explore/src/components/ToolSearchResultListItem/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export * from './ToolSearchResultListItem';
diff --git a/plugins/explore/src/components/index.ts b/plugins/explore/src/components/index.ts
index f8fba16910..d3af1b99c2 100644
--- a/plugins/explore/src/components/index.ts
+++ b/plugins/explore/src/components/index.ts
@@ -16,3 +16,4 @@
export * from './DomainCard';
export * from './ExploreLayout';
+export * from './ToolSearchResultListItem';
diff --git a/plugins/explore/src/index.ts b/plugins/explore/src/index.ts
index 04f0240968..24591211f7 100644
--- a/plugins/explore/src/index.ts
+++ b/plugins/explore/src/index.ts
@@ -20,6 +20,7 @@
* @packageDocumentation
*/
+export * from './api';
export * from './components';
export * from './extensions';
export { explorePlugin, explorePlugin as plugin } from './plugin';
diff --git a/plugins/explore/src/plugin.ts b/plugins/explore/src/plugin.ts
index a4bb538265..ab8eedf7ef 100644
--- a/plugins/explore/src/plugin.ts
+++ b/plugins/explore/src/plugin.ts
@@ -16,21 +16,44 @@
import { exploreToolsConfigRef } from '@backstage/plugin-explore-react';
import { catalogEntityRouteRef, exploreRouteRef } from './routes';
-import { exampleTools } from './util/examples';
-import { createApiFactory, createPlugin } from '@backstage/core-plugin-api';
+import {
+ createApiFactory,
+ createPlugin,
+ discoveryApiRef,
+ fetchApiRef,
+} from '@backstage/core-plugin-api';
+import { ExploreClient, exploreApiRef } from './api';
+// import { exampleTools } from './util/examples';
/** @public */
export const explorePlugin = createPlugin({
id: 'explore',
apis: [
- // Register a default for exploreToolsConfigRef, you may want to override
- // the API locally in your app.
+ createApiFactory({
+ api: exploreApiRef,
+ deps: {
+ discoveryApi: discoveryApiRef,
+ fetchApi: fetchApiRef,
+ exploreToolsConfig: exploreToolsConfigRef,
+ },
+ factory: ({ discoveryApi, fetchApi, exploreToolsConfig }) =>
+ // NOTE: The exploreToolsConfig is for backwards compatibility and will be removed in the future
+ new ExploreClient({ discoveryApi, fetchApi, exploreToolsConfig }),
+ }),
+ /**
+ * @deprecated Use ExploreApi from `@backstage/plugin-explore` instead
+ *
+ * Register a default for exploreToolsConfigRef, you may want to override
+ * the API locally in your app.
+ */
createApiFactory({
api: exploreToolsConfigRef,
deps: {},
factory: () => ({
async getTools() {
- return exampleTools;
+ // Returning `undefined` will enable the explore-backend to be used via the ExploreClient.
+ // If this API has been customized and returns data it will be respected first.
+ return undefined as any;
},
}),
}),
diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md
index f45d554a29..7457ed8f9c 100644
--- a/plugins/firehydrant/CHANGELOG.md
+++ b/plugins/firehydrant/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-firehydrant
+## 0.1.29-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.29-next.0
### Patch Changes
diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json
index 09752fabb4..8bbc8aaf5c 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.29-next.0",
+ "version": "0.1.29-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md
index 8f4a4f6411..20ad50f001 100644
--- a/plugins/fossa/CHANGELOG.md
+++ b/plugins/fossa/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-fossa
+## 0.2.44-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.2.44-next.0
### Patch Changes
diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json
index bd5b352f38..9dc277525b 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.44-next.0",
+ "version": "0.2.44-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md
index 1247c9af5a..226a8ba905 100644
--- a/plugins/gcalendar/CHANGELOG.md
+++ b/plugins/gcalendar/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-gcalendar
+## 0.3.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.8-next.0
### Patch Changes
diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json
index 9664f0d1d5..07e90edbfc 100644
--- a/plugins/gcalendar/package.json
+++ b/plugins/gcalendar/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-gcalendar",
- "version": "0.3.8-next.0",
+ "version": "0.3.8-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md
index 8aebfc2a83..ed1ae0d467 100644
--- a/plugins/gcp-projects/CHANGELOG.md
+++ b/plugins/gcp-projects/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-gcp-projects
+## 0.3.31-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.31-next.0
### Patch Changes
diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json
index eb0cebacfe..c6509a33a2 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.31-next.0",
+ "version": "0.3.31-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -39,7 +39,7 @@
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
- "@react-hookz/web": "^15.0.0"
+ "@react-hookz/web": "^19.0.0"
},
"peerDependencies": {
"react": "^16.13.1 || ^17.0.0",
diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md
index 9e93735c02..e5e69c52ab 100644
--- a/plugins/git-release-manager/CHANGELOG.md
+++ b/plugins/git-release-manager/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-git-release-manager
+## 0.3.25-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.25-next.0
### Patch Changes
diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json
index 3bc48171a0..1ba966c915 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.25-next.0",
+ "version": "0.3.25-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md
index e9f0c87449..e6bcf0b12c 100644
--- a/plugins/github-actions/CHANGELOG.md
+++ b/plugins/github-actions/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-github-actions
+## 0.5.12-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.5.12-next.0
### Patch Changes
diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json
index 96b45fe403..9f03e38b4b 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.12-next.0",
+ "version": "0.5.12-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md
index 0cd7ababe1..f670411444 100644
--- a/plugins/github-deployments/CHANGELOG.md
+++ b/plugins/github-deployments/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-github-deployments
+## 0.1.43-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.43-next.0
### Patch Changes
diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json
index 984386a609..85911ffadc 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.43-next.0",
+ "version": "0.1.43-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md
index dd38eb4ab7..0bbb84d63a 100644
--- a/plugins/github-issues/CHANGELOG.md
+++ b/plugins/github-issues/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-github-issues
+## 0.2.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.2.1-next.0
### Patch Changes
diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json
index 26d7e58c9e..40e0c1b878 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.1-next.0",
+ "version": "0.2.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md
index aa286afbb3..e557f4b05f 100644
--- a/plugins/github-pull-requests-board/CHANGELOG.md
+++ b/plugins/github-pull-requests-board/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-github-pull-requests-board
+## 0.1.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.6-next.0
### Patch Changes
diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json
index c211e9aff5..d8dc59e7b6 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.6-next.0",
+ "version": "0.1.6-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md
index 35e7a4994d..9735fbdb7e 100644
--- a/plugins/gitops-profiles/CHANGELOG.md
+++ b/plugins/gitops-profiles/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-gitops-profiles
+## 0.3.30-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.30-next.0
### Patch Changes
diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json
index c3db350ccf..d6a8c8c201 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.30-next.0",
+ "version": "0.3.30-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md
index 9dfa518ae9..f76b3a28b2 100644
--- a/plugins/gocd/CHANGELOG.md
+++ b/plugins/gocd/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-gocd
+## 0.1.18-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.18-next.0
### Patch Changes
diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json
index 7c2982a079..a247804a73 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.18-next.0",
+ "version": "0.1.18-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md
index 1302e76521..bc093de12b 100644
--- a/plugins/graphiql/CHANGELOG.md
+++ b/plugins/graphiql/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-graphiql
+## 0.2.44-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
## 0.2.44-next.0
### Patch Changes
diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json
index 9e98cd73e1..4ed8a59d81 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.44-next.0",
+ "version": "0.2.44-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md
index e72ff879c0..f22719bfee 100644
--- a/plugins/graphql-backend/CHANGELOG.md
+++ b/plugins/graphql-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-graphql-backend
+## 0.1.29-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-catalog-graphql@0.3.16-next.1
+
## 0.1.29-next.0
### Patch Changes
diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json
index b591d309dc..ee1f579836 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.29-next.0",
+ "version": "0.1.29-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md
index dde9480a9c..9544c09547 100644
--- a/plugins/home/CHANGELOG.md
+++ b/plugins/home/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-home
+## 0.4.28-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-stack-overflow@0.1.8-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.4.28-next.0
### Patch Changes
diff --git a/plugins/home/package.json b/plugins/home/package.json
index ac5d35dea1..f3b04b36f9 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.28-next.0",
+ "version": "0.4.28-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md
index eb2cf7b9bd..6c005c866b 100644
--- a/plugins/ilert/CHANGELOG.md
+++ b/plugins/ilert/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-ilert
+## 0.2.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.2.1-next.0
### Patch Changes
diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json
index 6fec626262..745902d77d 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.1-next.0",
+ "version": "0.2.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md
index a770057e25..2292234f6a 100644
--- a/plugins/jenkins-backend/CHANGELOG.md
+++ b/plugins/jenkins-backend/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-jenkins-backend
+## 0.1.29-next.1
+
+### Patch Changes
+
+- cfe2b98fbe: Remove unnecessary dependency promise-any-polyfill
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-jenkins-common@0.1.11-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
## 0.1.29-next.0
### Patch Changes
diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json
index 2bf84d3bc1..b938a79a26 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.29-next.0",
+ "version": "0.1.29-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -36,7 +36,6 @@
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
"jenkins": "^1.0.0",
- "promise-any-polyfill": "^1.0.1",
"winston": "^3.2.1",
"yn": "^4.0.0"
},
diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.ts b/plugins/jenkins-backend/src/service/jenkinsApi.ts
index b9eee42f64..89c9a41f9c 100644
--- a/plugins/jenkins-backend/src/service/jenkinsApi.ts
+++ b/plugins/jenkins-backend/src/service/jenkinsApi.ts
@@ -30,12 +30,6 @@ import {
import { jenkinsExecutePermission } from '@backstage/plugin-jenkins-common';
import { NotAllowedError } from '@backstage/errors';
-if (!Promise.any) {
- (async () => {
- await import('promise-any-polyfill');
- })();
-}
-
export class JenkinsApiImpl {
private static readonly lastBuildTreeSpec = `lastBuild[
number,
diff --git a/plugins/jenkins-common/CHANGELOG.md b/plugins/jenkins-common/CHANGELOG.md
index 9027bb6529..e45d9ae009 100644
--- a/plugins/jenkins-common/CHANGELOG.md
+++ b/plugins/jenkins-common/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-jenkins-common
+## 0.1.11-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
## 0.1.11-next.0
### Patch Changes
diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json
index 4f44a626ce..9c898ea53a 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.11-next.0",
+ "version": "0.1.11-next.1",
"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 576508da14..7aefb32e40 100644
--- a/plugins/jenkins/CHANGELOG.md
+++ b/plugins/jenkins/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-jenkins
+## 0.7.11-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-jenkins-common@0.1.11-next.1
+
## 0.7.11-next.0
### Patch Changes
diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json
index a1d90e3de0..1c9a88e045 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.11-next.0",
+ "version": "0.7.11-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md
index 583858e130..6b9be8a94c 100644
--- a/plugins/kafka-backend/CHANGELOG.md
+++ b/plugins/kafka-backend/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-kafka-backend
+## 0.2.32-next.1
+
+### Patch Changes
+
+- 0b54dbaf7d: Internal tweak to adapt to `kafkajs` 2.2.3
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.2.32-next.0
### Patch Changes
diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json
index a3bdf9d53a..93b662cf50 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.32-next.0",
+ "version": "0.2.32-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kafka-backend/src/types/types.ts b/plugins/kafka-backend/src/types/types.ts
index 1fb9701334..f5ffd6b6c7 100644
--- a/plugins/kafka-backend/src/types/types.ts
+++ b/plugins/kafka-backend/src/types/types.ts
@@ -25,8 +25,19 @@ export interface ClusterDetails {
export type SslConfig = ConnectionOptions | boolean;
-export type SaslConfig = {
- mechanism: 'plain' | 'scram-sha-256' | 'scram-sha-512';
- username: string;
- password: string;
-};
+export type SaslConfig =
+ | {
+ mechanism: 'plain';
+ username: string;
+ password: string;
+ }
+ | {
+ mechanism: 'scram-sha-256';
+ username: string;
+ password: string;
+ }
+ | {
+ mechanism: 'scram-sha-512';
+ username: string;
+ password: string;
+ };
diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md
index 59664b40fb..a2242f66e7 100644
--- a/plugins/kafka/CHANGELOG.md
+++ b/plugins/kafka/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-kafka
+## 0.3.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.12-next.0
### Patch Changes
diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json
index 0aae08d6dc..8d327a6451 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.12-next.0",
+ "version": "0.3.12-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md
index d88425cde2..bc548e9190 100644
--- a/plugins/kubernetes-backend/CHANGELOG.md
+++ b/plugins/kubernetes-backend/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-kubernetes-backend
+## 0.8.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-test-utils@0.1.31-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-kubernetes-common@0.4.5-next.1
+
## 0.8.1-next.0
### Patch Changes
diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json
index 4e17a04bd0..100b67839f 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.8.1-next.0",
+ "version": "0.8.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md
index c7e7e2851e..38fa766fd3 100644
--- a/plugins/kubernetes-common/CHANGELOG.md
+++ b/plugins/kubernetes-common/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-kubernetes-common
+## 0.4.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.1.4-next.1
+
## 0.4.5-next.0
### Patch Changes
diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json
index 0bc877106d..46a58c0cbc 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.4.5-next.0",
+ "version": "0.4.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md
index fcf6872b45..1cf6922e08 100644
--- a/plugins/kubernetes/CHANGELOG.md
+++ b/plugins/kubernetes/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-kubernetes
+## 0.7.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-kubernetes-common@0.4.5-next.1
+
## 0.7.5-next.0
### Patch Changes
diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json
index f85c8f55d4..1ad133c682 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.5-next.0",
+ "version": "0.7.5-next.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 94a1de76a5..ce7bf7e787 100644
--- a/plugins/lighthouse/CHANGELOG.md
+++ b/plugins/lighthouse/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-lighthouse
+## 0.3.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.12-next.0
### Patch Changes
diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json
index 81eb8ae4ad..af732e93c6 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.3.12-next.0",
+ "version": "0.3.12-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md
index 0f77c55636..63b64379f5 100644
--- a/plugins/newrelic-dashboard/CHANGELOG.md
+++ b/plugins/newrelic-dashboard/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-newrelic-dashboard
+## 0.2.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.2.5-next.0
### Patch Changes
diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json
index e18927d13a..0c8fa7eaa3 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.5-next.0",
+ "version": "0.2.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md
index 22f3296a99..7b2da9ac23 100644
--- a/plugins/newrelic/CHANGELOG.md
+++ b/plugins/newrelic/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-newrelic
+## 0.3.30-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.30-next.0
### Patch Changes
diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json
index 1b1cdb748d..91ea1f286e 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.30-next.0",
+ "version": "0.3.30-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md
index a32be25eb3..92519e975c 100644
--- a/plugins/org-react/CHANGELOG.md
+++ b/plugins/org-react/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-org-react
+## 0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json
index ced20576b3..63fe5f2592 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.1-next.0",
+ "version": "0.1.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md
index ff5bafa2c1..81a2f60549 100644
--- a/plugins/org/CHANGELOG.md
+++ b/plugins/org/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-org
+## 0.6.2-next.1
+
+### Patch Changes
+
+- 67cedfe42e: Update `UserProfileCard` and `GroupProfileCard` to not render links unless the `showLinks` prop is set. The primary component for rendering links are the `EntityLinksCard` from plugin-catalog.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.6.1-next.0
### Patch Changes
diff --git a/plugins/org/api-report.md b/plugins/org/api-report.md
index f8cf8afe22..e950b1bc8b 100644
--- a/plugins/org/api-report.md
+++ b/plugins/org/api-report.md
@@ -13,6 +13,7 @@ import { InfoCardVariants } from '@backstage/core-components';
// @public (undocumented)
export const EntityGroupProfileCard: (props: {
variant?: InfoCardVariants | undefined;
+ showLinks?: boolean | undefined;
}) => JSX.Element;
// @public (undocumented)
@@ -32,11 +33,13 @@ export const EntityOwnershipCard: (props: {
// @public (undocumented)
export const EntityUserProfileCard: (props: {
variant?: InfoCardVariants | undefined;
+ showLinks?: boolean | undefined;
}) => JSX.Element;
// @public (undocumented)
export const GroupProfileCard: (props: {
variant?: InfoCardVariants;
+ showLinks?: boolean;
}) => JSX.Element;
// @public (undocumented)
@@ -75,5 +78,6 @@ export const OwnershipCard: (props: {
// @public (undocumented)
export const UserProfileCard: (props: {
variant?: InfoCardVariants;
+ showLinks?: boolean;
}) => JSX.Element;
```
diff --git a/plugins/org/package.json b/plugins/org/package.json
index 8daaf47f65..e85caf83b3 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.1-next.0",
+ "version": "0.6.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx
index 3a6b7c238d..5e795b2710 100644
--- a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx
+++ b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx
@@ -15,43 +15,44 @@
*/
import {
+ ANNOTATION_EDIT_URL,
+ ANNOTATION_LOCATION,
GroupEntity,
RELATION_CHILD_OF,
RELATION_PARENT_OF,
- ANNOTATION_LOCATION,
stringifyEntityRef,
- ANNOTATION_EDIT_URL,
} from '@backstage/catalog-model';
-import {
- catalogApiRef,
- EntityRefLinks,
- getEntityRelations,
- useEntity,
-} from '@backstage/plugin-catalog-react';
-import {
- Box,
- Grid,
- List,
- ListItem,
- ListItemIcon,
- ListItemText,
- Tooltip,
- IconButton,
-} from '@material-ui/core';
-import AccountTreeIcon from '@material-ui/icons/AccountTree';
-import EmailIcon from '@material-ui/icons/Email';
-import GroupIcon from '@material-ui/icons/Group';
-import EditIcon from '@material-ui/icons/Edit';
-import CachedIcon from '@material-ui/icons/Cached';
-import Alert from '@material-ui/lab/Alert';
-import React, { useCallback } from 'react';
import {
Avatar,
InfoCard,
InfoCardVariants,
Link,
} from '@backstage/core-components';
+import {
+ Box,
+ Grid,
+ IconButton,
+ List,
+ ListItem,
+ ListItemIcon,
+ ListItemText,
+ Tooltip,
+} from '@material-ui/core';
+import {
+ EntityRefLinks,
+ catalogApiRef,
+ getEntityRelations,
+ useEntity,
+} from '@backstage/plugin-catalog-react';
+import React, { useCallback } from 'react';
import { alertApiRef, useApi } from '@backstage/core-plugin-api';
+
+import AccountTreeIcon from '@material-ui/icons/AccountTree';
+import Alert from '@material-ui/lab/Alert';
+import CachedIcon from '@material-ui/icons/Cached';
+import EditIcon from '@material-ui/icons/Edit';
+import EmailIcon from '@material-ui/icons/Email';
+import GroupIcon from '@material-ui/icons/Group';
import { LinksGroup } from '../../Meta';
const CardTitle = (props: { title: string }) => (
@@ -62,7 +63,10 @@ const CardTitle = (props: { title: string }) => (
);
/** @public */
-export const GroupProfileCard = (props: { variant?: InfoCardVariants }) => {
+export const GroupProfileCard = (props: {
+ variant?: InfoCardVariants;
+ showLinks?: boolean;
+}) => {
const catalogApi = useApi(catalogApiRef);
const alertApi = useApi(alertApiRef);
const { entity: group } = useEntity();
@@ -191,7 +195,7 @@ export const GroupProfileCard = (props: { variant?: InfoCardVariants }) => {
secondary="Child Groups"
/>
-
+ {props?.showLinks && }
diff --git a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx
index fb0df3d25f..547c636d22 100644
--- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx
+++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx
@@ -156,7 +156,7 @@ describe('Edit Button', () => {
expect(rendered.getByRole('button')).toBeInTheDocument();
});
- it('Should show the extra fields if either links or extra profile are filled', async () => {
+ it('Should not show links by default', async () => {
const annotations: Record = {
'backstage.io/edit-url': 'https://example.com/user.yaml',
};
@@ -206,6 +206,60 @@ describe('Edit Button', () => {
},
),
);
+ expect(rendered.queryByText('Slack')).toBeNull();
+ expect(rendered.queryByText('Google')).toBeNull();
+ });
+
+ it('Should show the links if showLinks is set', async () => {
+ const annotations: Record = {
+ 'backstage.io/edit-url': 'https://example.com/user.yaml',
+ };
+ const userEntity: UserEntity = {
+ apiVersion: 'backstage.io/v1alpha1',
+ kind: 'User',
+ metadata: {
+ name: 'calum.leavy',
+ description: 'Super awesome human',
+ annotations,
+ links: [
+ {
+ url: 'slack://user?team=T00000000&id=U00000000',
+ title: 'Slack',
+ icon: 'message',
+ },
+ {
+ url: 'https://www.google.com',
+ title: 'Google',
+ },
+ ],
+ },
+ spec: {
+ profile: {
+ displayName: 'Calum Leavy',
+ email: 'calum-leavy@example.com',
+ },
+ memberOf: ['ExampleGroup'],
+ },
+ relations: [
+ {
+ type: 'memberOf',
+ targetRef: 'group:default/examplegroup',
+ },
+ ],
+ };
+
+ const rendered = await renderWithEffects(
+ wrapInTestApp(
+
+
+ ,
+ {
+ mountedRoutes: {
+ '/catalog/:namespace/:kind/:name': entityRouteRef,
+ },
+ },
+ ),
+ );
expect(rendered.getByText('Slack')).toBeInTheDocument();
expect(rendered.getByText('Google')).toBeInTheDocument();
});
diff --git a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx
index a35c1c057b..a45658b3a6 100644
--- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx
+++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx
@@ -15,15 +15,16 @@
*/
import {
+ ANNOTATION_EDIT_URL,
RELATION_MEMBER_OF,
UserEntity,
- ANNOTATION_EDIT_URL,
} from '@backstage/catalog-model';
import {
- EntityRefLinks,
- getEntityRelations,
- useEntity,
-} from '@backstage/plugin-catalog-react';
+ Avatar,
+ InfoCard,
+ InfoCardVariants,
+ Link,
+} from '@backstage/core-components';
import {
Box,
Grid,
@@ -34,19 +35,19 @@ import {
ListItemText,
Tooltip,
} from '@material-ui/core';
+import {
+ EntityRefLinks,
+ getEntityRelations,
+ useEntity,
+} from '@backstage/plugin-catalog-react';
+
+import Alert from '@material-ui/lab/Alert';
import EditIcon from '@material-ui/icons/Edit';
import EmailIcon from '@material-ui/icons/Email';
import GroupIcon from '@material-ui/icons/Group';
-import PersonIcon from '@material-ui/icons/Person';
-import Alert from '@material-ui/lab/Alert';
-import React from 'react';
-import {
- Avatar,
- InfoCard,
- InfoCardVariants,
- Link,
-} from '@backstage/core-components';
import { LinksGroup } from '../../Meta';
+import PersonIcon from '@material-ui/icons/Person';
+import React from 'react';
const CardTitle = (props: { title?: string }) =>
props.title ? (
@@ -57,7 +58,10 @@ const CardTitle = (props: { title?: string }) =>
) : null;
/** @public */
-export const UserProfileCard = (props: { variant?: InfoCardVariants }) => {
+export const UserProfileCard = (props: {
+ variant?: InfoCardVariants;
+ showLinks?: boolean;
+}) => {
const { entity: user } = useEntity();
if (!user) {
return User not found;
@@ -130,7 +134,7 @@ export const UserProfileCard = (props: { variant?: InfoCardVariants }) => {
-
+ {props?.showLinks && }
diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md
index 7849f8eab9..9e5a182633 100644
--- a/plugins/pagerduty/CHANGELOG.md
+++ b/plugins/pagerduty/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-pagerduty
+## 0.5.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.5.5-next.0
### Patch Changes
diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json
index 6d11107598..9bd4e80476 100644
--- a/plugins/pagerduty/package.json
+++ b/plugins/pagerduty/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-pagerduty",
"description": "A Backstage plugin that integrates towards PagerDuty",
- "version": "0.5.5-next.0",
+ "version": "0.5.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md
index d031743fbc..297a8df4a6 100644
--- a/plugins/periskop-backend/CHANGELOG.md
+++ b/plugins/periskop-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-periskop-backend
+## 0.1.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+
## 0.1.10-next.0
### Patch Changes
diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json
index a837bc6d31..32da64f6b8 100644
--- a/plugins/periskop-backend/package.json
+++ b/plugins/periskop-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-periskop-backend",
- "version": "0.1.10-next.0",
+ "version": "0.1.10-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md
index 5c5acf7941..fbfd9b6090 100644
--- a/plugins/periskop/CHANGELOG.md
+++ b/plugins/periskop/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-periskop
+## 0.1.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.10-next.0
### Patch Changes
diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json
index f0ab1126a1..1a840b0519 100644
--- a/plugins/periskop/package.json
+++ b/plugins/periskop/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-periskop",
- "version": "0.1.10-next.0",
+ "version": "0.1.10-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md
index 3fb59d8527..4e65e9b6b7 100644
--- a/plugins/permission-backend/CHANGELOG.md
+++ b/plugins/permission-backend/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-permission-backend
+## 0.5.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/plugin-permission-node@0.7.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
## 0.5.14-next.0
### Patch Changes
diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json
index 7eca3e77c6..053a12bb9a 100644
--- a/plugins/permission-backend/package.json
+++ b/plugins/permission-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-permission-backend",
- "version": "0.5.14-next.0",
+ "version": "0.5.14-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/permission-common/CHANGELOG.md b/plugins/permission-common/CHANGELOG.md
index 53931c40dc..eb9aec2da0 100644
--- a/plugins/permission-common/CHANGELOG.md
+++ b/plugins/permission-common/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-permission-common
+## 0.7.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.7.2-next.0
### Patch Changes
diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json
index fb3caa9150..32ba10e1f0 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.2-next.0",
+ "version": "0.7.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md
index 7380e08131..afb5dabe48 100644
--- a/plugins/permission-node/CHANGELOG.md
+++ b/plugins/permission-node/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-permission-node
+## 0.7.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
## 0.7.2-next.0
### Patch Changes
diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json
index 5971448783..1bba7787f4 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.2-next.0",
+ "version": "0.7.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md
index 3219389c85..fc6e7301d2 100644
--- a/plugins/permission-react/CHANGELOG.md
+++ b/plugins/permission-react/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-permission-react
+## 0.4.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
## 0.4.8-next.0
### Patch Changes
diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json
index 43537875c2..4a316b8dcd 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.8-next.0",
+ "version": "0.4.8-next.1",
"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 24b14aa6b2..e9b6298927 100644
--- a/plugins/playlist-backend/CHANGELOG.md
+++ b/plugins/playlist-backend/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-playlist-backend
+## 0.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-test-utils@0.1.31-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/plugin-permission-node@0.7.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-playlist-common@0.1.3-next.1
+
## 0.2.2-next.0
### Patch Changes
diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json
index ddbca7aeac..ab93d75e48 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.2-next.0",
+ "version": "0.2.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/playlist-common/CHANGELOG.md b/plugins/playlist-common/CHANGELOG.md
index 99e2dacdbb..bfcce06ec5 100644
--- a/plugins/playlist-common/CHANGELOG.md
+++ b/plugins/playlist-common/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-playlist-common
+## 0.1.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
## 0.1.3-next.0
### Patch Changes
diff --git a/plugins/playlist-common/package.json b/plugins/playlist-common/package.json
index 01823b4e24..21ad490c14 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.3-next.0",
+ "version": "0.1.3-next.1",
"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 2be4e0375a..277e92de73 100644
--- a/plugins/playlist/CHANGELOG.md
+++ b/plugins/playlist/CHANGELOG.md
@@ -1,5 +1,22 @@
# @backstage/plugin-playlist
+## 0.1.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-playlist-common@0.1.3-next.1
+
## 0.1.3-next.0
### Patch Changes
diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json
index 821b337aa6..8f71461129 100644
--- a/plugins/playlist/package.json
+++ b/plugins/playlist/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-playlist",
- "version": "0.1.3-next.0",
+ "version": "0.1.3-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md
index 771898ed46..e6c245dea8 100644
--- a/plugins/proxy-backend/CHANGELOG.md
+++ b/plugins/proxy-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-proxy-backend
+## 0.2.33-next.1
+
+### Patch Changes
+
+- 03843259b4: Documented the `createRouter` method.
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+
## 0.2.33-next.0
### Patch Changes
diff --git a/plugins/proxy-backend/api-report.md b/plugins/proxy-backend/api-report.md
index b6497adbaf..581e7a904c 100644
--- a/plugins/proxy-backend/api-report.md
+++ b/plugins/proxy-backend/api-report.md
@@ -8,7 +8,7 @@ import express from 'express';
import { Logger } from 'winston';
import { PluginEndpointDiscovery } from '@backstage/backend-common';
-// @public (undocumented)
+// @public
export function createRouter(options: RouterOptions): Promise;
// @public (undocumented)
diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json
index 5bc9bbc241..ef09de88b4 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.33-next.0",
+ "version": "0.2.33-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/proxy-backend/src/service/router.ts b/plugins/proxy-backend/src/service/router.ts
index b7ee7014bc..224c2c6202 100644
--- a/plugins/proxy-backend/src/service/router.ts
+++ b/plugins/proxy-backend/src/service/router.ts
@@ -178,7 +178,24 @@ export function buildMiddleware(
return createProxyMiddleware(filter, fullConfig);
}
-/** @public */
+/**
+ * Creates a new {@link https://expressjs.com/en/api.html#router | "express router"} that proxy each target configured under the `proxy` key of the config
+ * @example
+ * ```ts
+ * let router = await createRouter({logger, config, discovery});
+ * ```
+ * @config
+ * ```yaml
+ * proxy:
+ * simple-example: http://simple.example.com:8080 # Opt 1 Simple URL String
+ * '/larger-example/v1': # Opt 2 `http-proxy-middleware` compatible object
+ * target: http://larger.example.com:8080/svc.v1
+ * headers:
+ * Authorization: Bearer ${EXAMPLE_AUTH_TOKEN}
+ *```
+ * @see https://backstage.io/docs/plugins/proxying
+ * @public
+ */
export async function createRouter(
options: RouterOptions,
): Promise {
diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md
index cf967df7e8..61c7a3a494 100644
--- a/plugins/rollbar-backend/CHANGELOG.md
+++ b/plugins/rollbar-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-rollbar-backend
+## 0.1.36-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+
## 0.1.36-next.0
### Patch Changes
diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json
index 2af265e40c..d52c19b0ca 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.36-next.0",
+ "version": "0.1.36-next.1",
"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 0408c6833f..d1d42ab2d2 100644
--- a/plugins/rollbar/CHANGELOG.md
+++ b/plugins/rollbar/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-rollbar
+## 0.4.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.4.12-next.0
### Patch Changes
diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json
index 43865329b4..0d2e01de48 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.12-next.0",
+ "version": "0.4.12-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md
index 4de8f869b7..38402b36c6 100644
--- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-scaffolder-backend-module-cookiecutter
+## 0.2.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-scaffolder-backend@1.8.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.2.14-next.0
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json
index 00422d15c7..90aa36a12b 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.14-next.0",
+ "version": "0.2.14-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md
index f2c533d287..46e1d6573a 100644
--- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-scaffolder-backend-module-rails
+## 0.4.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-scaffolder-backend@1.8.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.4.7-next.0
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json
index 885cf0ba64..35382b898b 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.7-next.0",
+ "version": "0.4.7-next.1",
"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 0bf5a78f89..5d39d4e307 100644
--- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-scaffolder-backend-module-yeoman
+## 0.2.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-scaffolder-backend@1.8.1-next.1
+ - @backstage/config@1.0.5-next.1
+
## 0.2.12-next.0
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json
index 2f8c0ef92a..2f9c74402e 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.12-next.0",
+ "version": "0.2.12-next.1",
"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 e5a30fcace..8a759ef651 100644
--- a/plugins/scaffolder-backend/CHANGELOG.md
+++ b/plugins/scaffolder-backend/CHANGELOG.md
@@ -1,5 +1,25 @@
# @backstage/plugin-scaffolder-backend
+## 1.8.1-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-catalog-backend@1.6.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/backend-plugin-api@0.1.5-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/plugin-catalog-node@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-scaffolder-common@1.2.3-next.1
+
## 1.8.1-next.0
### Patch Changes
diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md
index 50395ed4c9..0c1b771676 100644
--- a/plugins/scaffolder-backend/api-report.md
+++ b/plugins/scaffolder-backend/api-report.md
@@ -457,7 +457,7 @@ export const createPublishGitlabMergeRequestAction: (options: {
sourcePath?: string | undefined;
targetPath?: string | undefined;
token?: string | undefined;
- commitAction?: 'update' | 'create' | 'delete' | undefined;
+ commitAction?: 'update' | 'delete' | 'create' | undefined;
projectid?: string | undefined;
removeSourceBranch?: boolean | undefined;
assignee?: string | undefined;
diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json
index ae139a6fcf..29ae304e60 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.8.1-next.0",
+ "version": "1.8.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -77,7 +77,7 @@
"vm2": "^3.9.11",
"winston": "^3.2.1",
"yaml": "^2.0.0",
- "zen-observable": "^0.9.0",
+ "zen-observable": "^0.10.0",
"zod": "^3.11.6"
},
"devDependencies": {
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts
index 421afb2329..5eeb73711e 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts
@@ -50,7 +50,9 @@ describe('StorageTaskBroker', () => {
it('should claim a dispatched work item', async () => {
const broker = new StorageTaskBroker(storage, logger);
await broker.dispatch({ spec: {} as TaskSpec });
- await expect(broker.claim()).resolves.toEqual(expect.any(TaskManager));
+ await expect(broker.claim()).resolves.toEqual(
+ expect.any(TaskManager as any),
+ );
});
it('should wait for a dispatched work item', async () => {
@@ -60,7 +62,7 @@ describe('StorageTaskBroker', () => {
await expect(Promise.race([promise, 'waiting'])).resolves.toBe('waiting');
await broker.dispatch({ spec: {} as TaskSpec });
- await expect(promise).resolves.toEqual(expect.any(TaskManager));
+ await expect(promise).resolves.toEqual(expect.any(TaskManager as any));
});
it('should dispatch multiple items and claim them in order', async () => {
@@ -72,9 +74,9 @@ describe('StorageTaskBroker', () => {
const taskA = await broker.claim();
const taskB = await broker.claim();
const taskC = await broker.claim();
- await expect(taskA).toEqual(expect.any(TaskManager));
- await expect(taskB).toEqual(expect.any(TaskManager));
- await expect(taskC).toEqual(expect.any(TaskManager));
+ await expect(taskA).toEqual(expect.any(TaskManager as any));
+ await expect(taskB).toEqual(expect.any(TaskManager as any));
+ await expect(taskC).toEqual(expect.any(TaskManager as any));
await expect(taskA.spec.steps[0].id).toBe('a');
await expect(taskB.spec.steps[0].id).toBe('b');
await expect(taskC.spec.steps[0].id).toBe('c');
diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md
index e0089191db..d37b2219d9 100644
--- a/plugins/scaffolder-common/CHANGELOG.md
+++ b/plugins/scaffolder-common/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-scaffolder-common
+## 1.2.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
## 1.2.3-next.0
### Patch Changes
diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json
index ee86ae545c..c84599b228 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.3-next.0",
+ "version": "1.2.3-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md
index def68546c9..d47bf59283 100644
--- a/plugins/scaffolder/CHANGELOG.md
+++ b/plugins/scaffolder/CHANGELOG.md
@@ -1,5 +1,26 @@
# @backstage/plugin-scaffolder
+## 1.9.0-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/plugin-permission-react@0.4.8-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-scaffolder-common@1.2.3-next.1
+
## 1.9.0-next.0
### Minor Changes
diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json
index 5f99f43939..b76ae9d0f6 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.9.0-next.0",
+ "version": "1.9.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -53,7 +53,7 @@
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
- "@react-hookz/web": "^15.0.0",
+ "@react-hookz/web": "^19.0.0",
"@rjsf/core": "^3.2.1",
"@rjsf/core-v5": "npm:@rjsf/core@^5.0.0-beta.12",
"@rjsf/material-ui": "^3.2.1",
@@ -74,7 +74,7 @@
"react-use": "^17.2.4",
"use-immer": "^0.7.0",
"yaml": "^2.0.0",
- "zen-observable": "^0.9.0",
+ "zen-observable": "^0.10.0",
"zod": "^3.11.6",
"zod-to-json-schema": "^3.18.1"
},
diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md
index 53b506a0a3..200f866368 100644
--- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md
+++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-search-backend-module-elasticsearch
+## 1.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.0.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 1.0.5-next.0
### Patch Changes
diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json
index 0687ecfb20..4ff22640cc 100644
--- a/plugins/search-backend-module-elasticsearch/package.json
+++ b/plugins/search-backend-module-elasticsearch/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-search-backend-module-elasticsearch",
"description": "A module for the search backend that implements search using ElasticSearch",
- "version": "1.0.5-next.0",
+ "version": "1.0.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts
index a33d8939eb..72bab5b3b6 100644
--- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts
+++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts
@@ -335,6 +335,7 @@ export class ElasticSearchSearchEngine implements SearchEngine {
),
nextPageCursor,
previousPageCursor,
+ numberOfResults: result.body.hits.total.value,
};
} catch (error) {
if (error.meta?.body?.error?.type === 'index_not_found_exception') {
diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.test.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.test.ts
index a19687a03b..155a6bbf32 100644
--- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.test.ts
+++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.test.ts
@@ -137,7 +137,7 @@ describe('ElasticSearchSearchEngineIndexer', () => {
},
];
- await TestPipeline.withSubject(indexer).withDocuments(documents).execute();
+ await TestPipeline.fromIndexer(indexer).withDocuments(documents).execute();
// Older indices should have been queried for.
expect(catSpy).toHaveBeenCalled();
@@ -184,7 +184,7 @@ describe('ElasticSearchSearchEngineIndexer', () => {
text: range(2000).join(', '),
}));
- await TestPipeline.withSubject(indexer).withDocuments(documents).execute();
+ await TestPipeline.fromIndexer(indexer).withDocuments(documents).execute();
// Ensure multiple bulk requests were made.
expect(bulkSpy).toHaveBeenCalledTimes(2);
@@ -221,7 +221,7 @@ describe('ElasticSearchSearchEngineIndexer', () => {
catSpy,
);
- await TestPipeline.withSubject(indexer).withDocuments(documents).execute();
+ await TestPipeline.fromIndexer(indexer).withDocuments(documents).execute();
// Final deletion shouldn't be called.
expect(deleteSpy).not.toHaveBeenCalled();
diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md
index 608a147f26..8a088380f0 100644
--- a/plugins/search-backend-module-pg/CHANGELOG.md
+++ b/plugins/search-backend-module-pg/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-search-backend-module-pg
+## 0.4.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-search-backend-node@1.0.5-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 0.4.3-next.0
### Patch Changes
diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json
index a40e42a4de..25ee3cf696 100644
--- a/plugins/search-backend-module-pg/package.json
+++ b/plugins/search-backend-module-pg/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-search-backend-module-pg",
"description": "A module for the search backend that implements search using PostgreSQL",
- "version": "0.4.3-next.0",
+ "version": "0.4.3-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.test.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.test.ts
index 03b9774751..0b9cd96c19 100644
--- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.test.ts
+++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.test.ts
@@ -53,7 +53,7 @@ describe('PgSearchEngineIndexer', () => {
},
];
- await TestPipeline.withSubject(indexer).withDocuments(documents).execute();
+ await TestPipeline.fromIndexer(indexer).withDocuments(documents).execute();
expect(database.getTransaction).toHaveBeenCalledTimes(1);
expect(database.prepareInsert).toHaveBeenCalledTimes(1);
@@ -73,7 +73,7 @@ describe('PgSearchEngineIndexer', () => {
location: `location-${i}`,
}));
- await TestPipeline.withSubject(indexer).withDocuments(documents).execute();
+ await TestPipeline.fromIndexer(indexer).withDocuments(documents).execute();
expect(database.getTransaction).toHaveBeenCalledTimes(1);
expect(database.prepareInsert).toHaveBeenCalledTimes(1);
@@ -92,7 +92,7 @@ describe('PgSearchEngineIndexer', () => {
];
database.prepareInsert.mockRejectedValueOnce(expectedError);
- const result = await TestPipeline.withSubject(indexer)
+ const result = await TestPipeline.fromIndexer(indexer)
.withDocuments(documents)
.execute();
@@ -114,7 +114,7 @@ describe('PgSearchEngineIndexer', () => {
];
database.insertDocuments.mockRejectedValueOnce(expectedError);
- const result = await TestPipeline.withSubject(indexer)
+ const result = await TestPipeline.fromIndexer(indexer)
.withDocuments(documents)
.execute();
@@ -136,7 +136,7 @@ describe('PgSearchEngineIndexer', () => {
];
database.completeInsert.mockRejectedValueOnce(expectedError);
- const result = await TestPipeline.withSubject(indexer)
+ const result = await TestPipeline.fromIndexer(indexer)
.withDocuments(documents)
.execute();
diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md
index 935b51d335..a1295f7130 100644
--- a/plugins/search-backend-node/CHANGELOG.md
+++ b/plugins/search-backend-node/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/plugin-search-backend-node
+## 1.0.5-next.1
+
+### Patch Changes
+
+- de8a975911: Changed to use native `AbortController` and `AbortSignal` from Node.js, instead
+ of the one from `node-abort-controller`. This is possible now that the minimum
+ supported Node.js version of the project is 16.
+
+ Note that their interfaces are very slightly different, but typically not in a
+ way that matters to consumers. If you see any typescript errors as a direct
+ result from this, they are compatible with each other in the ways that we
+ interact with them, and should be possible to type-cast across without ill
+ effects.
+
+- 54c5836f7a: Use of `TestPipeline.withSubject()` is now deprecated. Instead, use the `fromCollator`, `fromDecorator`, or `fromIndexer` static methods to instantiate a test pipeline. You may also use the class' `withCollator`, `withDecorator`, and `withIndexer` instance methods to build test pipelines that consist of multiple test subjects.
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 1.0.5-next.0
### Patch Changes
diff --git a/plugins/search-backend-node/api-report.md b/plugins/search-backend-node/api-report.md
index 62a4eabc26..734bf6e1c0 100644
--- a/plugins/search-backend-node/api-report.md
+++ b/plugins/search-backend-node/api-report.md
@@ -173,7 +173,14 @@ export type ScheduleTaskParameters = {
// @public
export class TestPipeline {
execute(): Promise;
+ static fromCollator(collator: Readable): TestPipeline;
+ static fromDecorator(decorator: Transform): TestPipeline;
+ static fromIndexer(indexer: Writable): TestPipeline;
+ withCollator(collator: Readable): this;
+ withDecorator(decorator: Transform): this;
withDocuments(documents: IndexableDocument[]): TestPipeline;
+ withIndexer(indexer: Writable): this;
+ // @deprecated
static withSubject(subject: Readable | Transform | Writable): TestPipeline;
}
diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json
index 8a15127040..19f1defbfc 100644
--- a/plugins/search-backend-node/package.json
+++ b/plugins/search-backend-node/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-search-backend-node",
"description": "A library for Backstage backend plugins that want to interact with the search backend plugin",
- "version": "1.0.5-next.0",
+ "version": "1.0.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -33,7 +33,6 @@
"lodash": "^4.17.21",
"lunr": "^2.3.9",
"ndjson": "^2.0.0",
- "node-abort-controller": "^3.0.1",
"uuid": "^8.3.2",
"winston": "^3.2.1"
},
diff --git a/plugins/search-backend-node/src/Scheduler.ts b/plugins/search-backend-node/src/Scheduler.ts
index 82d45df090..39c423263c 100644
--- a/plugins/search-backend-node/src/Scheduler.ts
+++ b/plugins/search-backend-node/src/Scheduler.ts
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-import { AbortController } from 'node-abort-controller';
import { Logger } from 'winston';
import { TaskFunction, TaskRunner } from '@backstage/backend-tasks';
diff --git a/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.test.ts b/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.test.ts
index 7120fc7ce5..c08db8f28e 100644
--- a/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.test.ts
+++ b/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.test.ts
@@ -142,7 +142,7 @@ describe('DefaultCatalogCollatorFactory', () => {
});
const collator = await factory.getCollator();
- const pipeline = TestPipeline.withSubject(collator);
+ const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
expect(documents).toHaveLength(2);
diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts
index f0518cd71d..4ef380943f 100644
--- a/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts
+++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts
@@ -381,7 +381,7 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -412,7 +412,7 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -452,7 +452,7 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -495,7 +495,7 @@ describe('LunrSearchEngine', () => {
inspectableSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -544,7 +544,7 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -583,7 +583,7 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -623,7 +623,7 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -663,7 +663,7 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -708,7 +708,7 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -763,10 +763,10 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index-2',
);
- await TestPipeline.withSubject(indexer1)
+ await TestPipeline.fromIndexer(indexer1)
.withDocuments(mockDocuments)
.execute();
- await TestPipeline.withSubject(indexer2)
+ await TestPipeline.fromIndexer(indexer2)
.withDocuments(mockDocuments2)
.execute();
@@ -811,7 +811,7 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -871,14 +871,14 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
const indexer2 = await getActualIndexer(
testLunrSearchEngine,
'test-index-2',
);
- await TestPipeline.withSubject(indexer2)
+ await TestPipeline.fromIndexer(indexer2)
.withDocuments(mockDocuments2)
.execute();
@@ -924,7 +924,7 @@ describe('LunrSearchEngine', () => {
testLunrSearchEngine,
'test-index',
);
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -974,7 +974,7 @@ describe('LunrSearchEngine', () => {
}));
const indexer = await getActualIndexer(testLunrSearchEngine, 'test-index');
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -1112,7 +1112,7 @@ describe('stopword testing', () => {
const indexer = await getActualIndexer(testLunrSearchEngine, 'test-index');
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -1149,7 +1149,7 @@ describe('stopword testing', () => {
const indexer = await getActualIndexer(testLunrSearchEngine, 'test-index');
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
@@ -1186,7 +1186,7 @@ describe('stopword testing', () => {
const indexer = await getActualIndexer(testLunrSearchEngine, 'test-index');
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments(mockDocuments)
.execute();
diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts
index d60f9951f4..ff2c828402 100644
--- a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts
+++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts
@@ -238,6 +238,7 @@ export class LunrSearchEngine implements SearchEngine {
}),
},
})),
+ numberOfResults: results.length,
nextPageCursor,
previousPageCursor,
};
diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngineIndexer.test.ts b/plugins/search-backend-node/src/engines/LunrSearchEngineIndexer.test.ts
index fbb6b153d0..ff76f0fa7c 100644
--- a/plugins/search-backend-node/src/engines/LunrSearchEngineIndexer.test.ts
+++ b/plugins/search-backend-node/src/engines/LunrSearchEngineIndexer.test.ts
@@ -58,7 +58,7 @@ describe('LunrSearchEngineIndexer', () => {
},
];
- await TestPipeline.withSubject(indexer).withDocuments(documents).execute();
+ await TestPipeline.fromIndexer(indexer).withDocuments(documents).execute();
expect(lunrBuilderAddSpy).toHaveBeenCalledWith(documents[0]);
});
@@ -70,7 +70,7 @@ describe('LunrSearchEngineIndexer', () => {
location: `location-${i}`,
}));
- await TestPipeline.withSubject(indexer).withDocuments(documents).execute();
+ await TestPipeline.fromIndexer(indexer).withDocuments(documents).execute();
expect(lunrBuilderAddSpy).toHaveBeenCalledTimes(350);
});
@@ -84,7 +84,7 @@ describe('LunrSearchEngineIndexer', () => {
},
];
- await TestPipeline.withSubject(indexer).withDocuments(documents).execute();
+ await TestPipeline.fromIndexer(indexer).withDocuments(documents).execute();
// Builder ref should be set to location (and only once).
expect(lunrBuilderRefSpy).toHaveBeenCalledTimes(1);
diff --git a/plugins/search-backend-node/src/indexing/BatchSearchEngineIndexer.test.ts b/plugins/search-backend-node/src/indexing/BatchSearchEngineIndexer.test.ts
index b4c9ff9e46..a51a479e7e 100644
--- a/plugins/search-backend-node/src/indexing/BatchSearchEngineIndexer.test.ts
+++ b/plugins/search-backend-node/src/indexing/BatchSearchEngineIndexer.test.ts
@@ -46,7 +46,7 @@ describe('BatchSearchEngineIndexer', () => {
it('should work end-to-end', async () => {
const indexer = new ConcreteBatchIndexer({ batchSize: 1 });
- await TestPipeline.withSubject(indexer)
+ await TestPipeline.fromIndexer(indexer)
.withDocuments([document, document, document])
.execute();
expect(indexSpy).toHaveBeenCalledTimes(3);
diff --git a/plugins/search-backend-node/src/indexing/DecoratorBase.test.ts b/plugins/search-backend-node/src/indexing/DecoratorBase.test.ts
index 12c61bd7d3..875ef11940 100644
--- a/plugins/search-backend-node/src/indexing/DecoratorBase.test.ts
+++ b/plugins/search-backend-node/src/indexing/DecoratorBase.test.ts
@@ -54,7 +54,7 @@ describe('DecoratorBase', () => {
}));
const decorator = new ConcreteDecorator();
- const { documents } = await TestPipeline.withSubject(decorator)
+ const { documents } = await TestPipeline.fromDecorator(decorator)
.withDocuments([document, document, document])
.execute();
@@ -68,7 +68,7 @@ describe('DecoratorBase', () => {
decorateSpy.mockResolvedValue(undefined);
const decorator = new ConcreteDecorator();
- const { documents } = await TestPipeline.withSubject(decorator)
+ const { documents } = await TestPipeline.fromDecorator(decorator)
.withDocuments([document, document, document])
.execute();
@@ -82,7 +82,7 @@ describe('DecoratorBase', () => {
});
const decorator = new ConcreteDecorator();
- const { documents } = await TestPipeline.withSubject(decorator)
+ const { documents } = await TestPipeline.fromDecorator(decorator)
.withDocuments([document, document, document])
.execute();
diff --git a/plugins/search-backend-node/src/test-utils/TestPipeline.ts b/plugins/search-backend-node/src/test-utils/TestPipeline.ts
index 00dd9b3755..33097daae9 100644
--- a/plugins/search-backend-node/src/test-utils/TestPipeline.ts
+++ b/plugins/search-backend-node/src/test-utils/TestPipeline.ts
@@ -37,6 +37,35 @@ export type TestPipelineResult = {
/**
* Test utility for Backstage Search collators, decorators, and indexers.
+ *
+ * @example
+ * An example test checking that a collator provides expected documents.
+ * ```
+ * it('provides expected documents', async () => {
+ * const testSubject = await yourCollatorFactory.getCollator();
+ * const pipeline = TestPipeline.fromCollator(testSubject);
+ *
+ * const { documents } = await pipeline.execute();
+ *
+ * expect(documents).toHaveLength(2);
+ * })
+ * ```
+ *
+ * @example
+ * An example test checking that a decorator behaves as expected.
+ * ```
+ * it('filters private documents', async () => {
+ * const testSubject = await yourDecoratorFactory.getDecorator();
+ * const pipeline = TestPipeline
+ * .fromDecorator(testSubject)
+ * .withDocuments([{ title: 'Private', location: '/private', text: '' }]);
+ *
+ * const { documents } = await pipeline.execute();
+ *
+ * expect(documents).toHaveLength(0);
+ * })
+ * ```
+ *
* @public
*/
export class TestPipeline {
@@ -60,6 +89,9 @@ export class TestPipeline {
/**
* Provide the collator, decorator, or indexer to be tested.
+ *
+ * @deprecated Use `fromCollator`, `fromDecorator` or `fromIndexer` static
+ * methods to create a test pipeline instead.
*/
static withSubject(subject: Readable | Transform | Writable) {
if (subject instanceof Transform) {
@@ -79,6 +111,51 @@ export class TestPipeline {
);
}
+ /**
+ * Create a test pipeline given a collator you want to test.
+ */
+ static fromCollator(collator: Readable) {
+ return new TestPipeline({ collator });
+ }
+
+ /**
+ * Add a collator to the test pipeline.
+ */
+ withCollator(collator: Readable): this {
+ this.collator = collator;
+ return this;
+ }
+
+ /**
+ * Create a test pipeline given a decorator you want to test.
+ */
+ static fromDecorator(decorator: Transform) {
+ return new TestPipeline({ decorator });
+ }
+
+ /**
+ * Add a decorator to the test pipeline.
+ */
+ withDecorator(decorator: Transform): this {
+ this.decorator = decorator;
+ return this;
+ }
+
+ /**
+ * Create a test pipeline given an indexer you want to test.
+ */
+ static fromIndexer(indexer: Writable) {
+ return new TestPipeline({ indexer });
+ }
+
+ /**
+ * Add an indexer to the test pipeline.
+ */
+ withIndexer(indexer: Writable): this {
+ this.indexer = indexer;
+ return this;
+ }
+
/**
* Provide documents for testing decorators and indexers.
*/
diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md
index c468790b9c..ff9bc68f38 100644
--- a/plugins/search-backend/CHANGELOG.md
+++ b/plugins/search-backend/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-search-backend
+## 1.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-search-backend-node@1.0.5-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/plugin-permission-node@0.7.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 1.1.2-next.0
### Patch Changes
diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json
index 3eee5ff5f0..b4479f86bc 100644
--- a/plugins/search-backend/package.json
+++ b/plugins/search-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-search-backend",
"description": "The Backstage backend plugin that provides your backstage app with search",
- "version": "1.1.2-next.0",
+ "version": "1.1.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/search-backend/src/service/AuthorizedSearchEngine.ts b/plugins/search-backend/src/service/AuthorizedSearchEngine.ts
index ade43280be..52c87d76c7 100644
--- a/plugins/search-backend/src/service/AuthorizedSearchEngine.ts
+++ b/plugins/search-backend/src/service/AuthorizedSearchEngine.ts
@@ -205,6 +205,7 @@ export class AuthorizedSearchEngine implements SearchEngine {
(nextPageCursor || filteredResults.length > targetResults)
? encodePageCursor({ page: page + 1 })
: undefined,
+ numberOfResults: undefined,
};
}
diff --git a/plugins/search-common/CHANGELOG.md b/plugins/search-common/CHANGELOG.md
index c0862e460c..1ac65fda99 100644
--- a/plugins/search-common/CHANGELOG.md
+++ b/plugins/search-common/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-search-common
+## 1.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+
## 1.1.2-next.0
### Patch Changes
diff --git a/plugins/search-common/api-report.md b/plugins/search-common/api-report.md
index 61e5d22257..2006689ab9 100644
--- a/plugins/search-common/api-report.md
+++ b/plugins/search-common/api-report.md
@@ -73,6 +73,8 @@ export interface ResultSet {
// (undocumented)
nextPageCursor?: string;
// (undocumented)
+ numberOfResults?: number;
+ // (undocumented)
previousPageCursor?: string;
// (undocumented)
results: Result[];
diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json
index b35c3ab532..e99c8d3c20 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.1.2-next.0",
+ "version": "1.1.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/plugins/search-common/src/types.ts b/plugins/search-common/src/types.ts
index 54abc9e1b1..2ea4a490ca 100644
--- a/plugins/search-common/src/types.ts
+++ b/plugins/search-common/src/types.ts
@@ -87,6 +87,7 @@ export interface ResultSet {
results: Result[];
nextPageCursor?: string;
previousPageCursor?: string;
+ numberOfResults?: number;
}
/**
diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md
index 52c30a7af1..893590d327 100644
--- a/plugins/search-react/CHANGELOG.md
+++ b/plugins/search-react/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-search-react
+## 1.2.2-next.1
+
+### Patch Changes
+
+- a19cffbeed: Update search links to only have header as linkable text
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 1.2.2-next.0
### Patch Changes
diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json
index 4c277daac2..f88dc55302 100644
--- a/plugins/search-react/package.json
+++ b/plugins/search-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-react",
- "version": "1.2.2-next.0",
+ "version": "1.2.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx
index f4260525d6..830cb61780 100644
--- a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx
+++ b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx
@@ -66,21 +66,23 @@ export const DefaultResultListItemComponent = ({
};
return (
-
+ <>
{icon && {icon}}
- ) : (
- result.title
- )
+
+ {highlight?.fields.title ? (
+
+ ) : (
+ result.title
+ )}
+
}
secondary={
{secondaryAction}}
-
+ >
);
};
diff --git a/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx b/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx
index f900e45d45..b19af6eef8 100644
--- a/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx
+++ b/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx
@@ -17,20 +17,34 @@
import React, { useEffect } from 'react';
import { useAnalytics } from '@backstage/core-plugin-api';
import { useSearch } from '../../context';
+import usePrevious from 'react-use/lib/usePrevious';
/**
* Capture search event on term change.
*/
export const TrackSearch = ({ children }: { children: React.ReactChild }) => {
+ const useHasChanged = (value: any) => {
+ const previousVal = usePrevious(value);
+ return previousVal !== value;
+ };
+
const analytics = useAnalytics();
- const { term } = useSearch();
+ const { term, result } = useSearch();
+
+ const numberOfResults = result.value?.numberOfResults ?? undefined;
+
+ // Stops the analtyics event from firing before the new search engine response is returned
+ const hasStartedLoading = useHasChanged(result.loading);
+ const hasFinishedLoading = hasStartedLoading && !result.loading;
useEffect(() => {
- if (term) {
- // Capture analytics search event with search term provided as value
- analytics.captureEvent('search', term);
+ if (term && hasFinishedLoading) {
+ // Capture analytics search event with search term and numberOfResults (provided as value)
+ analytics.captureEvent('search', term, {
+ value: numberOfResults,
+ });
}
- }, [analytics, term]);
+ }, [analytics, term, numberOfResults, hasFinishedLoading]);
return <>{children}>;
};
diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md
index 5abbc5847b..b3fae44279 100644
--- a/plugins/search/CHANGELOG.md
+++ b/plugins/search/CHANGELOG.md
@@ -1,5 +1,22 @@
# @backstage/plugin-search
+## 1.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 1.0.5-next.0
### Patch Changes
diff --git a/plugins/search/package.json b/plugins/search/package.json
index 7602e96273..63c1e745fd 100644
--- a/plugins/search/package.json
+++ b/plugins/search/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-search",
"description": "The Backstage plugin that provides your backstage app with search",
- "version": "1.0.5-next.0",
+ "version": "1.0.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md
index 9bc0d89bf0..f90e2e2b67 100644
--- a/plugins/sentry/CHANGELOG.md
+++ b/plugins/sentry/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-sentry
+## 0.4.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.4.5-next.0
### Patch Changes
diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json
index 4d83821fef..4e9ee0855c 100644
--- a/plugins/sentry/package.json
+++ b/plugins/sentry/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-sentry",
"description": "A Backstage plugin that integrates towards Sentry",
- "version": "0.4.5-next.0",
+ "version": "0.4.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md
index 9caaea3d44..761e108300 100644
--- a/plugins/shortcuts/CHANGELOG.md
+++ b/plugins/shortcuts/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-shortcuts
+## 0.3.4-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.4-next.0
### Patch Changes
diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json
index a32a83989f..9801d321ba 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.4-next.0",
+ "version": "0.3.4-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,7 +34,7 @@
"react-hook-form": "^7.12.2",
"react-use": "^17.2.4",
"uuid": "^8.3.2",
- "zen-observable": "^0.9.0"
+ "zen-observable": "^0.10.0"
},
"peerDependencies": {
"react": "^16.13.1 || ^17.0.0",
diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md
index e574f9677e..b32dbe6430 100644
--- a/plugins/sonarqube-backend/CHANGELOG.md
+++ b/plugins/sonarqube-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-sonarqube-backend
+## 0.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.1.4-next.0
### Patch Changes
diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json
index ba46e2bcc1..5c1191d754 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.4-next.0",
+ "version": "0.1.4-next.1",
"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 4fdf03eb53..48f42d6bb2 100644
--- a/plugins/sonarqube/CHANGELOG.md
+++ b/plugins/sonarqube/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-sonarqube
+## 0.5.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.5.1-next.0
### Patch Changes
diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json
index cc3757ac3c..3f0ac89e28 100644
--- a/plugins/sonarqube/package.json
+++ b/plugins/sonarqube/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-sonarqube",
"description": "",
- "version": "0.5.1-next.0",
+ "version": "0.5.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md
index 0fdd94313d..1e99d05403 100644
--- a/plugins/splunk-on-call/CHANGELOG.md
+++ b/plugins/splunk-on-call/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-splunk-on-call
+## 0.4.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.4.1-next.0
### Patch Changes
diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json
index f1abb63b97..a47d691e25 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.1-next.0",
+ "version": "0.4.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md
index ebeefd5cbd..6fdc174fb5 100644
--- a/plugins/stack-overflow-backend/CHANGELOG.md
+++ b/plugins/stack-overflow-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-stack-overflow-backend
+## 0.1.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.21.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 0.1.8-next.0
### Patch Changes
diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json
index 80c45c3554..5a58f54958 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.8-next.0",
+ "version": "0.1.8-next.1",
"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 7bc2866dfe..26b2388e4a 100644
--- a/plugins/stack-overflow/CHANGELOG.md
+++ b/plugins/stack-overflow/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-stack-overflow
+## 0.1.8-next.1
+
+### Patch Changes
+
+- a19cffbeed: Update search links to only have header as linkable text
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-home@0.4.28-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 0.1.8-next.0
### Patch Changes
diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json
index cc0f6f615a..df1724ac16 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.8-next.0",
+ "version": "0.1.8-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.tsx b/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.tsx
index 581fe34dfb..6a2c8f5889 100644
--- a/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.tsx
+++ b/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.tsx
@@ -47,13 +47,17 @@ export const StackOverflowSearchResultListItem = (
};
return (
-
+ <>
{props.icon && {props.icon}}
+ {_unescape(title)}
+
+ }
secondary={`Author: ${text}`}
/>
@@ -64,6 +68,6 @@ export const StackOverflowSearchResultListItem = (
-
+ >
);
};
diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md
index c315132091..0b192f5ead 100644
--- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md
+++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-tech-insights-backend-module-jsonfc
+## 0.1.23-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-tech-insights-node@0.3.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-tech-insights-common@0.2.9-next.1
+
## 0.1.23-next.0
### Patch Changes
diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json
index 3d62c81e96..26b03afe5d 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.23-next.0",
+ "version": "0.1.23-next.1",
"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 fa416ea7ac..6001f2814d 100644
--- a/plugins/tech-insights-backend/CHANGELOG.md
+++ b/plugins/tech-insights-backend/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-tech-insights-backend
+## 0.5.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-tech-insights-node@0.3.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-tech-insights-common@0.2.9-next.1
+
## 0.5.5-next.0
### Patch Changes
diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json
index fa573ae6c6..e4ec85af2e 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.5-next.0",
+ "version": "0.5.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/tech-insights-common/CHANGELOG.md b/plugins/tech-insights-common/CHANGELOG.md
index 97917ca063..7988e80e5d 100644
--- a/plugins/tech-insights-common/CHANGELOG.md
+++ b/plugins/tech-insights-common/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-tech-insights-common
+## 0.2.9-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.2-next.1
+
## 0.2.9-next.0
### Patch Changes
diff --git a/plugins/tech-insights-common/package.json b/plugins/tech-insights-common/package.json
index 7a11122a63..386b747a17 100644
--- a/plugins/tech-insights-common/package.json
+++ b/plugins/tech-insights-common/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-tech-insights-common",
- "version": "0.2.9-next.0",
+ "version": "0.2.9-next.1",
"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 53f8656181..47e6a51492 100644
--- a/plugins/tech-insights-node/CHANGELOG.md
+++ b/plugins/tech-insights-node/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-tech-insights-node
+## 0.3.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/plugin-tech-insights-common@0.2.9-next.1
+
## 0.3.7-next.0
### Patch Changes
diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json
index 7096496e3f..6631c51f09 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.3.7-next.0",
+ "version": "0.3.7-next.1",
"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 3415704918..aae7fc47be 100644
--- a/plugins/tech-insights/CHANGELOG.md
+++ b/plugins/tech-insights/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-tech-insights
+## 0.3.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-tech-insights-common@0.2.9-next.1
+
## 0.3.4-next.0
### Patch Changes
diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json
index 48dd4362be..56d5389d8a 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.4-next.0",
+ "version": "0.3.4-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md
index 36d1932684..53e6d3a920 100644
--- a/plugins/tech-radar/CHANGELOG.md
+++ b/plugins/tech-radar/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-tech-radar
+## 0.5.19-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/theme@0.2.16
+
## 0.5.19-next.0
### Patch Changes
diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json
index 599cb2db96..7508859a9b 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.5.19-next.0",
+ "version": "0.5.19-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md
index 70ad579f17..8fa0cbcc69 100644
--- a/plugins/techdocs-addons-test-utils/CHANGELOG.md
+++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-techdocs-addons-test-utils
+## 1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-catalog@1.6.2-next.1
+ - @backstage/plugin-techdocs@1.4.1-next.1
+ - @backstage/test-utils@1.2.3-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/plugin-techdocs-react@1.0.7-next.1
+ - @backstage/theme@0.2.16
+
## 1.0.7-next.0
### Patch Changes
diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json
index 2721ff9348..892e865e20 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.7-next.0",
+ "version": "1.0.7-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md
index 8c6f8ff66a..50eeab7df3 100644
--- a/plugins/techdocs-backend/CHANGELOG.md
+++ b/plugins/techdocs-backend/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-techdocs-backend
+## 1.4.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/plugin-techdocs-node@1.4.3-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-catalog-common@1.0.9-next.1
+ - @backstage/plugin-permission-common@0.7.2-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 1.4.2-next.0
### Patch Changes
diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json
index c9f7364500..1948d49271 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.4.2-next.0",
+ "version": "1.4.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.test.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.test.ts
index 659f4783ce..d9329151c6 100644
--- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.test.ts
+++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.test.ts
@@ -145,7 +145,7 @@ describe('DefaultTechDocsCollatorFactory', () => {
});
it('fetches from the configured catalog and tech docs services', async () => {
- const pipeline = TestPipeline.withSubject(collator);
+ const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
expect(mockDiscoveryApi.getBaseUrl).toHaveBeenCalledWith('catalog');
expect(mockDiscoveryApi.getBaseUrl).toHaveBeenCalledWith('techdocs');
@@ -153,7 +153,7 @@ describe('DefaultTechDocsCollatorFactory', () => {
});
it('should create documents for each tech docs search index', async () => {
- const pipeline = TestPipeline.withSubject(collator);
+ const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
const entity = expectedEntities[0];
documents.forEach((document, idx) => {
@@ -182,7 +182,7 @@ describe('DefaultTechDocsCollatorFactory', () => {
});
collator = await factory.getCollator();
- const pipeline = TestPipeline.withSubject(collator);
+ const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
expect(documents[0]).toMatchObject({
@@ -200,7 +200,7 @@ describe('DefaultTechDocsCollatorFactory', () => {
});
collator = await factory.getCollator();
- const pipeline = TestPipeline.withSubject(collator);
+ const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
// Only 1 entity with TechDocs configured multiplied by 3 pages.
@@ -222,7 +222,7 @@ describe('DefaultTechDocsCollatorFactory', () => {
});
it('should create documents for each tech docs search index', async () => {
- const pipeline = TestPipeline.withSubject(collator);
+ const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
const entity = expectedEntities[0];
documents.forEach((document, idx) => {
diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md
index 8da781817a..0f91a3aeb4 100644
--- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md
+++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-techdocs-module-addons-contrib
+## 1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/plugin-techdocs-react@1.0.7-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/theme@0.2.16
+
## 1.0.7-next.0
### Patch Changes
diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json
index beb5a8ddf1..54cebd0ec9 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.7-next.0",
+ "version": "1.0.7-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -42,7 +42,7 @@
"@material-ui/core": "^4.9.13",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
- "@react-hookz/web": "^15.0.0",
+ "@react-hookz/web": "^19.0.0",
"git-url-parse": "^13.0.0",
"react-use": "^17.2.4"
},
diff --git a/plugins/techdocs-module-addons-contrib/src/ExpandableNavigation/ExpandableNavigation.tsx b/plugins/techdocs-module-addons-contrib/src/ExpandableNavigation/ExpandableNavigation.tsx
index 5ef76187e3..802e377f42 100644
--- a/plugins/techdocs-module-addons-contrib/src/ExpandableNavigation/ExpandableNavigation.tsx
+++ b/plugins/techdocs-module-addons-contrib/src/ExpandableNavigation/ExpandableNavigation.tsx
@@ -61,10 +61,10 @@ type expandableNavigationLocalStorage = {
*/
export const ExpandableNavigationAddon = () => {
const defaultValue = { expandAllNestedNavs: false };
- const [expanded, setExpanded] =
+ const { value: expanded, set: setExpanded } =
useLocalStorageValue(
EXPANDABLE_NAVIGATION_LOCAL_STORAGE,
- defaultValue,
+ { defaultValue },
);
const [hasNavSubLevels, setHasNavSubLevels] = useState(false);
diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md
index 981eff2be9..65e0d267fe 100644
--- a/plugins/techdocs-node/CHANGELOG.md
+++ b/plugins/techdocs-node/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/plugin-techdocs-node
+## 1.4.3-next.1
+
+### Patch Changes
+
+- 0a61aab172: Bump dependency @azure/identity to next minor
+- 37931c33ce: Upgrade to AWS SDK for Javascript v3
+
+ Techdocs support for AWS S3 now requires defining the AWS region to connect to.
+ If `techdocs.publisher.awsS3.region` is missing from the config, the AWS environment variable `AWS_REGION` will be used.
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 1.4.3-next.0
### Patch Changes
@@ -1152,7 +1170,7 @@
### Minor Changes
-- bc9d62f4f: Move the sanity checks of the publisher configurations to a dedicated `PublisherBase#getReadiness()` method instead of throwing an error when doing `Publisher.fromConfig(...)`.
+- bc9d62f4f: Move the confidence checks of the publisher configurations to a dedicated `PublisherBase#getReadiness()` method instead of throwing an error when doing `Publisher.fromConfig(...)`.
You should include the check when your backend to get early feedback about a potential misconfiguration:
```diff
diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json
index ef900f49f9..1051527e8a 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.4.3-next.0",
+ "version": "1.4.3-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
@@ -39,6 +39,10 @@
"url": "https://github.com/backstage/backstage/issues"
},
"dependencies": {
+ "@aws-sdk/client-s3": "^3.208.0",
+ "@aws-sdk/credential-providers": "^3.208.0",
+ "@aws-sdk/lib-storage": "^3.208.0",
+ "@aws-sdk/types": "^3.208.0",
"@azure/identity": "^2.1.0",
"@azure/storage-blob": "^12.5.0",
"@backstage/backend-common": "workspace:^",
@@ -50,7 +54,6 @@
"@google-cloud/storage": "^6.0.0",
"@trendyol-js/openstack-swift-sdk": "^0.0.5",
"@types/express": "^4.17.6",
- "aws-sdk": "^2.840.0",
"express": "^4.17.1",
"fs-extra": "10.1.0",
"git-url-parse": "^13.0.0",
@@ -70,6 +73,7 @@
"@types/mock-fs": "^4.13.0",
"@types/recursive-readdir": "^2.2.0",
"@types/supertest": "^2.0.8",
+ "aws-sdk-client-mock": "^2.0.0",
"supertest": "^6.1.3"
}
}
diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts
index 52d654d159..08facf2208 100644
--- a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts
+++ b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts
@@ -14,119 +14,31 @@
* limitations under the License.
*/
+import {
+ DeleteObjectCommand,
+ GetObjectCommand,
+ HeadBucketCommand,
+ HeadObjectCommand,
+ ListObjectsV2Command,
+ PutObjectCommand,
+ S3Client,
+ UploadPartCommand,
+} from '@aws-sdk/client-s3';
import { getVoidLogger } from '@backstage/backend-common';
import { Entity, DEFAULT_NAMESPACE } from '@backstage/catalog-model';
import { ConfigReader } from '@backstage/config';
+import { mockClient, AwsClientStub } from 'aws-sdk-client-mock';
import express from 'express';
import request from 'supertest';
import mockFs from 'mock-fs';
import path from 'path';
-import fs, { ReadStream } from 'fs-extra';
-import { EventEmitter } from 'events';
+import fs from 'fs-extra';
import { AwsS3Publish } from './awsS3';
import { storageRootDir } from '../../testUtils/StorageFilesMock';
+import { Readable } from 'stream';
-jest.mock('aws-sdk', () => {
- const { StorageFilesMock } = require('../../testUtils/StorageFilesMock');
- const storage = new StorageFilesMock();
-
- return {
- __esModule: true,
- Credentials: jest.requireActual('aws-sdk').Credentials,
- default: {
- S3: class {
- constructor() {
- storage.emptyFiles();
- }
-
- headObject({ Key }: { Key: string }) {
- return {
- promise: async () => {
- if (!storage.fileExists(Key)) {
- throw new Error('File does not exist');
- }
- },
- };
- }
-
- getObject({ Key }: { Key: string }) {
- return {
- promise: async () => storage.fileExists(Key),
- createReadStream: () => {
- const emitter = new EventEmitter();
- process.nextTick(() => {
- if (storage.fileExists(Key)) {
- emitter.emit('data', Buffer.from(storage.readFile(Key)));
- emitter.emit('end');
- } else {
- emitter.emit(
- 'error',
- new Error(`The file ${Key} does not exist!`),
- );
- }
- });
- return emitter;
- },
- };
- }
-
- headBucket({ Bucket }: { Bucket: string }) {
- return {
- promise: async () => {
- if (Bucket === 'errorBucket') {
- throw new Error('Bucket does not exist');
- }
- return {};
- },
- };
- }
-
- upload({ Key, Body }: { Key: string; Body: ReadStream }) {
- return {
- promise: () =>
- new Promise(async resolve => {
- const chunks = new Array();
- Body.on('data', chunk => {
- chunks.push(chunk as Buffer);
- });
- Body.once('end', () => {
- storage.writeFile(Key, Buffer.concat(chunks));
- resolve(null);
- });
- }),
- };
- }
-
- listObjectsV2({ Bucket }: { Bucket: string }) {
- return {
- promise: () => {
- if (
- Bucket === 'delete_stale_files_success' ||
- Bucket === 'delete_stale_files_error'
- ) {
- return Promise.resolve({
- Contents: [{ Key: 'stale_file.png' }],
- });
- }
- return Promise.resolve({});
- },
- };
- }
-
- deleteObject({ Bucket }: { Bucket: string }) {
- return {
- promise: () => {
- if (Bucket === 'delete_stale_files_error') {
- throw new Error('Message');
- }
- return Promise.resolve();
- },
- };
- }
- },
- },
- };
-});
+const env = process.env;
+let s3Mock: AwsClientStub;
const getEntityRootDir = (entity: Entity) => {
const {
@@ -137,6 +49,23 @@ const getEntityRootDir = (entity: Entity) => {
return path.join(storageRootDir, namespace || DEFAULT_NAMESPACE, kind, name);
};
+class ErrorReadable extends Readable {
+ errorMessage: string;
+
+ constructor(errorMessage: string) {
+ super();
+ this.errorMessage = errorMessage;
+ }
+
+ _read() {
+ this.destroy(new Error(this.errorMessage));
+ }
+
+ _destroy(error: Error | null, callback: (error?: Error | null) => void) {
+ callback(error);
+ }
+}
+
const logger = getVoidLogger();
const loggerInfoSpy = jest.spyOn(logger, 'info');
const loggerErrorSpy = jest.spyOn(logger, 'error');
@@ -219,13 +148,71 @@ describe('AwsS3Publish', () => {
};
beforeEach(() => {
+ process.env = { ...env };
+ process.env.AWS_REGION = 'us-west-2';
+
mockFs({
[directory]: files,
});
+
+ const { StorageFilesMock } = require('../../testUtils/StorageFilesMock');
+ const storage = new StorageFilesMock();
+ storage.emptyFiles();
+
+ s3Mock = mockClient(S3Client);
+
+ s3Mock.on(HeadObjectCommand).callsFake(input => {
+ if (!storage.fileExists(input.Key)) {
+ throw new Error('File does not exist');
+ }
+ return {};
+ });
+
+ s3Mock.on(GetObjectCommand).callsFake(input => {
+ if (storage.fileExists(input.Key)) {
+ return {
+ Body: Readable.from(storage.readFile(input.Key)),
+ };
+ }
+
+ throw new Error(`The file ${input.Key} does not exist!`);
+ });
+
+ s3Mock.on(HeadBucketCommand).callsFake(input => {
+ if (input.Bucket === 'errorBucket') {
+ throw new Error('Bucket does not exist');
+ }
+ return {};
+ });
+
+ s3Mock.on(ListObjectsV2Command).callsFake(input => {
+ if (
+ input.Bucket === 'delete_stale_files_success' ||
+ input.Bucket === 'delete_stale_files_error'
+ ) {
+ return {
+ Contents: [{ Key: 'stale_file.png' }],
+ };
+ }
+ return {};
+ });
+
+ s3Mock.on(DeleteObjectCommand).callsFake(input => {
+ if (input.Bucket === 'delete_stale_files_error') {
+ throw new Error('Message');
+ }
+ return {};
+ });
+
+ s3Mock.on(UploadPartCommand).rejects();
+ s3Mock.on(PutObjectCommand).callsFake(input => {
+ storage.writeFile(input.Key, input.Body);
+ });
});
afterEach(() => {
mockFs.restore();
+ process.env = env;
});
describe('getReadiness', () => {
@@ -476,9 +463,33 @@ describe('AwsS3Publish', () => {
const fails = publisher.fetchTechDocsMetadata(invalidEntityName);
+ await expect(fails).rejects.toMatchObject({
+ message: expect.stringContaining(
+ 'The file invalid/triplet/path/techdocs_metadata.json does not exist',
+ ),
+ });
+ });
+
+ it('should return an error if the techdocs_metadata.json file cannot be read from stream', async () => {
+ s3Mock.on(GetObjectCommand).callsFake(_ => {
+ return {
+ Body: new ErrorReadable('No stream!'),
+ };
+ });
+
+ const publisher = createPublisherFromConfig();
+
+ const invalidEntityName = {
+ namespace: 'invalid',
+ kind: 'triplet',
+ name: 'path',
+ };
+
+ const fails = publisher.fetchTechDocsMetadata(invalidEntityName);
+
await expect(fails).rejects.toMatchObject({
message: expect.stringMatching(
- 'TechDocs metadata fetch failed; caused by Error: Unable to read stream; caused by Error: The file invalid/triplet/path/techdocs_metadata.json does not exist',
+ 'TechDocs metadata fetch failed; caused by Error: Unable to read stream; caused by Error: No stream!',
),
});
});
@@ -597,5 +608,22 @@ describe('AwsS3Publish', () => {
'File Not Found',
);
});
+
+ it('should return 404 if file cannot be read from stream', async () => {
+ s3Mock.on(GetObjectCommand).callsFake(_ => {
+ return {
+ Body: new ErrorReadable('No stream!'),
+ };
+ });
+
+ const response = await request(app).get(
+ `/${entityTripletPath}/not-found.html`,
+ );
+ expect(response.status).toBe(404);
+
+ expect(Buffer.from(response.text).toString('utf8')).toEqual(
+ 'File Not Found',
+ );
+ });
});
});
diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.ts b/plugins/techdocs-node/src/stages/publish/awsS3.ts
index 67a4157a5b..7c2405cc1c 100644
--- a/plugins/techdocs-node/src/stages/publish/awsS3.ts
+++ b/plugins/techdocs-node/src/stages/publish/awsS3.ts
@@ -16,9 +16,23 @@
import { Entity, CompoundEntityRef } from '@backstage/catalog-model';
import { Config } from '@backstage/config';
import { assertError, ForwardedError } from '@backstage/errors';
-import aws, { Credentials } from 'aws-sdk';
-import { ListObjectsV2Output } from 'aws-sdk/clients/s3';
-import { CredentialsOptions } from 'aws-sdk/lib/credentials';
+import {
+ GetObjectCommand,
+ CopyObjectCommand,
+ DeleteObjectCommand,
+ HeadBucketCommand,
+ HeadObjectCommand,
+ PutObjectCommandInput,
+ ListObjectsV2CommandOutput,
+ ListObjectsV2Command,
+ S3Client,
+} from '@aws-sdk/client-s3';
+import {
+ fromNodeProviderChain,
+ fromTemporaryCredentials,
+} from '@aws-sdk/credential-providers';
+import { Upload } from '@aws-sdk/lib-storage';
+import { CredentialProvider } from '@aws-sdk/types';
import express from 'express';
import fs from 'fs-extra';
import JSON5 from 'json5';
@@ -60,7 +74,7 @@ const streamToBuffer = (stream: Readable): Promise => {
};
export class AwsS3Publish implements PublisherBase {
- private readonly storageClient: aws.S3;
+ private readonly storageClient: S3Client;
private readonly bucketName: string;
private readonly legacyPathCasing: boolean;
private readonly logger: Logger;
@@ -68,7 +82,7 @@ export class AwsS3Publish implements PublisherBase {
private readonly sse?: 'aws:kms' | 'AES256';
constructor(options: {
- storageClient: aws.S3;
+ storageClient: S3Client;
bucketName: string;
legacyPathCasing: boolean;
logger: Logger;
@@ -103,6 +117,10 @@ export class AwsS3Publish implements PublisherBase {
| 'AES256'
| undefined;
+ // AWS Region is an optional config. If missing, default AWS env variable AWS_REGION
+ // or AWS shared credentials file at ~/.aws/credentials will be used.
+ const region = config.getOptionalString('techdocs.publisher.awsS3.region');
+
// Credentials is an optional config. If missing, the default ways of authenticating AWS SDK V2 will be used.
// 1. AWS environment variables
// https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-environment.html
@@ -113,11 +131,10 @@ export class AwsS3Publish implements PublisherBase {
const credentialsConfig = config.getOptionalConfig(
'techdocs.publisher.awsS3.credentials',
);
- const credentials = AwsS3Publish.buildCredentials(credentialsConfig);
-
- // AWS Region is an optional config. If missing, default AWS env variable AWS_REGION
- // or AWS shared credentials file at ~/.aws/credentials will be used.
- const region = config.getOptionalString('techdocs.publisher.awsS3.region');
+ const credentials = AwsS3Publish.buildCredentials(
+ credentialsConfig,
+ region,
+ );
// AWS endpoint is an optional config. If missing, the default endpoint is built from
// the configured region.
@@ -131,8 +148,9 @@ export class AwsS3Publish implements PublisherBase {
'techdocs.publisher.awsS3.s3ForcePathStyle',
);
- const storageClient = new aws.S3({
- credentials,
+ const storageClient = new S3Client({
+ customUserAgent: 'backstage-aws-techdocs-s3-publisher',
+ credentialDefaultProvider: () => credentials,
...(region && { region }),
...(endpoint && { endpoint }),
...(s3ForcePathStyle && { s3ForcePathStyle }),
@@ -153,31 +171,42 @@ export class AwsS3Publish implements PublisherBase {
});
}
+ private static buildStaticCredentials(
+ accessKeyId: string,
+ secretAccessKey: string,
+ ): CredentialProvider {
+ return async () => {
+ return Promise.resolve({
+ accessKeyId,
+ secretAccessKey,
+ });
+ };
+ }
+
private static buildCredentials(
config?: Config,
- ): Credentials | CredentialsOptions | undefined {
+ region?: string,
+ ): CredentialProvider {
if (!config) {
- return undefined;
+ return fromNodeProviderChain();
}
const accessKeyId = config.getOptionalString('accessKeyId');
const secretAccessKey = config.getOptionalString('secretAccessKey');
- let explicitCredentials: Credentials | undefined;
- if (accessKeyId && secretAccessKey) {
- explicitCredentials = new Credentials({
- accessKeyId,
- secretAccessKey,
- });
- }
+ const explicitCredentials: CredentialProvider =
+ accessKeyId && secretAccessKey
+ ? AwsS3Publish.buildStaticCredentials(accessKeyId, secretAccessKey)
+ : fromNodeProviderChain();
const roleArn = config.getOptionalString('roleArn');
if (roleArn) {
- return new aws.ChainableTemporaryCredentials({
+ return fromTemporaryCredentials({
masterCredentials: explicitCredentials,
params: {
RoleSessionName: 'backstage-aws-techdocs-s3-publisher',
RoleArn: roleArn,
},
+ clientConfig: { region },
});
}
@@ -190,9 +219,9 @@ export class AwsS3Publish implements PublisherBase {
*/
async getReadiness(): Promise {
try {
- await this.storageClient
- .headBucket({ Bucket: this.bucketName })
- .promise();
+ await this.storageClient.send(
+ new HeadBucketCommand({ Bucket: this.bucketName }),
+ );
this.logger.info(
`Successfully connected to the AWS S3 bucket ${this.bucketName}.`,
@@ -258,7 +287,7 @@ export class AwsS3Publish implements PublisherBase {
const relativeFilePath = path.relative(directory, absoluteFilePath);
const fileStream = fs.createReadStream(absoluteFilePath);
- const params = {
+ const params: PutObjectCommandInput = {
Bucket: this.bucketName,
Key: getCloudPathForLocalPath(
entity,
@@ -268,10 +297,15 @@ export class AwsS3Publish implements PublisherBase {
),
Body: fileStream,
...(sse && { ServerSideEncryption: sse }),
- } as aws.S3.PutObjectRequest;
+ };
- objects.push(params.Key);
- return this.storageClient.upload(params).promise();
+ objects.push(params.Key!);
+
+ const upload = new Upload({
+ client: this.storageClient,
+ params,
+ });
+ return upload.done();
},
absoluteFilesToUpload,
{ concurrencyLimit: 10 },
@@ -301,12 +335,12 @@ export class AwsS3Publish implements PublisherBase {
await bulkStorageOperation(
async relativeFilePath => {
- return await this.storageClient
- .deleteObject({
+ return await this.storageClient.send(
+ new DeleteObjectCommand({
Bucket: this.bucketName,
Key: relativeFilePath,
- })
- .promise();
+ }),
+ );
},
staleFiles,
{ concurrencyLimit: 10 },
@@ -334,15 +368,17 @@ export class AwsS3Publish implements PublisherBase {
const entityRootDir = path.posix.join(this.bucketRootPath, entityDir);
- const stream = this.storageClient
- .getObject({
- Bucket: this.bucketName,
- Key: `${entityRootDir}/techdocs_metadata.json`,
- })
- .createReadStream();
-
try {
- const techdocsMetadataJson = await streamToBuffer(stream);
+ const resp = await this.storageClient.send(
+ new GetObjectCommand({
+ Bucket: this.bucketName,
+ Key: `${entityRootDir}/techdocs_metadata.json`,
+ }),
+ );
+
+ const techdocsMetadataJson = await streamToBuffer(
+ resp.Body as Readable,
+ );
if (!techdocsMetadataJson) {
throw new Error(
`Unable to parse the techdocs metadata file ${entityRootDir}/techdocs_metadata.json.`,
@@ -384,10 +420,11 @@ export class AwsS3Publish implements PublisherBase {
const fileExtension = path.extname(filePath);
const responseHeaders = getHeadersForFileExtension(fileExtension);
- const stream = this.storageClient
- .getObject({ Bucket: this.bucketName, Key: filePath })
- .createReadStream();
try {
+ const resp = await this.storageClient.send(
+ new GetObjectCommand({ Bucket: this.bucketName, Key: filePath }),
+ );
+
// Inject response headers
for (const [headerKey, headerValue] of Object.entries(
responseHeaders,
@@ -395,7 +432,7 @@ export class AwsS3Publish implements PublisherBase {
res.setHeader(headerKey, headerValue);
}
- res.send(await streamToBuffer(stream));
+ res.send(await streamToBuffer(resp.Body as Readable));
} catch (err) {
assertError(err);
this.logger.warn(
@@ -419,12 +456,12 @@ export class AwsS3Publish implements PublisherBase {
const entityRootDir = path.posix.join(this.bucketRootPath, entityDir);
- await this.storageClient
- .headObject({
+ await this.storageClient.send(
+ new HeadObjectCommand({
Bucket: this.bucketName,
Key: `${entityRootDir}/index.html`,
- })
- .promise();
+ }),
+ );
return Promise.resolve(true);
} catch (e) {
return Promise.resolve(false);
@@ -457,21 +494,21 @@ export class AwsS3Publish implements PublisherBase {
try {
this.logger.verbose(`Migrating ${file}`);
- await this.storageClient
- .copyObject({
+ await this.storageClient.send(
+ new CopyObjectCommand({
Bucket: this.bucketName,
CopySource: [this.bucketName, file].join('/'),
Key: newPath,
- })
- .promise();
+ }),
+ );
if (removeOriginal) {
- await this.storageClient
- .deleteObject({
+ await this.storageClient.send(
+ new DeleteObjectCommand({
Bucket: this.bucketName,
Key: file,
- })
- .promise();
+ }),
+ );
}
} catch (e) {
assertError(e);
@@ -490,16 +527,16 @@ export class AwsS3Publish implements PublisherBase {
): Promise {
const objects: string[] = [];
let nextContinuation: string | undefined;
- let allObjects: ListObjectsV2Output;
+ let allObjects: ListObjectsV2CommandOutput;
// Iterate through every file in the root of the publisher.
do {
- allObjects = await this.storageClient
- .listObjectsV2({
+ allObjects = await this.storageClient.send(
+ new ListObjectsV2Command({
Bucket: this.bucketName,
ContinuationToken: nextContinuation,
...(prefix ? { Prefix: prefix } : {}),
- })
- .promise();
+ }),
+ );
objects.push(
...(allObjects.Contents || []).map(f => f.Key || '').filter(f => !!f),
);
diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md
index ebea38b85e..ae1166f11d 100644
--- a/plugins/techdocs-react/CHANGELOG.md
+++ b/plugins/techdocs-react/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-techdocs-react
+## 1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/version-bridge@1.0.3-next.0
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+
## 1.0.7-next.0
### Patch Changes
diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json
index c2334785ff..3bd8646517 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.0.7-next.0",
+ "version": "1.0.7-next.1",
"publishConfig": {
"access": "public",
"alphaTypes": "dist/index.alpha.d.ts",
diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md
index 0757d6d1ce..c3c41837af 100644
--- a/plugins/techdocs/CHANGELOG.md
+++ b/plugins/techdocs/CHANGELOG.md
@@ -1,5 +1,25 @@
# @backstage/plugin-techdocs
+## 1.4.1-next.1
+
+### Patch Changes
+
+- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
+- a19cffbeed: Update search links to only have header as linkable text
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/plugin-search-react@1.2.2-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/integration-react@1.1.7-next.1
+ - @backstage/plugin-techdocs-react@1.0.7-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-search-common@1.1.2-next.1
+
## 1.4.1-next.0
### Patch Changes
diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json
index ac1efbe5f7..8ac338a656 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.4.1-next.0",
+ "version": "1.4.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx b/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx
index 430165bf8b..c7755e8733 100644
--- a/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx
+++ b/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx
@@ -81,6 +81,15 @@ export const TechDocsSearchResultListItem = (
});
};
+ const LinkWrapper = ({ children }: PropsWithChildren<{}>) =>
+ asLink ? (
+
+ {children}
+
+ ) : (
+ <>{children}>
+ );
+
const TextItem = () => {
const resultTitle = highlight?.fields.title ? (
- {resultTitle} | {entityTitle ?? resultName} docs
- >
- )
+
+ {title ? (
+ title
+ ) : (
+ <>
+ {resultTitle} | {entityTitle ?? resultName} docs
+ >
+ )}
+
}
secondary={
) =>
- asLink ? (
-
- {children}
-
- ) : (
- <>{children}>
- );
-
const ListItemWrapper = ({ children }: PropsWithChildren<{}>) =>
asListItem ? (
<>
@@ -172,10 +174,8 @@ export const TechDocsSearchResultListItem = (
);
return (
-
-
-
-
-
+
+
+
);
};
diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md
index 59864387e3..5d674fa1c1 100644
--- a/plugins/todo-backend/CHANGELOG.md
+++ b/plugins/todo-backend/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-todo-backend
+## 0.1.36-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/integration@1.4.1-next.1
+ - @backstage/catalog-client@1.2.0-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.1.36-next.0
### Patch Changes
diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json
index fd563c6a2e..0c627b7c20 100644
--- a/plugins/todo-backend/package.json
+++ b/plugins/todo-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-todo-backend",
"description": "A Backstage backend plugin that lets you browse TODO comments in your source code",
- "version": "0.1.36-next.0",
+ "version": "0.1.36-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md
index 3197a6ac95..b45bb7d3f8 100644
--- a/plugins/todo/CHANGELOG.md
+++ b/plugins/todo/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-todo
+## 0.2.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.2.14-next.0
### Patch Changes
diff --git a/plugins/todo/package.json b/plugins/todo/package.json
index 3247464afb..4bbca2a6e2 100644
--- a/plugins/todo/package.json
+++ b/plugins/todo/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-todo",
"description": "A Backstage plugin that lets you browse TODO comments in your source code",
- "version": "0.2.14-next.0",
+ "version": "0.2.14-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md
index c0bb920fce..c931f45782 100644
--- a/plugins/user-settings-backend/CHANGELOG.md
+++ b/plugins/user-settings-backend/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-user-settings-backend
+## 0.1.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/plugin-auth-node@0.2.8-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.1.3-next.0
### Patch Changes
diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json
index 4f9d278cdf..a405cbba9a 100644
--- a/plugins/user-settings-backend/package.json
+++ b/plugins/user-settings-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-user-settings-backend",
"description": "The Backstage backend plugin to manage user settings",
- "version": "0.1.3-next.0",
+ "version": "0.1.3-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md
index c9c2effcad..970e0efd76 100644
--- a/plugins/user-settings/CHANGELOG.md
+++ b/plugins/user-settings/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-user-settings
+## 0.6.0-next.1
+
+### Patch Changes
+
+- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`.
+- Updated dependencies
+ - @backstage/core-app-api@1.2.1-next.1
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/types@1.0.2-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.6.0-next.0
### Minor Changes
diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json
index e0b1822a9c..c20b29aca6 100644
--- a/plugins/user-settings/package.json
+++ b/plugins/user-settings/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-user-settings",
"description": "A Backstage plugin that provides a settings page",
- "version": "0.6.0-next.0",
+ "version": "0.6.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -43,7 +43,7 @@
"@material-ui/lab": "4.0.0-alpha.57",
"@types/react": "^16.13.1 || ^17.0.0",
"react-use": "^17.2.4",
- "zen-observable": "^0.9.0"
+ "zen-observable": "^0.10.0"
},
"peerDependencies": {
"react": "^16.13.1 || ^17.0.0",
diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md
index 8b41bafb81..9aed902366 100644
--- a/plugins/vault-backend/CHANGELOG.md
+++ b/plugins/vault-backend/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-vault-backend
+## 0.2.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.17.0-next.1
+ - @backstage/backend-tasks@0.4.0-next.1
+ - @backstage/backend-test-utils@0.1.31-next.1
+ - @backstage/config@1.0.5-next.1
+ - @backstage/errors@1.1.4-next.1
+
## 0.2.5-next.0
### Patch Changes
diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json
index 7a5b7894dc..65f978df73 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.5-next.0",
+ "version": "0.2.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md
index cc67baf940..4fa9f69ca1 100644
--- a/plugins/vault/CHANGELOG.md
+++ b/plugins/vault/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-vault
+## 0.1.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.2.2-next.1
+ - @backstage/catalog-model@1.1.4-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.6-next.0
### Patch Changes
diff --git a/plugins/vault/package.json b/plugins/vault/package.json
index 3dde73660f..1b394670b5 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.6-next.0",
+ "version": "0.1.6-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md
index 4fee3c2c3f..dca149a889 100644
--- a/plugins/xcmetrics/CHANGELOG.md
+++ b/plugins/xcmetrics/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-xcmetrics
+## 0.2.32-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.1-next.1
+ - @backstage/core-plugin-api@1.1.1-next.1
+ - @backstage/errors@1.1.4-next.1
+ - @backstage/theme@0.2.16
+
## 0.2.32-next.0
### Patch Changes
diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json
index db33c63d92..f842bbf553 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.32-next.0",
+ "version": "0.2.32-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/storybook/yarn.lock b/storybook/yarn.lock
index f7c56bc493..29f94941ef 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.19":
- version: 1.3.19
- resolution: "@swc/core-darwin-arm64@npm:1.3.19"
+"@swc/core-darwin-arm64@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-darwin-arm64@npm:1.3.20"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-darwin-x64@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-darwin-x64@npm:1.3.19"
+"@swc/core-darwin-x64@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-darwin-x64@npm:1.3.20"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@swc/core-linux-arm-gnueabihf@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.19"
+"@swc/core-linux-arm-gnueabihf@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.20"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
-"@swc/core-linux-arm64-gnu@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-linux-arm64-gnu@npm:1.3.19"
+"@swc/core-linux-arm64-gnu@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-linux-arm64-gnu@npm:1.3.20"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-arm64-musl@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-linux-arm64-musl@npm:1.3.19"
+"@swc/core-linux-arm64-musl@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-linux-arm64-musl@npm:1.3.20"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-linux-x64-gnu@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-linux-x64-gnu@npm:1.3.19"
+"@swc/core-linux-x64-gnu@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-linux-x64-gnu@npm:1.3.20"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-x64-musl@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-linux-x64-musl@npm:1.3.19"
+"@swc/core-linux-x64-musl@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-linux-x64-musl@npm:1.3.20"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-win32-arm64-msvc@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-win32-arm64-msvc@npm:1.3.19"
+"@swc/core-win32-arm64-msvc@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-win32-arm64-msvc@npm:1.3.20"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-win32-ia32-msvc@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-win32-ia32-msvc@npm:1.3.19"
+"@swc/core-win32-ia32-msvc@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-win32-ia32-msvc@npm:1.3.20"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@swc/core-win32-x64-msvc@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-win32-x64-msvc@npm:1.3.19"
+"@swc/core-win32-x64-msvc@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-win32-x64-msvc@npm:1.3.20"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@swc/core@npm:^1.3.9":
- version: 1.3.19
- resolution: "@swc/core@npm:1.3.19"
+ version: 1.3.20
+ resolution: "@swc/core@npm:1.3.20"
dependencies:
- "@swc/core-darwin-arm64": 1.3.19
- "@swc/core-darwin-x64": 1.3.19
- "@swc/core-linux-arm-gnueabihf": 1.3.19
- "@swc/core-linux-arm64-gnu": 1.3.19
- "@swc/core-linux-arm64-musl": 1.3.19
- "@swc/core-linux-x64-gnu": 1.3.19
- "@swc/core-linux-x64-musl": 1.3.19
- "@swc/core-win32-arm64-msvc": 1.3.19
- "@swc/core-win32-ia32-msvc": 1.3.19
- "@swc/core-win32-x64-msvc": 1.3.19
+ "@swc/core-darwin-arm64": 1.3.20
+ "@swc/core-darwin-x64": 1.3.20
+ "@swc/core-linux-arm-gnueabihf": 1.3.20
+ "@swc/core-linux-arm64-gnu": 1.3.20
+ "@swc/core-linux-arm64-musl": 1.3.20
+ "@swc/core-linux-x64-gnu": 1.3.20
+ "@swc/core-linux-x64-musl": 1.3.20
+ "@swc/core-win32-arm64-msvc": 1.3.20
+ "@swc/core-win32-ia32-msvc": 1.3.20
+ "@swc/core-win32-x64-msvc": 1.3.20
dependenciesMeta:
"@swc/core-darwin-arm64":
optional: true
@@ -3073,7 +3073,7 @@ __metadata:
optional: true
bin:
swcx: run_swcx.js
- checksum: 752499e18f81df789a9737936b2a83ea1db34bb2f983c80b394766796d853fa7d30701b52b9cb30ba943ad15286d8316603149683f4c553a5493aa78d89a76e0
+ checksum: 646c37e3521f04cd08061ab67a4388959e4b234c38eba2eb9fe0fd615dedb6ff9412264789e58af7c2d24b3e5a7ea456efd060e3760d7a91509234b5b5983ad7
languageName: node
linkType: hard
diff --git a/yarn.lock b/yarn.lock
index f3dcb1a699..fe21e797f9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -22,14 +22,14 @@ __metadata:
linkType: hard
"@apidevtools/json-schema-ref-parser@npm:^9.0.6":
- version: 9.0.9
- resolution: "@apidevtools/json-schema-ref-parser@npm:9.0.9"
+ version: 9.1.0
+ resolution: "@apidevtools/json-schema-ref-parser@npm:9.1.0"
dependencies:
"@jsdevtools/ono": ^7.1.3
"@types/json-schema": ^7.0.6
call-me-maybe: ^1.0.1
js-yaml: ^4.1.0
- checksum: b21f6bdd37d2942c3967ee77569bc74fadd1b922f688daf5ef85057789a2c3a7f4afc473aa2f3a93ec950dabb6ef365f8bd9cf51e4e062a1ee1e59b989f8f9b4
+ checksum: 135569d905cd5cd3652fe850ff3a07bfbbfb1585bb20139710e8a865f0bd9fa1c8bbe8122cce11928ce00fc618b8b9f61ccd7b62827654c9b7e2853789ee0e4a
languageName: node
linkType: hard
@@ -276,6 +276,28 @@ __metadata:
languageName: node
linkType: hard
+"@aws-crypto/crc32@npm:2.0.0":
+ version: 2.0.0
+ resolution: "@aws-crypto/crc32@npm:2.0.0"
+ dependencies:
+ "@aws-crypto/util": ^2.0.0
+ "@aws-sdk/types": ^3.1.0
+ tslib: ^1.11.1
+ checksum: 88ab906da8304a430c655496e363835f3c7ca870db0dec50bb9d53ed0f446337de60c85ba7baa4528c8363bee708474785649262ebfde23a1e099eb69318b53e
+ languageName: node
+ linkType: hard
+
+"@aws-crypto/crc32c@npm:2.0.0":
+ version: 2.0.0
+ resolution: "@aws-crypto/crc32c@npm:2.0.0"
+ dependencies:
+ "@aws-crypto/util": ^2.0.0
+ "@aws-sdk/types": ^3.1.0
+ tslib: ^1.11.1
+ checksum: 776e1e61b3bde018b815d3973774a4ec3cd88c282046e49bb5a2625ac7db923068aad708a8e4c21b62a80e50a5c58324a32621b9ba82b7b2ecab66370c4fe893
+ languageName: node
+ linkType: hard
+
"@aws-crypto/ie11-detection@npm:^2.0.0":
version: 2.0.2
resolution: "@aws-crypto/ie11-detection@npm:2.0.2"
@@ -285,6 +307,20 @@ __metadata:
languageName: node
linkType: hard
+"@aws-crypto/sha1-browser@npm:2.0.0":
+ version: 2.0.0
+ resolution: "@aws-crypto/sha1-browser@npm:2.0.0"
+ dependencies:
+ "@aws-crypto/ie11-detection": ^2.0.0
+ "@aws-crypto/supports-web-crypto": ^2.0.0
+ "@aws-sdk/types": ^3.1.0
+ "@aws-sdk/util-locate-window": ^3.0.0
+ "@aws-sdk/util-utf8-browser": ^3.0.0
+ tslib: ^1.11.1
+ checksum: 72c0b24800cd79328fef934553e7a5d5929c90877d7e9a661614542dd29d0d99ee1594bd59fc028ee9ec595d77df56645a396c6336cff3c7784a564302d4a254
+ languageName: node
+ linkType: hard
+
"@aws-crypto/sha256-browser@npm:2.0.0":
version: 2.0.0
resolution: "@aws-crypto/sha256-browser@npm:2.0.0"
@@ -353,15 +389,139 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/client-sqs@npm:^3.0.0":
- version: 3.216.0
- resolution: "@aws-sdk/client-sqs@npm:3.216.0"
+"@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"
+ dependencies:
+ "@aws-sdk/util-base64": 3.208.0
+ tslib: ^2.3.1
+ checksum: 6df294c66d6acaa3de2c5f3444a62577d0effa451a65b6a1606df538cfc865d257f01c74e711b36741a2c59f43385bd393c07c8562fe5101d6069b8c2646da53
+ 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.218.0":
+ version: 3.218.0
+ resolution: "@aws-sdk/client-cognito-identity@npm:3.218.0"
dependencies:
"@aws-crypto/sha256-browser": 2.0.0
"@aws-crypto/sha256-js": 2.0.0
- "@aws-sdk/client-sts": 3.216.0
+ "@aws-sdk/client-sts": 3.218.0
"@aws-sdk/config-resolver": 3.215.0
- "@aws-sdk/credential-provider-node": 3.216.0
+ "@aws-sdk/credential-provider-node": 3.218.0
+ "@aws-sdk/fetch-http-handler": 3.215.0
+ "@aws-sdk/hash-node": 3.215.0
+ "@aws-sdk/invalid-dependency": 3.215.0
+ "@aws-sdk/middleware-content-length": 3.215.0
+ "@aws-sdk/middleware-endpoint": 3.215.0
+ "@aws-sdk/middleware-host-header": 3.215.0
+ "@aws-sdk/middleware-logger": 3.215.0
+ "@aws-sdk/middleware-recursion-detection": 3.215.0
+ "@aws-sdk/middleware-retry": 3.215.0
+ "@aws-sdk/middleware-serde": 3.215.0
+ "@aws-sdk/middleware-signing": 3.215.0
+ "@aws-sdk/middleware-stack": 3.215.0
+ "@aws-sdk/middleware-user-agent": 3.215.0
+ "@aws-sdk/node-config-provider": 3.215.0
+ "@aws-sdk/node-http-handler": 3.215.0
+ "@aws-sdk/protocol-http": 3.215.0
+ "@aws-sdk/smithy-client": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ "@aws-sdk/url-parser": 3.215.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.215.0
+ "@aws-sdk/util-defaults-mode-node": 3.215.0
+ "@aws-sdk/util-endpoints": 3.216.0
+ "@aws-sdk/util-user-agent-browser": 3.215.0
+ "@aws-sdk/util-user-agent-node": 3.215.0
+ "@aws-sdk/util-utf8-browser": 3.188.0
+ "@aws-sdk/util-utf8-node": 3.208.0
+ tslib: ^2.3.1
+ checksum: 54c15fa5cf9179eb806ae3bec4b0b936e28a955a2fa750ba99fe687e9580618dd6190726caf770db4fa23aed35dd022406b1d3eb9112c6a04d61edacdda3c501
+ languageName: node
+ linkType: hard
+
+"@aws-sdk/client-s3@npm:^3.208.0":
+ version: 3.218.0
+ resolution: "@aws-sdk/client-s3@npm:3.218.0"
+ dependencies:
+ "@aws-crypto/sha1-browser": 2.0.0
+ "@aws-crypto/sha256-browser": 2.0.0
+ "@aws-crypto/sha256-js": 2.0.0
+ "@aws-sdk/client-sts": 3.218.0
+ "@aws-sdk/config-resolver": 3.215.0
+ "@aws-sdk/credential-provider-node": 3.218.0
+ "@aws-sdk/eventstream-serde-browser": 3.215.0
+ "@aws-sdk/eventstream-serde-config-resolver": 3.215.0
+ "@aws-sdk/eventstream-serde-node": 3.215.0
+ "@aws-sdk/fetch-http-handler": 3.215.0
+ "@aws-sdk/hash-blob-browser": 3.215.0
+ "@aws-sdk/hash-node": 3.215.0
+ "@aws-sdk/hash-stream-node": 3.215.0
+ "@aws-sdk/invalid-dependency": 3.215.0
+ "@aws-sdk/md5-js": 3.215.0
+ "@aws-sdk/middleware-bucket-endpoint": 3.215.0
+ "@aws-sdk/middleware-content-length": 3.215.0
+ "@aws-sdk/middleware-endpoint": 3.215.0
+ "@aws-sdk/middleware-expect-continue": 3.215.0
+ "@aws-sdk/middleware-flexible-checksums": 3.215.0
+ "@aws-sdk/middleware-host-header": 3.215.0
+ "@aws-sdk/middleware-location-constraint": 3.215.0
+ "@aws-sdk/middleware-logger": 3.215.0
+ "@aws-sdk/middleware-recursion-detection": 3.215.0
+ "@aws-sdk/middleware-retry": 3.215.0
+ "@aws-sdk/middleware-sdk-s3": 3.215.0
+ "@aws-sdk/middleware-serde": 3.215.0
+ "@aws-sdk/middleware-signing": 3.215.0
+ "@aws-sdk/middleware-ssec": 3.215.0
+ "@aws-sdk/middleware-stack": 3.215.0
+ "@aws-sdk/middleware-user-agent": 3.215.0
+ "@aws-sdk/node-config-provider": 3.215.0
+ "@aws-sdk/node-http-handler": 3.215.0
+ "@aws-sdk/protocol-http": 3.215.0
+ "@aws-sdk/signature-v4-multi-region": 3.215.0
+ "@aws-sdk/smithy-client": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ "@aws-sdk/url-parser": 3.215.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.215.0
+ "@aws-sdk/util-defaults-mode-node": 3.215.0
+ "@aws-sdk/util-endpoints": 3.216.0
+ "@aws-sdk/util-stream-browser": 3.215.0
+ "@aws-sdk/util-stream-node": 3.215.0
+ "@aws-sdk/util-user-agent-browser": 3.215.0
+ "@aws-sdk/util-user-agent-node": 3.215.0
+ "@aws-sdk/util-utf8-browser": 3.188.0
+ "@aws-sdk/util-utf8-node": 3.208.0
+ "@aws-sdk/util-waiter": 3.215.0
+ "@aws-sdk/xml-builder": 3.201.0
+ fast-xml-parser: 4.0.11
+ tslib: ^2.3.1
+ checksum: a747efc45e20a309dc856a01770f95d3503ab3d144d356ef8b37125023b735e98d429e4b7bf3f37fd0686e59132573d9b0703e9dcf0986e08c843eefa10d8aaa
+ languageName: node
+ linkType: hard
+
+"@aws-sdk/client-sqs@npm:^3.208.0":
+ version: 3.218.0
+ resolution: "@aws-sdk/client-sqs@npm:3.218.0"
+ dependencies:
+ "@aws-crypto/sha256-browser": 2.0.0
+ "@aws-crypto/sha256-js": 2.0.0
+ "@aws-sdk/client-sts": 3.218.0
+ "@aws-sdk/config-resolver": 3.215.0
+ "@aws-sdk/credential-provider-node": 3.218.0
"@aws-sdk/fetch-http-handler": 3.215.0
"@aws-sdk/hash-node": 3.215.0
"@aws-sdk/invalid-dependency": 3.215.0
@@ -395,7 +555,7 @@ __metadata:
"@aws-sdk/util-utf8-node": 3.208.0
fast-xml-parser: 4.0.11
tslib: ^2.3.1
- checksum: c2fb8617abc585eeca694ea69cdda25aab0a38d0cb3c6cb4a5bb41b8aec2e1f5e410e2fdfc50a36078668df5740cd169292470a90a35edf474867d1740a972b1
+ checksum: 6fe2faf96f848fba4f36b736f2979ddf2283708241b56e22cfb27b196c8dcaf87bcbef148eb511e961800257edd6e895ea2cf0fe18bdf9dd9d54140d6dcfeca1
languageName: node
linkType: hard
@@ -439,9 +599,9 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/client-sso@npm:3.216.0":
- version: 3.216.0
- resolution: "@aws-sdk/client-sso@npm:3.216.0"
+"@aws-sdk/client-sso@npm:3.218.0":
+ version: 3.218.0
+ resolution: "@aws-sdk/client-sso@npm:3.218.0"
dependencies:
"@aws-crypto/sha256-browser": 2.0.0
"@aws-crypto/sha256-js": 2.0.0
@@ -475,18 +635,18 @@ __metadata:
"@aws-sdk/util-utf8-browser": 3.188.0
"@aws-sdk/util-utf8-node": 3.208.0
tslib: ^2.3.1
- checksum: 9bb7924a2feab7297b101de4cc530ed8c4c0ce43ef1b7ca1302bfa31bda00a329f74a24fc33794e24a7b693744dd2b58ac2adf9569d828ed9a07a74f2662c2af
+ checksum: 2ef01b0cf87ca4af9fb728e01674a765b84111a6e4030f8aa4dff3dbacc2a3c55861bdb3d992be84e49b625e50d497aa0f611e7e0c1de844392ee3089b9fe879
languageName: node
linkType: hard
-"@aws-sdk/client-sts@npm:3.216.0":
- version: 3.216.0
- resolution: "@aws-sdk/client-sts@npm:3.216.0"
+"@aws-sdk/client-sts@npm:3.218.0":
+ version: 3.218.0
+ resolution: "@aws-sdk/client-sts@npm:3.218.0"
dependencies:
"@aws-crypto/sha256-browser": 2.0.0
"@aws-crypto/sha256-js": 2.0.0
"@aws-sdk/config-resolver": 3.215.0
- "@aws-sdk/credential-provider-node": 3.216.0
+ "@aws-sdk/credential-provider-node": 3.218.0
"@aws-sdk/fetch-http-handler": 3.215.0
"@aws-sdk/hash-node": 3.215.0
"@aws-sdk/invalid-dependency": 3.215.0
@@ -519,7 +679,7 @@ __metadata:
"@aws-sdk/util-utf8-node": 3.208.0
fast-xml-parser: 4.0.11
tslib: ^2.3.1
- checksum: 5da916bbed994792a3d6dcb979771d5361a96bc658849e4c9c00e894e47545fe109389fe27773ad3cb961560e6a538650f0259388b79ae703d057ab4adb79a76
+ checksum: 1619e054c23ef3b103fe1427faad454f6dced3e8daf98c91bc2bfd93386864ae25df90b13a3e8cbe4a9d75670e42815ce414401294c99de0b3cd475d3e85167e
languageName: node
linkType: hard
@@ -536,6 +696,18 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/credential-provider-cognito-identity@npm:3.218.0":
+ version: 3.218.0
+ resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.218.0"
+ dependencies:
+ "@aws-sdk/client-cognito-identity": 3.218.0
+ "@aws-sdk/property-provider": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: bb7a9e9d4212dd2b393e23ecc6be6691eaea762bf8f882188fea9d426725617ea0d8d66d70e7a7c82c99baff3fab1c0f8819a7829fc329a1923e57c3ee55ac4d
+ languageName: node
+ linkType: hard
+
"@aws-sdk/credential-provider-env@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/credential-provider-env@npm:3.215.0"
@@ -560,37 +732,37 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/credential-provider-ini@npm:3.216.0":
- version: 3.216.0
- resolution: "@aws-sdk/credential-provider-ini@npm:3.216.0"
+"@aws-sdk/credential-provider-ini@npm:3.218.0":
+ version: 3.218.0
+ resolution: "@aws-sdk/credential-provider-ini@npm:3.218.0"
dependencies:
"@aws-sdk/credential-provider-env": 3.215.0
"@aws-sdk/credential-provider-imds": 3.215.0
- "@aws-sdk/credential-provider-sso": 3.216.0
+ "@aws-sdk/credential-provider-sso": 3.218.0
"@aws-sdk/credential-provider-web-identity": 3.215.0
"@aws-sdk/property-provider": 3.215.0
"@aws-sdk/shared-ini-file-loader": 3.215.0
"@aws-sdk/types": 3.215.0
tslib: ^2.3.1
- checksum: a4aadb0bbc019cda9751bcc1ea08b5f8b6219daada0f4ef318e99425088cee28a46f5f41ca68cd86685c067c3bbff1c69b32e6e673dce25c8747757398a78de6
+ checksum: d48d601c89bb35330ddd3a9c976cad6caaf484468ac5819d21d34550a653b8ff54de616973e4b79b09f3e12d404582d4e4b46977eac465411d1bae79a7db370d
languageName: node
linkType: hard
-"@aws-sdk/credential-provider-node@npm:3.216.0":
- version: 3.216.0
- resolution: "@aws-sdk/credential-provider-node@npm:3.216.0"
+"@aws-sdk/credential-provider-node@npm:3.218.0":
+ version: 3.218.0
+ resolution: "@aws-sdk/credential-provider-node@npm:3.218.0"
dependencies:
"@aws-sdk/credential-provider-env": 3.215.0
"@aws-sdk/credential-provider-imds": 3.215.0
- "@aws-sdk/credential-provider-ini": 3.216.0
+ "@aws-sdk/credential-provider-ini": 3.218.0
"@aws-sdk/credential-provider-process": 3.215.0
- "@aws-sdk/credential-provider-sso": 3.216.0
+ "@aws-sdk/credential-provider-sso": 3.218.0
"@aws-sdk/credential-provider-web-identity": 3.215.0
"@aws-sdk/property-provider": 3.215.0
"@aws-sdk/shared-ini-file-loader": 3.215.0
"@aws-sdk/types": 3.215.0
tslib: ^2.3.1
- checksum: d6f85e4c83d551abad6e4b8fd26171bce692e818c8c30abaf191484fbcfce21901813f9290a3ac36dc32f87f817dbd4682067e74c2a7881af8a0b35b5cbd813b
+ checksum: da8da825da1fca84fdb8ca3d9958be1059a3b93c868e19b0c4d6a8c628de881cf95701beec3fd107218c37e7726587197ab5a5cdf437d5c628436d17506cb1d1
languageName: node
linkType: hard
@@ -606,17 +778,17 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/credential-provider-sso@npm:3.216.0":
- version: 3.216.0
- resolution: "@aws-sdk/credential-provider-sso@npm:3.216.0"
+"@aws-sdk/credential-provider-sso@npm:3.218.0":
+ version: 3.218.0
+ resolution: "@aws-sdk/credential-provider-sso@npm:3.218.0"
dependencies:
- "@aws-sdk/client-sso": 3.216.0
+ "@aws-sdk/client-sso": 3.218.0
"@aws-sdk/property-provider": 3.215.0
"@aws-sdk/shared-ini-file-loader": 3.215.0
"@aws-sdk/token-providers": 3.216.0
"@aws-sdk/types": 3.215.0
tslib: ^2.3.1
- checksum: d48f869c4a2596e1731db389b4932ffa14d32aa006ae645ab24c809df9e78f30cf40e079575df82c441725f622e5cc1fcb6a01cdbf718b6ac89fc55459f698b3
+ checksum: 1d6b26776c83d7256336f89b33ae1a5cf7ba252af6ea54b2daaa9c5ce77a1d7b7afb08a49ef10dccbb900f12b40522e87b6561f5128b2869530f8a86ad2c6654
languageName: node
linkType: hard
@@ -631,6 +803,97 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/credential-providers@npm:^3.208.0":
+ version: 3.218.0
+ resolution: "@aws-sdk/credential-providers@npm:3.218.0"
+ dependencies:
+ "@aws-sdk/client-cognito-identity": 3.218.0
+ "@aws-sdk/client-sso": 3.218.0
+ "@aws-sdk/client-sts": 3.218.0
+ "@aws-sdk/credential-provider-cognito-identity": 3.218.0
+ "@aws-sdk/credential-provider-env": 3.215.0
+ "@aws-sdk/credential-provider-imds": 3.215.0
+ "@aws-sdk/credential-provider-ini": 3.218.0
+ "@aws-sdk/credential-provider-node": 3.218.0
+ "@aws-sdk/credential-provider-process": 3.215.0
+ "@aws-sdk/credential-provider-sso": 3.218.0
+ "@aws-sdk/credential-provider-web-identity": 3.215.0
+ "@aws-sdk/property-provider": 3.215.0
+ "@aws-sdk/shared-ini-file-loader": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: 75200e3d75b38435780192232ca7b0daf79b7538e6e8327783e8b4fb9e0f82f783f9cb679cf1642a07feef4bf34a0c8951e27d4d1969afdcf9a59ded50905bba
+ languageName: node
+ linkType: hard
+
+"@aws-sdk/eventstream-codec@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/eventstream-codec@npm:3.215.0"
+ dependencies:
+ "@aws-crypto/crc32": 2.0.0
+ "@aws-sdk/types": 3.215.0
+ "@aws-sdk/util-hex-encoding": 3.201.0
+ tslib: ^2.3.1
+ checksum: 9fb18b8b9e96c2dea75a70ac37f3d7f3f349167ba234ee8a8aab95dcb433783506a538aa1490da7f0b6824b445cfeacd520664f2f42203c846f41a3ce741e236
+ languageName: node
+ linkType: hard
+
+"@aws-sdk/eventstream-serde-browser@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/eventstream-serde-browser@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/eventstream-serde-universal": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: 6c4cd0d0d243b09c01151c7c56926968c38237fdf4cb94afa24cfe21f35cc1cb46c64b7c197c416401d3894b7725c1fecdfc073e072f99869beb3b526109f73e
+ languageName: node
+ linkType: hard
+
+"@aws-sdk/eventstream-serde-config-resolver@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/eventstream-serde-config-resolver@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: 36777edd4b43d43bf007a85399b988d0c71fc67476fd0536e10333b6ae21196c796ea7d30e80554a1fc86b230bda432b449a1b751ae0a26ac24ca9f072744a9c
+ languageName: node
+ linkType: hard
+
+"@aws-sdk/eventstream-serde-node@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/eventstream-serde-node@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/eventstream-serde-universal": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: 15f8c603504f15c5f32430d05c586faa2e3c444fd7ede960e5a9b5b9e13437e54bb2bb424dc6b1fd51183550ad4bc9849d6d2afd43dff7794111014a2c30128a
+ languageName: node
+ linkType: hard
+
+"@aws-sdk/eventstream-serde-universal@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/eventstream-serde-universal@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/eventstream-codec": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: 4a4e009ec9baf643067453f85df59e29e539eddd7ec1b5b29beab25c4e93e57a9b8c0b2f1788cb5cf17a031444bb6bab751aab8ed530605379a37c9661ff8cea
+ 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"
+ 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
+ languageName: node
+ linkType: hard
+
"@aws-sdk/fetch-http-handler@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/fetch-http-handler@npm:3.215.0"
@@ -644,6 +907,18 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/hash-blob-browser@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/hash-blob-browser@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/chunked-blob-reader": 3.188.0
+ "@aws-sdk/chunked-blob-reader-native": 3.208.0
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: 2d4d8e7ff8e4f44510073a173aa7ecd5dd11f6758e5dc261d2b0576a33271d8728204066089a1805ceb1f5d5b738f44edc3c808fbd7a7121f8eb6bd70de856a7
+ languageName: node
+ linkType: hard
+
"@aws-sdk/hash-node@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/hash-node@npm:3.215.0"
@@ -655,6 +930,16 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/hash-stream-node@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/hash-stream-node@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: b86f99e3d5b6da2f48c4a0f1f46544218ce4059758c3bbe2b0ab8bed1aa115d42d9b8ff331f81ee339abfcb029b9aec35c9181137e632f36883f2e1f1e50e981
+ languageName: node
+ linkType: hard
+
"@aws-sdk/invalid-dependency@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/invalid-dependency@npm:3.215.0"
@@ -674,6 +959,23 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/lib-storage@npm:^3.208.0":
+ version: 3.218.0
+ resolution: "@aws-sdk/lib-storage@npm:3.218.0"
+ dependencies:
+ "@aws-sdk/middleware-endpoint": 3.215.0
+ "@aws-sdk/smithy-client": 3.215.0
+ buffer: 5.6.0
+ events: 3.3.0
+ stream-browserify: 3.0.0
+ tslib: ^2.3.1
+ peerDependencies:
+ "@aws-sdk/abort-controller": ^3.0.0
+ "@aws-sdk/client-s3": ^3.0.0
+ checksum: 96db639ac862f049431d54e0af0d72245aa7c34f6f95a8ab7fdca280289e9916c86ada4708d6ad12cfb218f16191282b5ecbe2db335a944991228338931f5d2d
+ languageName: node
+ linkType: hard
+
"@aws-sdk/md5-js@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/md5-js@npm:3.215.0"
@@ -686,6 +988,19 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/middleware-bucket-endpoint@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/protocol-http": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ "@aws-sdk/util-arn-parser": 3.208.0
+ "@aws-sdk/util-config-provider": 3.208.0
+ tslib: ^2.3.1
+ checksum: 83456d16108aca33078dc55631482c738029bd4c73a23a0ca9bc3573979e43c1de829df46f69e1ee0b58cc2e2f5513d4c3f830fbc9d2fcf605f5ad43d7a709ce
+ languageName: node
+ linkType: hard
+
"@aws-sdk/middleware-content-length@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/middleware-content-length@npm:3.215.0"
@@ -713,6 +1028,31 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/middleware-expect-continue@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/middleware-expect-continue@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/protocol-http": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: a8d4c7713fbb5f725ffb4d3fc9131a90a196bf4c6035b967b8989f6d0397c8f908723627633232799ca4d8cf5fb416dca56ba4c32f6982341f16b18fb3d1f6b9
+ languageName: node
+ linkType: hard
+
+"@aws-sdk/middleware-flexible-checksums@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.215.0"
+ dependencies:
+ "@aws-crypto/crc32": 2.0.0
+ "@aws-crypto/crc32c": 2.0.0
+ "@aws-sdk/is-array-buffer": 3.201.0
+ "@aws-sdk/protocol-http": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: 1bd63010e3cd5f254f4c75122d96915c1db8d9c7388a67391ad05aae7d71e5e8dd37e7243ed4c673a8a652f477b500eaeb9b020c152b4d0e05e8e8f73437559f
+ languageName: node
+ linkType: hard
+
"@aws-sdk/middleware-host-header@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/middleware-host-header@npm:3.215.0"
@@ -724,6 +1064,16 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/middleware-location-constraint@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/middleware-location-constraint@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: 77efd1a5393357f98a1199d6d5f5690a41935f60924e9a622796d0fcb700c9f27da84b0b282cd0b82b3949778ef94e8bcd225c5d70348107a89aea78333966fc
+ languageName: node
+ linkType: hard
+
"@aws-sdk/middleware-logger@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/middleware-logger@npm:3.215.0"
@@ -759,6 +1109,19 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/middleware-sdk-s3@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/middleware-sdk-s3@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/middleware-bucket-endpoint": 3.215.0
+ "@aws-sdk/protocol-http": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ "@aws-sdk/util-arn-parser": 3.208.0
+ tslib: ^2.3.1
+ checksum: de1e1f661d182f385f1658943a3b0a8dce9cc15b8140d29fcc3eea7c8f629c7575613af7ee74499f42b85927682643167170c595cb955d9e7666568818b43b9a
+ languageName: node
+ linkType: hard
+
"@aws-sdk/middleware-sdk-sqs@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.215.0"
@@ -808,6 +1171,16 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/middleware-ssec@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/middleware-ssec@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: e362a5b63c327fbf66a959f303ae95f521b2f22e00b74959c24d2a4a6a5df1f8e86db21aef752c80cc8a0be47258dc80c79aa6edaf460c8e8782a750490b126a
+ languageName: node
+ linkType: hard
+
"@aws-sdk/middleware-stack@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/middleware-stack@npm:3.215.0"
@@ -863,6 +1236,16 @@ __metadata:
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"
+ dependencies:
+ "@aws-sdk/types": 3.208.0
+ tslib: ^2.3.1
+ checksum: 6cf57f264a4ef393fbe5fac71f22eaba47bc421646063dac004919ec7185979ed91a3e03c71373749150249f6be4ae41294a4c068d7c22a5990dcd2f5cf8347c
+ languageName: node
+ linkType: hard
+
"@aws-sdk/protocol-http@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/protocol-http@npm:3.215.0"
@@ -873,6 +1256,17 @@ __metadata:
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"
+ dependencies:
+ "@aws-sdk/types": 3.208.0
+ "@aws-sdk/util-uri-escape": 3.201.0
+ tslib: ^2.3.1
+ checksum: 69ff07e2a05ae0979da4e5b12ffb223f0eb037fab079f1f4c245101fdb2d9244454a543dcc829120b882a99a63ecfc950f209ba5a1aaacf94432a35a214c2521
+ languageName: node
+ linkType: hard
+
"@aws-sdk/querystring-builder@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/querystring-builder@npm:3.215.0"
@@ -911,6 +1305,24 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/signature-v4-multi-region@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/signature-v4-multi-region@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/protocol-http": 3.215.0
+ "@aws-sdk/signature-v4": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ "@aws-sdk/util-arn-parser": 3.208.0
+ tslib: ^2.3.1
+ peerDependencies:
+ "@aws-sdk/signature-v4-crt": ^3.118.0
+ peerDependenciesMeta:
+ "@aws-sdk/signature-v4-crt":
+ optional: true
+ checksum: d2b898e505edbb85be410ccd16f22475531f5de22c2e53bbd386ebc93ec5f173b1a68a08d6dd71c9df7518fe2d73594e92bd690b93aa6e0c5dee013d0c6fe09c
+ languageName: node
+ linkType: hard
+
"@aws-sdk/signature-v4@npm:3.215.0":
version: 3.215.0
resolution: "@aws-sdk/signature-v4@npm:3.215.0"
@@ -949,7 +1361,14 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/types@npm:3.215.0, @aws-sdk/types@npm:^3.1.0, @aws-sdk/types@npm:^3.110.0":
+"@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.215.0, @aws-sdk/types@npm:^3.1.0, @aws-sdk/types@npm:^3.110.0, @aws-sdk/types@npm:^3.208.0":
version: 3.215.0
resolution: "@aws-sdk/types@npm:3.215.0"
checksum: 7b1301af4444c6d949175337546093946e22c572b40474ada534bd9a4ab37e15f5aabdeca139328b7ea45a6dd1d1a86de89097adbbb07e31365bb3e84254ea38
@@ -967,6 +1386,15 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/util-arn-parser@npm:3.208.0":
+ version: 3.208.0
+ resolution: "@aws-sdk/util-arn-parser@npm:3.208.0"
+ dependencies:
+ tslib: ^2.3.1
+ checksum: 1e1793adc0c53801b9fd7ccb7e94169dcd984047533c28897aea2af4c4fa02cbc2cd1b5d9b6f34eaf6b9aaa0aba27f927c8e2a58a6b4bb06888cfa68d66b6b2d
+ 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"
@@ -1077,10 +1505,41 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/util-stream-browser@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/util-stream-browser@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/fetch-http-handler": 3.215.0
+ "@aws-sdk/types": 3.215.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: cbc3fb91ad7cd1f7015a5d1e1a939bb6f1d107b2a54b02292277dd255166292207e43d56b7b1618510ba79a7f3b351119e683ddceed9dc7f45e98397343a7d37
+ languageName: node
+ linkType: hard
+
+"@aws-sdk/util-stream-node@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/util-stream-node@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/node-http-handler": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ "@aws-sdk/util-buffer-from": 3.208.0
+ tslib: ^2.3.1
+ checksum: 1f77e7b37ea8e78a74d61d489a6f0be2debc467b92a59ad2d5fe8ad4a51c70db5553b82e8776e3d195662208228b215a3a2ecd41c302495eadf38671377616fa
+ 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"
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
languageName: node
@@ -1132,6 +1591,26 @@ __metadata:
languageName: node
linkType: hard
+"@aws-sdk/util-waiter@npm:3.215.0":
+ version: 3.215.0
+ resolution: "@aws-sdk/util-waiter@npm:3.215.0"
+ dependencies:
+ "@aws-sdk/abort-controller": 3.215.0
+ "@aws-sdk/types": 3.215.0
+ tslib: ^2.3.1
+ checksum: a5caca8c05677ad853822506197dedc8c80fa786fba7fb6d3679120f581ffca92af6cc002dd0a99f9520e4dd98ae046054e9dbde1bd66c638fd1e14d91117afe
+ 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"
+ dependencies:
+ tslib: ^2.3.1
+ checksum: fd250c2edcf062e79af576fa39d555f624c155540f7bb27da05a400540f3c2ceb89f33841157eda5f4558a0b6c58d2686a105d26f79eeab5790e6b6bfbe18d4a
+ languageName: node
+ linkType: hard
+
"@azure/abort-controller@npm:^1.0.0":
version: 1.0.2
resolution: "@azure/abort-controller@npm:1.0.2"
@@ -2957,7 +3436,6 @@ __metadata:
morgan: ^1.10.0
msw: ^0.49.0
mysql2: ^2.2.5
- node-abort-controller: ^3.0.1
node-fetch: ^2.6.7
node-forge: ^1.3.1
raw-body: ^2.4.1
@@ -3021,7 +3499,6 @@ __metadata:
knex: ^2.0.0
lodash: ^4.17.21
luxon: ^3.0.0
- node-abort-controller: ^3.0.1
uuid: ^8.0.0
wait-for-expect: ^3.0.2
winston: ^3.2.1
@@ -3133,8 +3610,8 @@ __metadata:
"@manypkg/get-packages": ^1.1.3
"@octokit/request": ^6.0.0
"@pmmmwh/react-refresh-webpack-plugin": ^0.5.7
- "@rollup/plugin-commonjs": ^22.0.0
- "@rollup/plugin-json": ^4.1.0
+ "@rollup/plugin-commonjs": ^23.0.0
+ "@rollup/plugin-json": ^5.0.0
"@rollup/plugin-node-resolve": ^13.0.6
"@rollup/plugin-yaml": ^3.1.0
"@spotify/eslint-config-base": ^14.0.0
@@ -3207,7 +3684,7 @@ __metadata:
json-schema: ^0.4.0
lodash: ^4.17.21
mini-css-extract-plugin: ^2.4.2
- minimatch: 5.1.0
+ minimatch: ^5.1.1
mock-fs: ^5.1.0
msw: ^0.49.0
node-fetch: ^2.6.7
@@ -3347,7 +3824,7 @@ __metadata:
react-router-dom-stable: "npm:react-router-dom@^6.3.0"
react-router-stable: "npm:react-router@^6.3.0"
react-use: ^17.2.4
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
zod: ^3.11.6
peerDependencies:
"@types/react": ^16.13.1 || ^17.0.0
@@ -3474,7 +3951,7 @@ __metadata:
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
"@material-ui/lab": 4.0.0-alpha.57
- "@react-hookz/web": ^15.0.0
+ "@react-hookz/web": ^19.0.0
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/react-hooks": ^8.0.0
@@ -3519,7 +3996,7 @@ __metadata:
react-virtualized-auto-sizer: ^1.0.6
react-window: ^1.8.6
remark-gfm: ^3.0.1
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
zod: ^3.11.6
peerDependencies:
"@types/react": ^16.13.1 || ^17.0.0
@@ -3569,7 +4046,7 @@ __metadata:
history: ^5.0.0
msw: ^0.49.0
prop-types: ^15.7.2
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
peerDependencies:
"@types/react": ^16.13.1 || ^17.0.0
react: ^16.13.1 || ^17.0.0
@@ -3624,7 +4101,7 @@ __metadata:
"@testing-library/user-event": ^14.0.0
"@types/node": ^16.0.0
react-use: ^17.2.4
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
peerDependencies:
"@types/react": ^16.13.1 || ^17.0.0
react: ^16.13.1 || ^17.0.0
@@ -4485,7 +4962,6 @@ __metadata:
"@backstage/plugin-events-node": "workspace:^"
luxon: ^3.0.0
msw: ^0.49.0
- p-limit: ^3.1.0
uuid: ^8.0.0
winston: ^3.2.1
languageName: unknown
@@ -4577,7 +5053,9 @@ __metadata:
"@backstage/errors": "workspace:^"
"@backstage/integration": "workspace:^"
"@backstage/plugin-catalog-backend": "workspace:^"
+ "@backstage/plugin-catalog-common": "workspace:^"
"@backstage/plugin-catalog-node": "workspace:^"
+ "@backstage/plugin-events-node": "workspace:^"
"@backstage/types": "workspace:^"
"@octokit/graphql": ^5.0.0
"@octokit/rest": ^19.0.3
@@ -4979,7 +5457,7 @@ __metadata:
react-test-renderer: ^16.13.1
react-use: ^17.2.4
yaml: ^2.0.0
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
peerDependencies:
"@types/react": ^16.13.1 || ^17.0.0
react: ^16.13.1 || ^17.0.0
@@ -5020,7 +5498,7 @@ __metadata:
pluralize: ^8.0.0
react-helmet: 6.1.0
react-use: ^17.2.4
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
peerDependencies:
"@types/react": ^16.13.1 || ^17.0.0
react: ^16.13.1 || ^17.0.0
@@ -5288,7 +5766,7 @@ __metadata:
jsonschema: ^1.2.6
msw: ^0.49.0
react-use: ^17.2.4
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
peerDependencies:
react: ^16.13.1 || ^17.0.0
languageName: unknown
@@ -5380,7 +5858,8 @@ __metadata:
version: 0.0.0-use.local
resolution: "@backstage/plugin-events-backend-module-aws-sqs@workspace:plugins/events-backend-module-aws-sqs"
dependencies:
- "@aws-sdk/client-sqs": ^3.0.0
+ "@aws-sdk/client-sqs": ^3.208.0
+ "@aws-sdk/types": ^3.208.0
"@backstage/backend-common": "workspace:^"
"@backstage/backend-plugin-api": "workspace:^"
"@backstage/backend-tasks": "workspace:^"
@@ -5445,8 +5924,10 @@ __metadata:
"@backstage/backend-plugin-api": "workspace:^"
"@backstage/backend-test-utils": "workspace:^"
"@backstage/cli": "workspace:^"
+ "@backstage/config": "workspace:^"
"@backstage/plugin-events-backend-test-utils": "workspace:^"
"@backstage/plugin-events-node": "workspace:^"
+ "@octokit/webhooks-methods": ^3.0.0
supertest: ^6.1.3
winston: ^3.2.1
languageName: unknown
@@ -5459,6 +5940,7 @@ __metadata:
"@backstage/backend-plugin-api": "workspace:^"
"@backstage/backend-test-utils": "workspace:^"
"@backstage/cli": "workspace:^"
+ "@backstage/config": "workspace:^"
"@backstage/plugin-events-backend-test-utils": "workspace:^"
"@backstage/plugin-events-node": "workspace:^"
supertest: ^6.1.3
@@ -5503,6 +5985,36 @@ __metadata:
languageName: unknown
linkType: soft
+"@backstage/plugin-explore-backend@workspace:^, @backstage/plugin-explore-backend@workspace:plugins/explore-backend":
+ version: 0.0.0-use.local
+ resolution: "@backstage/plugin-explore-backend@workspace:plugins/explore-backend"
+ dependencies:
+ "@backstage/backend-common": "workspace:^"
+ "@backstage/cli": "workspace:^"
+ "@backstage/config": "workspace:^"
+ "@backstage/plugin-explore-common": "workspace:^"
+ "@backstage/plugin-search-common": "workspace:^"
+ "@types/express": "*"
+ "@types/supertest": ^2.0.8
+ express: ^4.18.1
+ express-promise-router: ^4.1.0
+ lodash: ^4.17.21
+ msw: ^0.47.0
+ node-fetch: ^2.6.7
+ supertest: ^6.2.4
+ winston: ^3.2.1
+ yn: ^4.0.0
+ languageName: unknown
+ linkType: soft
+
+"@backstage/plugin-explore-common@workspace:^, @backstage/plugin-explore-common@workspace:plugins/explore-common":
+ version: 0.0.0-use.local
+ resolution: "@backstage/plugin-explore-common@workspace:plugins/explore-common"
+ dependencies:
+ "@backstage/cli": "workspace:^"
+ languageName: unknown
+ linkType: soft
+
"@backstage/plugin-explore-react@workspace:^, @backstage/plugin-explore-react@workspace:plugins/explore-react":
version: 0.0.0-use.local
resolution: "@backstage/plugin-explore-react@workspace:plugins/explore-react"
@@ -5510,6 +6022,7 @@ __metadata:
"@backstage/cli": "workspace:^"
"@backstage/core-plugin-api": "workspace:^"
"@backstage/dev-utils": "workspace:^"
+ "@backstage/plugin-explore-common": "workspace:^"
"@backstage/test-utils": "workspace:^"
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -5530,9 +6043,13 @@ __metadata:
"@backstage/core-components": "workspace:^"
"@backstage/core-plugin-api": "workspace:^"
"@backstage/dev-utils": "workspace:^"
+ "@backstage/errors": "workspace:^"
"@backstage/plugin-catalog": "workspace:^"
"@backstage/plugin-catalog-react": "workspace:^"
+ "@backstage/plugin-explore-common": "workspace:^"
"@backstage/plugin-explore-react": "workspace:^"
+ "@backstage/plugin-search-common": "workspace:^"
+ "@backstage/plugin-search-react": "workspace:^"
"@backstage/test-utils": "workspace:^"
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
@@ -5663,7 +6180,7 @@ __metadata:
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
"@material-ui/lab": 4.0.0-alpha.57
- "@react-hookz/web": ^15.0.0
+ "@react-hookz/web": ^19.0.0
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -6072,7 +6589,6 @@ __metadata:
express-promise-router: ^4.1.0
jenkins: ^1.0.0
msw: ^0.49.0
- promise-any-polyfill: ^1.0.1
supertest: ^6.1.6
winston: ^3.2.1
yn: ^4.0.0
@@ -6899,7 +7415,7 @@ __metadata:
vm2: ^3.9.11
winston: ^3.2.1
yaml: ^2.0.0
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
zod: ^3.11.6
languageName: unknown
linkType: soft
@@ -6943,7 +7459,7 @@ __metadata:
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
"@material-ui/lab": 4.0.0-alpha.57
- "@react-hookz/web": ^15.0.0
+ "@react-hookz/web": ^19.0.0
"@rjsf/core": ^3.2.1
"@rjsf/core-v5": "npm:@rjsf/core@^5.0.0-beta.12"
"@rjsf/material-ui": ^3.2.1
@@ -6973,7 +7489,7 @@ __metadata:
react-use: ^17.2.4
use-immer: ^0.7.0
yaml: ^2.0.0
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
zod: ^3.11.6
zod-to-json-schema: ^3.18.1
peerDependencies:
@@ -7038,7 +7554,6 @@ __metadata:
lodash: ^4.17.21
lunr: ^2.3.9
ndjson: ^2.0.0
- node-abort-controller: ^3.0.1
uuid: ^8.3.2
winston: ^3.2.1
languageName: unknown
@@ -7220,7 +7735,7 @@ __metadata:
react-hook-form: ^7.12.2
react-use: ^17.2.4
uuid: ^8.3.2
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
peerDependencies:
react: ^16.13.1 || ^17.0.0
react-router: 6.0.0-beta.0 || ^6.3.0
@@ -7608,7 +8123,7 @@ __metadata:
"@material-ui/core": ^4.9.13
"@material-ui/icons": ^4.9.1
"@material-ui/lab": 4.0.0-alpha.57
- "@react-hookz/web": ^15.0.0
+ "@react-hookz/web": ^19.0.0
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -7627,6 +8142,10 @@ __metadata:
version: 0.0.0-use.local
resolution: "@backstage/plugin-techdocs-node@workspace:plugins/techdocs-node"
dependencies:
+ "@aws-sdk/client-s3": ^3.208.0
+ "@aws-sdk/credential-providers": ^3.208.0
+ "@aws-sdk/lib-storage": ^3.208.0
+ "@aws-sdk/types": ^3.208.0
"@azure/identity": ^2.1.0
"@azure/storage-blob": ^12.5.0
"@backstage/backend-common": "workspace:^"
@@ -7645,7 +8164,7 @@ __metadata:
"@types/mock-fs": ^4.13.0
"@types/recursive-readdir": ^2.2.0
"@types/supertest": ^2.0.8
- aws-sdk: ^2.840.0
+ aws-sdk-client-mock: ^2.0.0
express: ^4.17.1
fs-extra: 10.1.0
git-url-parse: ^13.0.0
@@ -7838,7 +8357,7 @@ __metadata:
cross-fetch: ^3.1.5
msw: ^0.49.0
react-use: ^17.2.4
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
peerDependencies:
react: ^16.13.1 || ^17.0.0
react-router: 6.0.0-beta.0 || ^6.3.0
@@ -7949,6 +8468,7 @@ __metadata:
resolution: "@backstage/repo-tools@workspace:packages/repo-tools"
dependencies:
"@backstage/errors": "workspace:^"
+ "@manypkg/get-packages": ^1.1.3
"@microsoft/api-documenter": ^7.17.11
"@microsoft/api-extractor": ^7.23.0
"@microsoft/api-extractor-model": ^7.17.2
@@ -7982,7 +8502,7 @@ __metadata:
"@types/node": ^16.11.26
cross-fetch: ^3.1.5
msw: ^0.49.0
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
peerDependencies:
"@types/react": ^16.13.1 || ^17.0.0
react: ^16.13.1 || ^17.0.0
@@ -8015,11 +8535,21 @@ __metadata:
"@backstage/cli": "workspace:^"
"@types/zen-observable": ^0.8.0
luxon: ^3.0.0
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
languageName: unknown
linkType: soft
-"@backstage/version-bridge@^1.0.1, @backstage/version-bridge@^1.0.2, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge":
+"@backstage/version-bridge@npm:^1.0.1, @backstage/version-bridge@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "@backstage/version-bridge@npm:1.0.2"
+ peerDependencies:
+ "@types/react": ^16.13.1 || ^17.0.0
+ react: ^16.13.1 || ^17.0.0
+ checksum: b45cbf5340afb7896d6baa2a650ee21e9a63743ee589d07a30139a6e035e7e5f996a5b9fa08f5db2ccdd95db288c4b4e73b17e419f7569e061065fd362f38e75
+ languageName: node
+ linkType: hard
+
+"@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:
@@ -8564,16 +9094,16 @@ __metadata:
languageName: node
linkType: hard
-"@esbuild/android-arm@npm:0.15.15":
- version: 0.15.15
- resolution: "@esbuild/android-arm@npm:0.15.15"
+"@esbuild/android-arm@npm:0.15.16":
+ version: 0.15.16
+ resolution: "@esbuild/android-arm@npm:0.15.16"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
-"@esbuild/linux-loong64@npm:0.15.15":
- version: 0.15.15
- resolution: "@esbuild/linux-loong64@npm:0.15.15"
+"@esbuild/linux-loong64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "@esbuild/linux-loong64@npm:0.15.16"
conditions: os=linux & cpu=loong64
languageName: node
linkType: hard
@@ -8765,8 +9295,8 @@ __metadata:
linkType: hard
"@graphql-codegen/cli@npm:^2.3.1":
- version: 2.14.0
- resolution: "@graphql-codegen/cli@npm:2.14.0"
+ version: 2.15.0
+ resolution: "@graphql-codegen/cli@npm:2.15.0"
dependencies:
"@babel/generator": ^7.18.13
"@babel/template": ^7.18.10
@@ -8797,7 +9327,6 @@ __metadata:
json-to-pretty-yaml: ^1.2.2
listr2: ^4.0.5
log-symbols: ^4.0.0
- mkdirp: ^1.0.4
shell-quote: ^1.7.3
string-env-interpolation: ^1.0.1
ts-log: ^2.2.3
@@ -8811,7 +9340,7 @@ __metadata:
graphql-code-generator: cjs/bin.js
graphql-codegen: cjs/bin.js
graphql-codegen-esm: esm/bin.js
- checksum: 9f7d376f613156f7e263f73e30f987df3fdb898f8287f399afb302e5dece7d0563ba76b7dc9d8d9178cd5a2441f11ef3667f5d8d48bba9494c46223e7e421cde
+ checksum: 062f15b957c1b296b34316e8a052af2a07c73d94dcad58dfc2d640423ee41e297f9201fbcbd226b5c0f5979008e3670a31294f7b39a8d581c19c828e69b7dd0d
languageName: node
linkType: hard
@@ -9573,50 +10102,50 @@ __metadata:
languageName: node
linkType: hard
-"@jest/console@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/console@npm:29.0.3"
+"@jest/console@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/console@npm:29.3.1"
dependencies:
- "@jest/types": ^29.0.3
+ "@jest/types": ^29.3.1
"@types/node": "*"
chalk: ^4.0.0
- jest-message-util: ^29.0.3
- jest-util: ^29.0.3
+ jest-message-util: ^29.3.1
+ jest-util: ^29.3.1
slash: ^3.0.0
- checksum: 1c5f092082c45c5c35ea51e7c75f4ce06a9b4350e44e0d3aa6c586c469a687fb095ab2601f196f147cccd1c4b5cbf4adc885ae83c8af42dfeee5aa518fa0968e
+ checksum: 9eecbfb6df4f5b810374849b7566d321255e6fd6e804546236650384966be532ff75a3e445a3277eadefe67ddf4dc56cd38332abd72d6a450f1bea9866efc6d7
languageName: node
linkType: hard
-"@jest/core@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/core@npm:29.0.3"
+"@jest/core@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/core@npm:29.3.1"
dependencies:
- "@jest/console": ^29.0.3
- "@jest/reporters": ^29.0.3
- "@jest/test-result": ^29.0.3
- "@jest/transform": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/console": ^29.3.1
+ "@jest/reporters": ^29.3.1
+ "@jest/test-result": ^29.3.1
+ "@jest/transform": ^29.3.1
+ "@jest/types": ^29.3.1
"@types/node": "*"
ansi-escapes: ^4.2.1
chalk: ^4.0.0
ci-info: ^3.2.0
exit: ^0.1.2
graceful-fs: ^4.2.9
- jest-changed-files: ^29.0.0
- jest-config: ^29.0.3
- jest-haste-map: ^29.0.3
- jest-message-util: ^29.0.3
- jest-regex-util: ^29.0.0
- jest-resolve: ^29.0.3
- jest-resolve-dependencies: ^29.0.3
- jest-runner: ^29.0.3
- jest-runtime: ^29.0.3
- jest-snapshot: ^29.0.3
- jest-util: ^29.0.3
- jest-validate: ^29.0.3
- jest-watcher: ^29.0.3
+ jest-changed-files: ^29.2.0
+ jest-config: ^29.3.1
+ jest-haste-map: ^29.3.1
+ jest-message-util: ^29.3.1
+ jest-regex-util: ^29.2.0
+ jest-resolve: ^29.3.1
+ jest-resolve-dependencies: ^29.3.1
+ jest-runner: ^29.3.1
+ jest-runtime: ^29.3.1
+ jest-snapshot: ^29.3.1
+ jest-util: ^29.3.1
+ jest-validate: ^29.3.1
+ jest-watcher: ^29.3.1
micromatch: ^4.0.4
- pretty-format: ^29.0.3
+ pretty-format: ^29.3.1
slash: ^3.0.0
strip-ansi: ^6.0.0
peerDependencies:
@@ -9624,7 +10153,7 @@ __metadata:
peerDependenciesMeta:
node-notifier:
optional: true
- checksum: 411a994ae0df96262c911c894b231a3148280ae39cf0a5d1132c126e708925a3aa89d3f75be628260916a5c38c6ee1ce27979cf78171a393f3c3bbac019149d9
+ checksum: e3ac9201e8a084ccd832b17877b56490402b919f227622bb24f9372931e77b869e60959d34144222ce20fb619d0a6a6be20b257adb077a6b0f430a4584a45b0f
languageName: node
linkType: hard
@@ -9637,72 +10166,72 @@ __metadata:
languageName: node
linkType: hard
-"@jest/environment@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/environment@npm:29.0.3"
+"@jest/environment@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/environment@npm:29.3.1"
dependencies:
- "@jest/fake-timers": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/fake-timers": ^29.3.1
+ "@jest/types": ^29.3.1
"@types/node": "*"
- jest-mock: ^29.0.3
- checksum: 3cf9a6c18d1175f9d9dc353ad26a8482cef3aae8d68574d2c2feaf149e4d6f5c83e145aeefffdc0c614e9b770d26251e476cb1bd86f140c9d19b6adf8f1a2681
+ jest-mock: ^29.3.1
+ checksum: 974102aba7cc80508f787bb5504dcc96e5392e0a7776a63dffbf54ddc2c77d52ef4a3c08ed2eedec91965befff873f70cd7c9ed56f62bb132dcdb821730e6076
languageName: node
linkType: hard
-"@jest/expect-utils@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/expect-utils@npm:29.0.3"
+"@jest/expect-utils@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/expect-utils@npm:29.3.1"
dependencies:
- jest-get-type: ^29.0.0
- checksum: af6fa6e0b9cdf42f5778ff0b70c2049ec768598f720ea473773e0c0bebd2416a32ecbede94cfdc95572a021eda5302a9295a5c416ad5ce155c4ec277c40129da
+ jest-get-type: ^29.2.0
+ checksum: 7f3b853eb1e4299988f66b9aa49c1aacb7b8da1cf5518dca4ccd966e865947eed8f1bde6c8f5207d8400e9af870112a44b57aa83515ad6ea5e4a04a971863adb
languageName: node
linkType: hard
-"@jest/expect@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/expect@npm:29.0.3"
+"@jest/expect@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/expect@npm:29.3.1"
dependencies:
- expect: ^29.0.3
- jest-snapshot: ^29.0.3
- checksum: 8f969cce260b84edc105a73b8314accd305f2ad012031c00a6a4ba8b3db864237719e95a167702badada274bd764c306e561326bef86d950f72b94f5c9c69c7e
+ expect: ^29.3.1
+ jest-snapshot: ^29.3.1
+ checksum: 1d7b5cc735c8a99bfbed884d80fdb43b23b3456f4ec88c50fd86404b097bb77fba84f44e707fc9b49f106ca1154ae03f7c54dc34754b03f8a54eeb420196e5bf
languageName: node
linkType: hard
-"@jest/fake-timers@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/fake-timers@npm:29.0.3"
+"@jest/fake-timers@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/fake-timers@npm:29.3.1"
dependencies:
- "@jest/types": ^29.0.3
+ "@jest/types": ^29.3.1
"@sinonjs/fake-timers": ^9.1.2
"@types/node": "*"
- jest-message-util: ^29.0.3
- jest-mock: ^29.0.3
- jest-util: ^29.0.3
- checksum: c0a641fe239044a766eb27e6e4e085acdc8f53d34813aa883a8da8fcce555d8b6ce06716b94c72b44e60c0ca8088b1f1a1d3b05c7f41ed39fc0f6cf23dead7c4
+ jest-message-util: ^29.3.1
+ jest-mock: ^29.3.1
+ jest-util: ^29.3.1
+ checksum: b1dafa8cdc439ef428cd772c775f0b22703677f52615513eda11a104bbfc352d7ec69b1225db95d4ef2e1b4ef0f23e1a7d96de5313aeb0950f672e6548ae069d
languageName: node
linkType: hard
-"@jest/globals@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/globals@npm:29.0.3"
+"@jest/globals@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/globals@npm:29.3.1"
dependencies:
- "@jest/environment": ^29.0.3
- "@jest/expect": ^29.0.3
- "@jest/types": ^29.0.3
- jest-mock: ^29.0.3
- checksum: ab6a3f93b98c600f6b4d57c5cf593e624847101bf037f452800d891f55612cd042f524f032f4871ff784c1814f85a4939afbd853104f50f78aada353ac124b7e
+ "@jest/environment": ^29.3.1
+ "@jest/expect": ^29.3.1
+ "@jest/types": ^29.3.1
+ jest-mock: ^29.3.1
+ checksum: 4d2b9458aabf7c28fd167e53984477498c897b64eec67a7f84b8fff465235cae1456ee0721cb0e7943f0cda443c7656adb9801f9f34e27495b8ebbd9f3033100
languageName: node
linkType: hard
-"@jest/reporters@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/reporters@npm:29.0.3"
+"@jest/reporters@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/reporters@npm:29.3.1"
dependencies:
"@bcoe/v8-coverage": ^0.2.3
- "@jest/console": ^29.0.3
- "@jest/test-result": ^29.0.3
- "@jest/transform": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/console": ^29.3.1
+ "@jest/test-result": ^29.3.1
+ "@jest/transform": ^29.3.1
+ "@jest/types": ^29.3.1
"@jridgewell/trace-mapping": ^0.3.15
"@types/node": "*"
chalk: ^4.0.0
@@ -9715,20 +10244,19 @@ __metadata:
istanbul-lib-report: ^3.0.0
istanbul-lib-source-maps: ^4.0.0
istanbul-reports: ^3.1.3
- jest-message-util: ^29.0.3
- jest-util: ^29.0.3
- jest-worker: ^29.0.3
+ jest-message-util: ^29.3.1
+ jest-util: ^29.3.1
+ jest-worker: ^29.3.1
slash: ^3.0.0
string-length: ^4.0.1
strip-ansi: ^6.0.0
- terminal-link: ^2.0.0
v8-to-istanbul: ^9.0.1
peerDependencies:
node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
peerDependenciesMeta:
node-notifier:
optional: true
- checksum: 43028a8823cb8d58c5219e0471990e0d7e9014ed9ef6f2853076bd9e49a490fc1bcfcf46a4d7b981725da0f31be1496725a4a0edb0149f7c7f54c5d2299dcae1
+ checksum: 273e0c6953285f01151e9d84ac1e55744802a1ec79fb62dafeea16a49adfe7b24e7f35bef47a0214e5e057272dbfdacf594208286b7766046fd0f3cfa2043840
languageName: node
linkType: hard
@@ -9741,61 +10269,61 @@ __metadata:
languageName: node
linkType: hard
-"@jest/source-map@npm:^29.0.0":
- version: 29.0.0
- resolution: "@jest/source-map@npm:29.0.0"
+"@jest/source-map@npm:^29.2.0":
+ version: 29.2.0
+ resolution: "@jest/source-map@npm:29.2.0"
dependencies:
"@jridgewell/trace-mapping": ^0.3.15
callsites: ^3.0.0
graceful-fs: ^4.2.9
- checksum: dd97bc5826cf68d6eb5565383816332f800476232fd12800bd027a259cbf3ef216f1633405f3ad0861dde3b12a7886301798c078b334f6d3012044d43abcf4f6
+ checksum: 09f76ab63d15dcf44b3035a79412164f43be34ec189575930f1a00c87e36ea0211ebd6a4fbe2253c2516e19b49b131f348ddbb86223ca7b6bbac9a6bc76ec96e
languageName: node
linkType: hard
-"@jest/test-result@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/test-result@npm:29.0.3"
+"@jest/test-result@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/test-result@npm:29.3.1"
dependencies:
- "@jest/console": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/console": ^29.3.1
+ "@jest/types": ^29.3.1
"@types/istanbul-lib-coverage": ^2.0.0
collect-v8-coverage: ^1.0.0
- checksum: 9cb76090b2b49cc19f95c51e3593085ab88b2d9539f9c15b1e7919f770aaee75376b453f30a14f2034a5cb25fa8e14f5fcc422f05954dbdb0873220576d9c9a0
+ checksum: b24ac283321189b624c372a6369c0674b0ee6d9e3902c213452c6334d037113718156b315364bee8cee0f03419c2bdff5e2c63967193fb422830e79cbb26866a
languageName: node
linkType: hard
-"@jest/test-sequencer@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/test-sequencer@npm:29.0.3"
+"@jest/test-sequencer@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/test-sequencer@npm:29.3.1"
dependencies:
- "@jest/test-result": ^29.0.3
+ "@jest/test-result": ^29.3.1
graceful-fs: ^4.2.9
- jest-haste-map: ^29.0.3
+ jest-haste-map: ^29.3.1
slash: ^3.0.0
- checksum: c6868e29a36c2dd4f6aa71a7148fa7bf34fb845e97b29bc418cb6988245ad7f0cd820aa6dcf9389d0e5b4592b9df8a727a40b0b91eee0dad00f683c250b94a2c
+ checksum: a8325b1ea0ce644486fb63bb67cedd3524d04e3d7b1e6c1e3562bf12ef477ecd0cf34044391b2a07d925e1c0c8b4e0f3285035ceca3a474a2c55980f1708caf3
languageName: node
linkType: hard
-"@jest/transform@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/transform@npm:29.0.3"
+"@jest/transform@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/transform@npm:29.3.1"
dependencies:
"@babel/core": ^7.11.6
- "@jest/types": ^29.0.3
+ "@jest/types": ^29.3.1
"@jridgewell/trace-mapping": ^0.3.15
babel-plugin-istanbul: ^6.1.1
chalk: ^4.0.0
- convert-source-map: ^1.4.0
+ convert-source-map: ^2.0.0
fast-json-stable-stringify: ^2.1.0
graceful-fs: ^4.2.9
- jest-haste-map: ^29.0.3
- jest-regex-util: ^29.0.0
- jest-util: ^29.0.3
+ jest-haste-map: ^29.3.1
+ jest-regex-util: ^29.2.0
+ jest-util: ^29.3.1
micromatch: ^4.0.4
pirates: ^4.0.4
slash: ^3.0.0
write-file-atomic: ^4.0.1
- checksum: c68ebb673a27640372c912736aa26bda5bc4dfd7a890bb10c467b81e8a66826c8b8b6826ebf25ed3c7a70b7818fcc60e3c0d7341d1595d5ce4978d53d22a7ea1
+ checksum: 673df5900ffc95bc811084e09d6e47948034dea6ab6cc4f81f80977e3a52468a6c2284d0ba9796daf25a62ae50d12f7e97fc9a3a0c587f11f2a479ff5493ca53
languageName: node
linkType: hard
@@ -9812,9 +10340,9 @@ __metadata:
languageName: node
linkType: hard
-"@jest/types@npm:^29.0.3":
- version: 29.0.3
- resolution: "@jest/types@npm:29.0.3"
+"@jest/types@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "@jest/types@npm:29.3.1"
dependencies:
"@jest/schemas": ^29.0.0
"@types/istanbul-lib-coverage": ^2.0.0
@@ -9822,7 +10350,7 @@ __metadata:
"@types/node": "*"
"@types/yargs": ^17.0.8
chalk: ^4.0.0
- checksum: 3bd33e64d87a5421b860396ac7f7b9b8d5abbf0f300f4379bb20c8e3a6169fbbd078933ce0649827cd63e23330c4effeb6b222fa94e8dd0df638dfff6c1fed41
+ checksum: 6f9faf27507b845ff3839c1adc6dbd038d7046d03d37e84c9fc956f60718711a801a5094c7eeee6b39ccf42c0ab61347fdc0fa49ab493ae5a8efd2fd41228ee8
languageName: node
linkType: hard
@@ -11609,9 +12137,9 @@ __metadata:
linkType: hard
"@octokit/webhooks-methods@npm:^3.0.0":
- version: 3.0.0
- resolution: "@octokit/webhooks-methods@npm:3.0.0"
- checksum: 3d1fdd051acb1e185160e138794b52b168a94dbd0fb05b1267914bfada199ccd615bc62828453b08edc5037557810319198c2684cfe5eba6267686952a9b644d
+ version: 3.0.1
+ resolution: "@octokit/webhooks-methods@npm:3.0.1"
+ checksum: a65344315175459fcc43d1e8ea20f73aa73f0c47a692e0b02d45dfb8fda7075cf5503ff33654a9b6683d32d7e5737965f1ff40618d21a7c637180ae73bf888a4
languageName: node
linkType: hard
@@ -11888,6 +12416,29 @@ __metadata:
languageName: node
linkType: hard
+"@react-hookz/web@npm:^19.0.0":
+ version: 19.2.0
+ resolution: "@react-hookz/web@npm:19.2.0"
+ dependencies:
+ "@react-hookz/deep-equal": ^1.0.3
+ peerDependencies:
+ js-cookie: ^3.0.1
+ react: ^16.8 || ^17 || ^18
+ react-dom: ^16.8 || ^17 || ^18
+ peerDependenciesMeta:
+ js-cookie:
+ optional: true
+ checksum: 0fda3d3a0f967b6b38817f1e72d111711fc01036a8e6d0850bd4e3b3fa41af8635b260babf19e384402ac6d2dfa7db779585c0c8b16700cc0f568df9662ca517
+ languageName: node
+ linkType: hard
+
+"@remix-run/router@npm:1.0.3":
+ version: 1.0.3
+ resolution: "@remix-run/router@npm:1.0.3"
+ checksum: 7e535f3c24bf6b0a48aff3de70ee74e5402fe93105aa9bd01f275d5d8f5a9a8a7cadec08d18cf5544d4f24bc9d7a091abc1c9d4ea8efb2893e9077f104a51459
+ languageName: node
+ linkType: hard
+
"@rjsf/core-v5@npm:@rjsf/core@^5.0.0-beta.12":
version: 5.0.0-beta.12
resolution: "@rjsf/core@npm:5.0.0-beta.12"
@@ -12001,8 +12552,8 @@ __metadata:
linkType: hard
"@roadiehq/backstage-plugin-github-insights@npm:^2.0.5":
- version: 2.1.1
- resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.1.1"
+ version: 2.1.2
+ resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.1.2"
dependencies:
"@backstage/catalog-model": ^1.1.2
"@backstage/core-components": ^0.11.2
@@ -12024,7 +12575,7 @@ __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: 95f02d4e51e88c7e3acf04b4fa54e68bf20800f0c21a22c4231bc6400cfae0cc11e7f0779f6d82e4d76eb6e97c25e7bd4ca869ada14e668d42741fd9b89f7351
+ checksum: e4ccdf5c6e319c72dee2a3b0aafe8f3186ce6d734f805d6d86546383b83da86b94cd9cd7bb43bd6236d24893b1e37c27406b2ac24920f50287eccf2a343c03cc
languageName: node
linkType: hard
@@ -12083,31 +12634,36 @@ __metadata:
languageName: node
linkType: hard
-"@rollup/plugin-commonjs@npm:^22.0.0":
- version: 22.0.2
- resolution: "@rollup/plugin-commonjs@npm:22.0.2"
+"@rollup/plugin-commonjs@npm:^23.0.0":
+ version: 23.0.3
+ resolution: "@rollup/plugin-commonjs@npm:23.0.3"
dependencies:
- "@rollup/pluginutils": ^3.1.0
+ "@rollup/pluginutils": ^5.0.1
commondir: ^1.0.1
- estree-walker: ^2.0.1
- glob: ^7.1.6
- is-reference: ^1.2.1
- magic-string: ^0.25.7
- resolve: ^1.17.0
+ estree-walker: ^2.0.2
+ glob: ^8.0.3
+ is-reference: 1.2.1
+ magic-string: ^0.26.4
peerDependencies:
- rollup: ^2.68.0
- checksum: 70098a4b91afe3f164f5d27cba65edf148c5ed146ee0e07a964b66940681553ac77391083114cdcf9427e7f2706bf0d61eab310b3a2caeab83b7452c0292fcae
+ rollup: ^2.68.0||^3.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ checksum: 925289c1694e871065d741ce210621df894febc267b9ca574dfe24e00a48b436f3eaa6a6f6d00312a78c9b51cc0cad7abf13b97fc455395576007c681d7ec58d
languageName: node
linkType: hard
-"@rollup/plugin-json@npm:^4.1.0":
- version: 4.1.0
- resolution: "@rollup/plugin-json@npm:4.1.0"
+"@rollup/plugin-json@npm:^5.0.0":
+ version: 5.0.2
+ resolution: "@rollup/plugin-json@npm:5.0.2"
dependencies:
- "@rollup/pluginutils": ^3.0.8
+ "@rollup/pluginutils": ^5.0.1
peerDependencies:
- rollup: ^1.20.0 || ^2.0.0
- checksum: 867bc9339b4ccf0b9ff3b2617a95b3b8920115163f86c8e3b1f068a14ca25949472d3c05b09a5ac38ca0fe2185756e34617eaeb219d4a2b6e2307c501c7d4552
+ rollup: ^1.20.0||^2.0.0||^3.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ checksum: 9b5f90ea311dfcfacf0f38af39bbb1954ea56d6faecdee3d528f73d0e02da96a0706ab21fae0c8eef9bb5d756f6f50b40b5a252ffd9800397012b5bac6764b6f
languageName: node
linkType: hard
@@ -12140,7 +12696,7 @@ __metadata:
languageName: node
linkType: hard
-"@rollup/pluginutils@npm:^3.0.8, @rollup/pluginutils@npm:^3.1.0":
+"@rollup/pluginutils@npm:^3.1.0":
version: 3.1.0
resolution: "@rollup/pluginutils@npm:3.1.0"
dependencies:
@@ -12163,6 +12719,22 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/pluginutils@npm:^5.0.1":
+ version: 5.0.2
+ resolution: "@rollup/pluginutils@npm:5.0.2"
+ dependencies:
+ "@types/estree": ^1.0.0
+ estree-walker: ^2.0.2
+ picomatch: ^2.3.1
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ checksum: edea15e543bebc7dcac3b0ac8bc7b8e8e6dbd46e2864dbe5dd28072de1fbd5b0e10d545a610c0edaa178e8a7ac432e2a2a52e547ece1308471412caba47db8ce
+ languageName: node
+ linkType: hard
+
"@rushstack/node-core-library@npm:3.45.4":
version: 3.45.4
resolution: "@rushstack/node-core-library@npm:3.45.4"
@@ -12259,16 +12831,16 @@ __metadata:
languageName: node
linkType: hard
-"@sinonjs/fake-timers@npm:>=5, @sinonjs/fake-timers@npm:^9.1.2":
- version: 9.1.2
- resolution: "@sinonjs/fake-timers@npm:9.1.2"
+"@sinonjs/commons@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "@sinonjs/commons@npm:2.0.0"
dependencies:
- "@sinonjs/commons": ^1.7.0
- checksum: 7d3aef54e17c1073101cb64d953157c19d62a40e261a30923fa1ee337b049c5f29cc47b1f0c477880f42b5659848ba9ab897607ac8ea4acd5c30ddcfac57fca6
+ type-detect: 4.0.8
+ checksum: 5023ba17edf2b85ed58262313b8e9b59e23c6860681a9af0200f239fe939e2b79736d04a260e8270ddd57196851dde3ba754d7230be5c5234e777ae2ca8af137
languageName: node
linkType: hard
-"@sinonjs/fake-timers@npm:^7.1.2":
+"@sinonjs/fake-timers@npm:^7.0.4":
version: 7.1.2
resolution: "@sinonjs/fake-timers@npm:7.1.2"
dependencies:
@@ -12277,7 +12849,16 @@ __metadata:
languageName: node
linkType: hard
-"@sinonjs/samsam@npm:^6.0.2, @sinonjs/samsam@npm:^6.1.1":
+"@sinonjs/fake-timers@npm:^9.1.2":
+ version: 9.1.2
+ resolution: "@sinonjs/fake-timers@npm:9.1.2"
+ dependencies:
+ "@sinonjs/commons": ^1.7.0
+ checksum: 7d3aef54e17c1073101cb64d953157c19d62a40e261a30923fa1ee337b049c5f29cc47b1f0c477880f42b5659848ba9ab897607ac8ea4acd5c30ddcfac57fca6
+ languageName: node
+ linkType: hard
+
+"@sinonjs/samsam@npm:^6.1.1":
version: 6.1.1
resolution: "@sinonjs/samsam@npm:6.1.1"
dependencies:
@@ -12288,6 +12869,17 @@ __metadata:
languageName: node
linkType: hard
+"@sinonjs/samsam@npm:^7.0.1":
+ version: 7.0.1
+ resolution: "@sinonjs/samsam@npm:7.0.1"
+ dependencies:
+ "@sinonjs/commons": ^2.0.0
+ lodash.get: ^4.4.2
+ type-detect: ^4.0.8
+ checksum: 291efb158d54c67dee23ddabcb28873d22063449b692aaa3b2a4f1826d2f79d38695574063c92e9c17573cc805cd6acbf0ab0c66c9f3aed7afd0f12a2b905615
+ languageName: node
+ linkType: hard
+
"@sinonjs/text-encoding@npm:^0.7.1":
version: 0.7.1
resolution: "@sinonjs/text-encoding@npm:0.7.1"
@@ -12529,90 +13121,90 @@ __metadata:
languageName: node
linkType: hard
-"@swc/core-darwin-arm64@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-darwin-arm64@npm:1.3.19"
+"@swc/core-darwin-arm64@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-darwin-arm64@npm:1.3.20"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-darwin-x64@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-darwin-x64@npm:1.3.19"
+"@swc/core-darwin-x64@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-darwin-x64@npm:1.3.20"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@swc/core-linux-arm-gnueabihf@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.19"
+"@swc/core-linux-arm-gnueabihf@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.20"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
-"@swc/core-linux-arm64-gnu@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-linux-arm64-gnu@npm:1.3.19"
+"@swc/core-linux-arm64-gnu@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-linux-arm64-gnu@npm:1.3.20"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-arm64-musl@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-linux-arm64-musl@npm:1.3.19"
+"@swc/core-linux-arm64-musl@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-linux-arm64-musl@npm:1.3.20"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-linux-x64-gnu@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-linux-x64-gnu@npm:1.3.19"
+"@swc/core-linux-x64-gnu@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-linux-x64-gnu@npm:1.3.20"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-x64-musl@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-linux-x64-musl@npm:1.3.19"
+"@swc/core-linux-x64-musl@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-linux-x64-musl@npm:1.3.20"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-win32-arm64-msvc@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-win32-arm64-msvc@npm:1.3.19"
+"@swc/core-win32-arm64-msvc@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-win32-arm64-msvc@npm:1.3.20"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-win32-ia32-msvc@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-win32-ia32-msvc@npm:1.3.19"
+"@swc/core-win32-ia32-msvc@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-win32-ia32-msvc@npm:1.3.20"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@swc/core-win32-x64-msvc@npm:1.3.19":
- version: 1.3.19
- resolution: "@swc/core-win32-x64-msvc@npm:1.3.19"
+"@swc/core-win32-x64-msvc@npm:1.3.20":
+ version: 1.3.20
+ resolution: "@swc/core-win32-x64-msvc@npm:1.3.20"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@swc/core@npm:^1.3.9":
- version: 1.3.19
- resolution: "@swc/core@npm:1.3.19"
+ version: 1.3.20
+ resolution: "@swc/core@npm:1.3.20"
dependencies:
- "@swc/core-darwin-arm64": 1.3.19
- "@swc/core-darwin-x64": 1.3.19
- "@swc/core-linux-arm-gnueabihf": 1.3.19
- "@swc/core-linux-arm64-gnu": 1.3.19
- "@swc/core-linux-arm64-musl": 1.3.19
- "@swc/core-linux-x64-gnu": 1.3.19
- "@swc/core-linux-x64-musl": 1.3.19
- "@swc/core-win32-arm64-msvc": 1.3.19
- "@swc/core-win32-ia32-msvc": 1.3.19
- "@swc/core-win32-x64-msvc": 1.3.19
+ "@swc/core-darwin-arm64": 1.3.20
+ "@swc/core-darwin-x64": 1.3.20
+ "@swc/core-linux-arm-gnueabihf": 1.3.20
+ "@swc/core-linux-arm64-gnu": 1.3.20
+ "@swc/core-linux-arm64-musl": 1.3.20
+ "@swc/core-linux-x64-gnu": 1.3.20
+ "@swc/core-linux-x64-musl": 1.3.20
+ "@swc/core-win32-arm64-msvc": 1.3.20
+ "@swc/core-win32-ia32-msvc": 1.3.20
+ "@swc/core-win32-x64-msvc": 1.3.20
dependenciesMeta:
"@swc/core-darwin-arm64":
optional: true
@@ -12636,7 +13228,7 @@ __metadata:
optional: true
bin:
swcx: run_swcx.js
- checksum: 752499e18f81df789a9737936b2a83ea1db34bb2f983c80b394766796d853fa7d30701b52b9cb30ba943ad15286d8316603149683f4c553a5493aa78d89a76e0
+ checksum: 646c37e3521f04cd08061ab67a4388959e4b234c38eba2eb9fe0fd615dedb6ff9412264789e58af7c2d24b3e5a7ea456efd060e3760d7a91509234b5b5983ad7
languageName: node
linkType: hard
@@ -12670,18 +13262,18 @@ __metadata:
languageName: node
linkType: hard
-"@tanstack/query-core@npm:4.15.1":
- version: 4.15.1
- resolution: "@tanstack/query-core@npm:4.15.1"
- checksum: ee98e75a3770fd35a6a10b9e7b3c417ea9da2b072481b5191d759182b29fd7bc4e8e340f83e2961b46fe4e1adac356087df04d4661c9459d09ff4d0574f683eb
+"@tanstack/query-core@npm:4.18.0":
+ version: 4.18.0
+ resolution: "@tanstack/query-core@npm:4.18.0"
+ checksum: 2d3f253809e2fc0927bbab25e7a61cf1fa957c993006f219a8dcc615acfe68003629e612c7d914198457d0b1bfd2b6d5738093fc45a82369b1d3beee14395a28
languageName: node
linkType: hard
"@tanstack/react-query@npm:^4.1.3":
- version: 4.16.1
- resolution: "@tanstack/react-query@npm:4.16.1"
+ version: 4.18.0
+ resolution: "@tanstack/react-query@npm:4.18.0"
dependencies:
- "@tanstack/query-core": 4.15.1
+ "@tanstack/query-core": 4.18.0
use-sync-external-store: ^1.2.0
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
@@ -12692,7 +13284,7 @@ __metadata:
optional: true
react-native:
optional: true
- checksum: 2c2d4c5c8bab2cd978ddd42153d33f844bd24a17ebe42f269cc64ee2a031f60f980b441640172885d9fd156fe9abc74ffc800fb68c6b6f6ef4fe48ffadafff79
+ checksum: 2fbb3e664fdc70650dfaaa63e56a1b97dddb50a46f6d3e0a0361c1fe9a0d711c1bb3b0f2e7ba5362269124405eb7a4f232a755b3e901b815d62008ddeedbd889
languageName: node
linkType: hard
@@ -13388,10 +13980,10 @@ __metadata:
languageName: node
linkType: hard
-"@types/estree@npm:*, @types/estree@npm:^0.0.51":
- version: 0.0.51
- resolution: "@types/estree@npm:0.0.51"
- checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189
+"@types/estree@npm:*, @types/estree@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "@types/estree@npm:1.0.0"
+ checksum: 910d97fb7092c6738d30a7430ae4786a38542023c6302b95d46f49420b797f21619cdde11fa92b338366268795884111c2eb10356e4bd2c8ad5b92941e9e6443
languageName: node
linkType: hard
@@ -13402,6 +13994,13 @@ __metadata:
languageName: node
linkType: hard
+"@types/estree@npm:^0.0.51":
+ version: 0.0.51
+ resolution: "@types/estree@npm:0.0.51"
+ checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189
+ languageName: node
+ linkType: hard
+
"@types/event-source-polyfill@npm:^1.0.0":
version: 1.0.0
resolution: "@types/event-source-polyfill@npm:1.0.0"
@@ -13645,12 +14244,12 @@ __metadata:
linkType: hard
"@types/jest@npm:*, @types/jest@npm:^29.0.0":
- version: 29.0.3
- resolution: "@types/jest@npm:29.0.3"
+ version: 29.2.3
+ resolution: "@types/jest@npm:29.2.3"
dependencies:
expect: ^29.0.0
pretty-format: ^29.0.0
- checksum: 14a8ec1954540ec59f4072c3c4dbc6b5d5ff616556c98671aca26606bdf9d49616a3f269f3e488c80cd481ee19880351575c1f6895827628818e193600c121e0
+ checksum: 55370906711b600a05b9e497c22aa74d80d8adcdbe4ac2f1bc9311f6f6ca0dd192862b6f38df6ac0d45e92396bcd796e377b1d8058c10bdfd584aeee580c3ce1
languageName: node
linkType: hard
@@ -14172,11 +14771,11 @@ __metadata:
linkType: hard
"@types/react-helmet@npm:^6.1.0":
- version: 6.1.5
- resolution: "@types/react-helmet@npm:6.1.5"
+ version: 6.1.6
+ resolution: "@types/react-helmet@npm:6.1.6"
dependencies:
"@types/react": "*"
- checksum: d059cc084d3b3071cce3421bb1170dd42819cf39b81afe60d4fbd66c5ef9ffeaadf1802df80efd9553258f621678f69ceb5a21d73df0d8539d40ae9a0f995485
+ checksum: 81560c56bfe854b6a43aee31360862588ac875d1177b975da5ce049ac9aa2f7c98dcde65d4397bfaa04e468f40cf3ab2975a2ef966a69d64a60493422898698d
languageName: node
linkType: hard
@@ -14760,15 +15359,15 @@ __metadata:
linkType: hard
"@typescript-eslint/eslint-plugin@npm:^5.9.0":
- version: 5.36.2
- resolution: "@typescript-eslint/eslint-plugin@npm:5.36.2"
+ version: 5.45.0
+ resolution: "@typescript-eslint/eslint-plugin@npm:5.45.0"
dependencies:
- "@typescript-eslint/scope-manager": 5.36.2
- "@typescript-eslint/type-utils": 5.36.2
- "@typescript-eslint/utils": 5.36.2
+ "@typescript-eslint/scope-manager": 5.45.0
+ "@typescript-eslint/type-utils": 5.45.0
+ "@typescript-eslint/utils": 5.45.0
debug: ^4.3.4
- functional-red-black-tree: ^1.0.1
ignore: ^5.2.0
+ natural-compare-lite: ^1.4.0
regexpp: ^3.2.0
semver: ^7.3.7
tsutils: ^3.21.0
@@ -14778,7 +15377,7 @@ __metadata:
peerDependenciesMeta:
typescript:
optional: true
- checksum: edcd9fcecdeb22a689b421cafe3b7adc859bf2fd6227aecdd7412c319c808e7bab063c8f94af32116cfc971962f9780d181cb0a4aa999951c2d2be1f84c6c376
+ checksum: 7cff671a9ba33afa86f0ece6d0ebaeb5fc16596fc659ef230f6f65bfddfef2ffb6434310e3a4444fb852e79e40c85c5e62c559df6ddc9312aac235a18afdd269
languageName: node
linkType: hard
@@ -14799,39 +15398,29 @@ __metadata:
linkType: hard
"@typescript-eslint/parser@npm:^5.9.0":
- version: 5.36.2
- resolution: "@typescript-eslint/parser@npm:5.36.2"
+ version: 5.45.0
+ resolution: "@typescript-eslint/parser@npm:5.45.0"
dependencies:
- "@typescript-eslint/scope-manager": 5.36.2
- "@typescript-eslint/types": 5.36.2
- "@typescript-eslint/typescript-estree": 5.36.2
+ "@typescript-eslint/scope-manager": 5.45.0
+ "@typescript-eslint/types": 5.45.0
+ "@typescript-eslint/typescript-estree": 5.45.0
debug: ^4.3.4
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
peerDependenciesMeta:
typescript:
optional: true
- checksum: d6cc22cbc7aacb5ecebf55eb1d681cb6b964b108e147b418295c3e48701a77768cff128c16da421ae50eabb9f1296ecec7fa3cc5f2ccb63a3febf79f98b4195f
+ checksum: b8ce3af72de3ff22bb206c3299e728d37a836dbe1f75bcb66ad3bb7962204174b7fff834992b84f0e661de507729c01c7ad71ad2707c217cccc3c0f798a9dc23
languageName: node
linkType: hard
-"@typescript-eslint/scope-manager@npm:5.36.2":
- version: 5.36.2
- resolution: "@typescript-eslint/scope-manager@npm:5.36.2"
+"@typescript-eslint/scope-manager@npm:5.45.0":
+ version: 5.45.0
+ resolution: "@typescript-eslint/scope-manager@npm:5.45.0"
dependencies:
- "@typescript-eslint/types": 5.36.2
- "@typescript-eslint/visitor-keys": 5.36.2
- checksum: 93ff655f7c237c88ec6dc5911202dd8f81bd8909b27f1a758a9d77e9791040f1ee6fe2891314bde75c808ce586246e98003a1b1396937b0312f2440016dea751
- languageName: node
- linkType: hard
-
-"@typescript-eslint/scope-manager@npm:5.43.0":
- version: 5.43.0
- resolution: "@typescript-eslint/scope-manager@npm:5.43.0"
- dependencies:
- "@typescript-eslint/types": 5.43.0
- "@typescript-eslint/visitor-keys": 5.43.0
- checksum: e594c7a32c3fa29e46dd0b0bc62f97f154bd864682ae7da87a14b6f4336f4cb02f6ed0602bbdb15783e4230ecdf8a0ccc6f7c5820850e8f11240c9e4fb0e388d
+ "@typescript-eslint/types": 5.45.0
+ "@typescript-eslint/visitor-keys": 5.45.0
+ checksum: 8f686be8ee0c7ac49ee2a313570cddf86a1364b1ec129f50f8a531038a3bb241429734dc5e2c4e5dd76cc3ed149628aa3e8425cc092f37ca6885b1995c99c2d1
languageName: node
linkType: hard
@@ -14845,12 +15434,12 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/type-utils@npm:5.36.2":
- version: 5.36.2
- resolution: "@typescript-eslint/type-utils@npm:5.36.2"
+"@typescript-eslint/type-utils@npm:5.45.0":
+ version: 5.45.0
+ resolution: "@typescript-eslint/type-utils@npm:5.45.0"
dependencies:
- "@typescript-eslint/typescript-estree": 5.36.2
- "@typescript-eslint/utils": 5.36.2
+ "@typescript-eslint/typescript-estree": 5.45.0
+ "@typescript-eslint/utils": 5.45.0
debug: ^4.3.4
tsutils: ^3.21.0
peerDependencies:
@@ -14858,21 +15447,14 @@ __metadata:
peerDependenciesMeta:
typescript:
optional: true
- checksum: c202b7d2cd08ed7f7d1ad7e430e9e1596478e147f0d485d02babfda0211c55fa950de1dc4d1c950008a8a047a31c1e982e97fe5558f93d496830eb9d9532bc71
+ checksum: be96c89b91116b8fbed160631f3cdd345d47e34248a38e8a730fa9e09a4aa21184259414547d3c7a741b83fa68d4a14f77e9fc93b84aba4752f67bd5a772bf27
languageName: node
linkType: hard
-"@typescript-eslint/types@npm:5.36.2":
- version: 5.36.2
- resolution: "@typescript-eslint/types@npm:5.36.2"
- checksum: 736cb8a76b58f2f9a7d066933094c5510ffe31479ea8b804a829ec85942420f1b55e0eb2688fbdaaaa9c0e5b3b590fb8f14bbd745353696b4fd33fda620d417b
- languageName: node
- linkType: hard
-
-"@typescript-eslint/types@npm:5.43.0":
- version: 5.43.0
- resolution: "@typescript-eslint/types@npm:5.43.0"
- checksum: fc5e5431c305feee4a3faae84f34df482e08d74b910a6f9376b01326c682ceefeeb0e270d03d7778787bc94ef05b3b85ee6d3c9d732290fbdb4a67ae1b110226
+"@typescript-eslint/types@npm:5.45.0":
+ version: 5.45.0
+ resolution: "@typescript-eslint/types@npm:5.45.0"
+ checksum: 43d533622995f002221e439ea517aa07dbce2067cc880a6eb9d26307c505b746975f334d76b35501a2f4dd06d7aaf79964d86ce5a95e76a4f309d6e54faf5213
languageName: node
linkType: hard
@@ -14883,12 +15465,12 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/typescript-estree@npm:5.36.2":
- version: 5.36.2
- resolution: "@typescript-eslint/typescript-estree@npm:5.36.2"
+"@typescript-eslint/typescript-estree@npm:5.45.0":
+ version: 5.45.0
+ resolution: "@typescript-eslint/typescript-estree@npm:5.45.0"
dependencies:
- "@typescript-eslint/types": 5.36.2
- "@typescript-eslint/visitor-keys": 5.36.2
+ "@typescript-eslint/types": 5.45.0
+ "@typescript-eslint/visitor-keys": 5.45.0
debug: ^4.3.4
globby: ^11.1.0
is-glob: ^4.0.3
@@ -14897,25 +15479,7 @@ __metadata:
peerDependenciesMeta:
typescript:
optional: true
- checksum: 2827ff57a114b6107ea6d555f3855007133b08a7c2bafba0cfa0c935d8b99fd7b49e982d48cccc1c5ba550d95748d0239f5e2109893f12a165d76ed64a0d261b
- languageName: node
- linkType: hard
-
-"@typescript-eslint/typescript-estree@npm:5.43.0":
- version: 5.43.0
- resolution: "@typescript-eslint/typescript-estree@npm:5.43.0"
- dependencies:
- "@typescript-eslint/types": 5.43.0
- "@typescript-eslint/visitor-keys": 5.43.0
- debug: ^4.3.4
- globby: ^11.1.0
- is-glob: ^4.0.3
- semver: ^7.3.7
- tsutils: ^3.21.0
- peerDependenciesMeta:
- typescript:
- optional: true
- checksum: 3479f9413d73369ab3d574580c90a72f74d2ae1ec4afe485eebfad054c3d15c89f23a137bb9d6197dfdae33e444a76a99f6832688787feabbb064e09d39a3f55
+ checksum: 8f48b3c75c155491ee49436c470e491f9fe48e6e7c95190c4d0c0ab64ce24e8bc6715de86996baf57fc9f0c6dae986ce9ae075e656664489bfa1dc706eaafcd7
languageName: node
linkType: hard
@@ -14937,57 +15501,31 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/utils@npm:5.36.2":
- version: 5.36.2
- resolution: "@typescript-eslint/utils@npm:5.36.2"
- dependencies:
- "@types/json-schema": ^7.0.9
- "@typescript-eslint/scope-manager": 5.36.2
- "@typescript-eslint/types": 5.36.2
- "@typescript-eslint/typescript-estree": 5.36.2
- eslint-scope: ^5.1.1
- eslint-utils: ^3.0.0
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
- checksum: 45356cf55a8733e3ab1f2c3c19cdaefdb79857e35eb1433c29b81f3df071e9cef8a286bc407abe243889a21d9e793e999f92f03b9c727a0fac1c17a48e64c42a
- languageName: node
- linkType: hard
-
-"@typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.13.0":
- version: 5.43.0
- resolution: "@typescript-eslint/utils@npm:5.43.0"
+"@typescript-eslint/utils@npm:5.45.0, @typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.13.0":
+ version: 5.45.0
+ resolution: "@typescript-eslint/utils@npm:5.45.0"
dependencies:
"@types/json-schema": ^7.0.9
"@types/semver": ^7.3.12
- "@typescript-eslint/scope-manager": 5.43.0
- "@typescript-eslint/types": 5.43.0
- "@typescript-eslint/typescript-estree": 5.43.0
+ "@typescript-eslint/scope-manager": 5.45.0
+ "@typescript-eslint/types": 5.45.0
+ "@typescript-eslint/typescript-estree": 5.45.0
eslint-scope: ^5.1.1
eslint-utils: ^3.0.0
semver: ^7.3.7
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
- checksum: 4c6b383b51506b57230f2624f883ae21e5d8411d138587c04fe3145f915bf8c289cc2a9f7b0b3faba98345ba230504e5014922bcc578aa0badd594d9eaa8f9ef
+ checksum: 33a383881efb6c6e0ecd32f74810ca18bb5e85d4839f607409047d6e3d64a98b3cd1e811d027638d051b3741981de50a652c3abe0fcbb70fac80d7d93cd3e36f
languageName: node
linkType: hard
-"@typescript-eslint/visitor-keys@npm:5.36.2":
- version: 5.36.2
- resolution: "@typescript-eslint/visitor-keys@npm:5.36.2"
+"@typescript-eslint/visitor-keys@npm:5.45.0":
+ version: 5.45.0
+ resolution: "@typescript-eslint/visitor-keys@npm:5.45.0"
dependencies:
- "@typescript-eslint/types": 5.36.2
+ "@typescript-eslint/types": 5.45.0
eslint-visitor-keys: ^3.3.0
- checksum: 87ccdcfa5cdedaa3a1aac30d656969f4f5910b62bcaacdf80a514dbf0cbbd8e79b55f8e987eab34cc79ece8ce4b8c19d5caf8b0afb74e0b0d7ab39fb29aa8eba
- languageName: node
- linkType: hard
-
-"@typescript-eslint/visitor-keys@npm:5.43.0":
- version: 5.43.0
- resolution: "@typescript-eslint/visitor-keys@npm:5.43.0"
- dependencies:
- "@typescript-eslint/types": 5.43.0
- eslint-visitor-keys: ^3.3.0
- checksum: 4820679e50096dcdaadc7c95d32e5dca3ba8510acf1a865e283822bae3940a2faec02ad8abe793f8a25f75b600f1e7215e1fd3b3ba73779eff737fa90d092550
+ checksum: 050cc4275d8a3638a106c2915410710e775382996130a6b2af732269e55cbbc4ed438c8662ddf409635d2d8bd0d8a4389b3980bc2cb38c6105c77c6835222af0
languageName: node
linkType: hard
@@ -16212,13 +16750,13 @@ __metadata:
linkType: hard
"aws-sdk-client-mock@npm:^2.0.0":
- version: 2.0.0
- resolution: "aws-sdk-client-mock@npm:2.0.0"
+ version: 2.0.1
+ resolution: "aws-sdk-client-mock@npm:2.0.1"
dependencies:
"@types/sinon": ^10.0.10
- sinon: ^11.1.1
+ sinon: ^14.0.2
tslib: ^2.1.0
- checksum: e6081ca6bb72f5c082dfcd93155bbb7e1c9e8d3d346914ed05d736c495a5ef99ab3d0253507aff2e07b5b995fae63671e53e094437ddfaf8649d69725628ff8f
+ checksum: 447502ba9270777db129ddcf0245502771c1415d4293f7b001e0a3dc18ab0ce778a7f2d40a86dadb2637d3b83be2df4e833d7f4f6c49678495c932340558c465
languageName: node
linkType: hard
@@ -16340,20 +16878,20 @@ __metadata:
languageName: node
linkType: hard
-"babel-jest@npm:^29.0.3":
- version: 29.0.3
- resolution: "babel-jest@npm:29.0.3"
+"babel-jest@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "babel-jest@npm:29.3.1"
dependencies:
- "@jest/transform": ^29.0.3
+ "@jest/transform": ^29.3.1
"@types/babel__core": ^7.1.14
babel-plugin-istanbul: ^6.1.1
- babel-preset-jest: ^29.0.2
+ babel-preset-jest: ^29.2.0
chalk: ^4.0.0
graceful-fs: ^4.2.9
slash: ^3.0.0
peerDependencies:
"@babel/core": ^7.8.0
- checksum: 4670945691c204464f7694017d59148b97cdbd51ff91ef492340ef5d6bbc74c461fa698a5feb04a93515300632ed44a55e85500bb61206d8a7ff60afb5b6da48
+ checksum: 793848238a771a931ddeb5930b9ec8ab800522ac8d64933665698f4a39603d157e572e20b57d79610277e1df88d3ee82b180d59a21f3570388f602beeb38a595
languageName: node
linkType: hard
@@ -16379,15 +16917,15 @@ __metadata:
languageName: node
linkType: hard
-"babel-plugin-jest-hoist@npm:^29.0.2":
- version: 29.0.2
- resolution: "babel-plugin-jest-hoist@npm:29.0.2"
+"babel-plugin-jest-hoist@npm:^29.2.0":
+ version: 29.2.0
+ resolution: "babel-plugin-jest-hoist@npm:29.2.0"
dependencies:
"@babel/template": ^7.3.3
"@babel/types": ^7.3.3
"@types/babel__core": ^7.1.14
"@types/babel__traverse": ^7.0.6
- checksum: e02ab2c56b471940bc147d75808f6fb5d18b81382088beb36088d2fee8c5f9699b2a814a98884539191d43871d66770928e09c268c095ec39aad5766c3337f34
+ checksum: 368d271ceae491ae6b96cd691434859ea589fbe5fd5aead7660df75d02394077273c6442f61f390e9347adffab57a32b564d0fabcf1c53c4b83cd426cb644072
languageName: node
linkType: hard
@@ -16526,15 +17064,15 @@ __metadata:
languageName: node
linkType: hard
-"babel-preset-jest@npm:^29.0.2":
- version: 29.0.2
- resolution: "babel-preset-jest@npm:29.0.2"
+"babel-preset-jest@npm:^29.2.0":
+ version: 29.2.0
+ resolution: "babel-preset-jest@npm:29.2.0"
dependencies:
- babel-plugin-jest-hoist: ^29.0.2
+ babel-plugin-jest-hoist: ^29.2.0
babel-preset-current-node-syntax: ^1.0.0
peerDependencies:
"@babel/core": ^7.0.0
- checksum: 485db525f4cd38c02c29edcd7240dd232e8d6dbcaef88bfa4765ad3057ed733512f1b7aad06f4bf9661afefeb0ada2c4e259d130113b0289d7db574f82bbd4f8
+ checksum: 1b09a2db968c36e064daf98082cfffa39c849b63055112ddc56fc2551fd0d4783897265775b1d2f8a257960a3339745de92e74feb01bad86d41c4cecbfa854fc
languageName: node
linkType: hard
@@ -17079,6 +17617,16 @@ __metadata:
languageName: node
linkType: hard
+"buffer@npm:5.6.0":
+ version: 5.6.0
+ resolution: "buffer@npm:5.6.0"
+ dependencies:
+ base64-js: ^1.0.2
+ ieee754: ^1.1.4
+ checksum: d659494c5032dd39d03d2912e64179cc44c6340e7e9d1f68d3840e7ab4559989fbce92b4950174593c38d05268224235ba404f0878775cab2a616b6dcad9c23e
+ languageName: node
+ linkType: hard
+
"buffer@npm:^5.2.0, buffer@npm:^5.2.1, buffer@npm:^5.5.0, buffer@npm:^5.6.0":
version: 5.7.1
resolution: "buffer@npm:5.7.1"
@@ -18007,7 +18555,7 @@ __metadata:
languageName: node
linkType: hard
-"colorette@npm:2.0.19, colorette@npm:^2.0.10, colorette@npm:^2.0.16, colorette@npm:^2.0.17":
+"colorette@npm:2.0.19, colorette@npm:^2.0.10, colorette@npm:^2.0.16, colorette@npm:^2.0.19":
version: 2.0.19
resolution: "colorette@npm:2.0.19"
checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427
@@ -18075,7 +18623,7 @@ __metadata:
languageName: node
linkType: hard
-"commander@npm:*, commander@npm:^9.1.0, commander@npm:^9.3.0":
+"commander@npm:*, commander@npm:^9.1.0, commander@npm:^9.4.1":
version: 9.4.1
resolution: "commander@npm:9.4.1"
checksum: bfb18e325a5bdf772763c2213d5c7d9e77144d944124e988bcd8e5e65fb6d45d5d4e86b09155d0f2556c9a59c31e428720e57968bcd050b2306e910a0bf3cf13
@@ -18397,7 +18945,7 @@ __metadata:
languageName: node
linkType: hard
-"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0":
+"convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0":
version: 1.7.0
resolution: "convert-source-map@npm:1.7.0"
dependencies:
@@ -18406,6 +18954,13 @@ __metadata:
languageName: node
linkType: hard
+"convert-source-map@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "convert-source-map@npm:2.0.0"
+ checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035
+ languageName: node
+ linkType: hard
+
"cookie-parser@npm:^1.4.5":
version: 1.4.6
resolution: "cookie-parser@npm:1.4.6"
@@ -18648,11 +19203,11 @@ __metadata:
linkType: hard
"cronstrue@npm:^2.2.0":
- version: 2.19.0
- resolution: "cronstrue@npm:2.19.0"
+ version: 2.20.0
+ resolution: "cronstrue@npm:2.20.0"
bin:
cronstrue: bin/cli.js
- checksum: 8f51c4c5016ed696569aed4fdb91013a499c3ace93cc5385dfe41d15b9fcc5f284d7eb457fdfe2fa4b05a3849f025ba8a3ad22197c40453efb0ef94271b3e843
+ checksum: 31b145cdeca5260fb120b072a9c69a12f722b895fbfea4792829efffd78a85c6e8eef1029a5a2563a12487ff6b06e717d1f117c5f156bf6a1ad7bb1b66d5a9fe
languageName: node
linkType: hard
@@ -19753,10 +20308,10 @@ __metadata:
languageName: node
linkType: hard
-"diff-sequences@npm:^29.0.0":
- version: 29.0.0
- resolution: "diff-sequences@npm:29.0.0"
- checksum: 2c084a3db03ecde26f649f6f2559974e01e174451debeb301a7e17199e73423a8e8ddeb9a35ae38638c084b4fa51296a4a20fa7f44f3db0c0ba566bdc704ed3d
+"diff-sequences@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "diff-sequences@npm:29.3.1"
+ checksum: 8edab8c383355022e470779a099852d595dd856f9f5bd7af24f177e74138a668932268b4c4fd54096eed643861575c3652d4ecbbb1a9d710488286aed3ffa443
languageName: node
linkType: hard
@@ -20192,10 +20747,10 @@ __metadata:
languageName: node
linkType: hard
-"emittery@npm:^0.10.2":
- version: 0.10.2
- resolution: "emittery@npm:0.10.2"
- checksum: ee3e21788b043b90885b18ea756ec3105c1cedc50b29709c92b01e239c7e55345d4bb6d3aef4ddbaf528eef448a40b3bb831bad9ee0fc9c25cbf1367ab1ab5ac
+"emittery@npm:^0.13.1":
+ version: 0.13.1
+ resolution: "emittery@npm:0.13.1"
+ checksum: 2b089ab6306f38feaabf4f6f02792f9ec85fc054fda79f44f6790e61bbf6bc4e1616afb9b232e0c5ec5289a8a452f79bfa6d905a6fd64e94b49981f0934001c6
languageName: node
linkType: hard
@@ -20457,100 +21012,100 @@ __metadata:
languageName: node
linkType: hard
-"esbuild-android-64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-android-64@npm:0.15.15"
+"esbuild-android-64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-android-64@npm:0.15.16"
conditions: os=android & cpu=x64
languageName: node
linkType: hard
-"esbuild-android-arm64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-android-arm64@npm:0.15.15"
+"esbuild-android-arm64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-android-arm64@npm:0.15.16"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
-"esbuild-darwin-64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-darwin-64@npm:0.15.15"
+"esbuild-darwin-64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-darwin-64@npm:0.15.16"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"esbuild-darwin-arm64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-darwin-arm64@npm:0.15.15"
+"esbuild-darwin-arm64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-darwin-arm64@npm:0.15.16"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"esbuild-freebsd-64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-freebsd-64@npm:0.15.15"
+"esbuild-freebsd-64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-freebsd-64@npm:0.15.16"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
-"esbuild-freebsd-arm64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-freebsd-arm64@npm:0.15.15"
+"esbuild-freebsd-arm64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-freebsd-arm64@npm:0.15.16"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
-"esbuild-linux-32@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-linux-32@npm:0.15.15"
+"esbuild-linux-32@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-linux-32@npm:0.15.16"
conditions: os=linux & cpu=ia32
languageName: node
linkType: hard
-"esbuild-linux-64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-linux-64@npm:0.15.15"
+"esbuild-linux-64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-linux-64@npm:0.15.16"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
-"esbuild-linux-arm64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-linux-arm64@npm:0.15.15"
+"esbuild-linux-arm64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-linux-arm64@npm:0.15.16"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
-"esbuild-linux-arm@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-linux-arm@npm:0.15.15"
+"esbuild-linux-arm@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-linux-arm@npm:0.15.16"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
-"esbuild-linux-mips64le@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-linux-mips64le@npm:0.15.15"
+"esbuild-linux-mips64le@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-linux-mips64le@npm:0.15.16"
conditions: os=linux & cpu=mips64el
languageName: node
linkType: hard
-"esbuild-linux-ppc64le@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-linux-ppc64le@npm:0.15.15"
+"esbuild-linux-ppc64le@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-linux-ppc64le@npm:0.15.16"
conditions: os=linux & cpu=ppc64
languageName: node
linkType: hard
-"esbuild-linux-riscv64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-linux-riscv64@npm:0.15.15"
+"esbuild-linux-riscv64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-linux-riscv64@npm:0.15.16"
conditions: os=linux & cpu=riscv64
languageName: node
linkType: hard
-"esbuild-linux-s390x@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-linux-s390x@npm:0.15.15"
+"esbuild-linux-s390x@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-linux-s390x@npm:0.15.16"
conditions: os=linux & cpu=s390x
languageName: node
linkType: hard
@@ -20571,74 +21126,74 @@ __metadata:
languageName: node
linkType: hard
-"esbuild-netbsd-64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-netbsd-64@npm:0.15.15"
+"esbuild-netbsd-64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-netbsd-64@npm:0.15.16"
conditions: os=netbsd & cpu=x64
languageName: node
linkType: hard
-"esbuild-openbsd-64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-openbsd-64@npm:0.15.15"
+"esbuild-openbsd-64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-openbsd-64@npm:0.15.16"
conditions: os=openbsd & cpu=x64
languageName: node
linkType: hard
-"esbuild-sunos-64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-sunos-64@npm:0.15.15"
+"esbuild-sunos-64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-sunos-64@npm:0.15.16"
conditions: os=sunos & cpu=x64
languageName: node
linkType: hard
-"esbuild-windows-32@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-windows-32@npm:0.15.15"
+"esbuild-windows-32@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-windows-32@npm:0.15.16"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"esbuild-windows-64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-windows-64@npm:0.15.15"
+"esbuild-windows-64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-windows-64@npm:0.15.16"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
-"esbuild-windows-arm64@npm:0.15.15":
- version: 0.15.15
- resolution: "esbuild-windows-arm64@npm:0.15.15"
+"esbuild-windows-arm64@npm:0.15.16":
+ version: 0.15.16
+ resolution: "esbuild-windows-arm64@npm:0.15.16"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"esbuild@npm:^0.15.0, esbuild@npm:^0.15.6":
- version: 0.15.15
- resolution: "esbuild@npm:0.15.15"
+ version: 0.15.16
+ resolution: "esbuild@npm:0.15.16"
dependencies:
- "@esbuild/android-arm": 0.15.15
- "@esbuild/linux-loong64": 0.15.15
- esbuild-android-64: 0.15.15
- esbuild-android-arm64: 0.15.15
- esbuild-darwin-64: 0.15.15
- esbuild-darwin-arm64: 0.15.15
- esbuild-freebsd-64: 0.15.15
- esbuild-freebsd-arm64: 0.15.15
- esbuild-linux-32: 0.15.15
- esbuild-linux-64: 0.15.15
- esbuild-linux-arm: 0.15.15
- esbuild-linux-arm64: 0.15.15
- esbuild-linux-mips64le: 0.15.15
- esbuild-linux-ppc64le: 0.15.15
- esbuild-linux-riscv64: 0.15.15
- esbuild-linux-s390x: 0.15.15
- esbuild-netbsd-64: 0.15.15
- esbuild-openbsd-64: 0.15.15
- esbuild-sunos-64: 0.15.15
- esbuild-windows-32: 0.15.15
- esbuild-windows-64: 0.15.15
- esbuild-windows-arm64: 0.15.15
+ "@esbuild/android-arm": 0.15.16
+ "@esbuild/linux-loong64": 0.15.16
+ esbuild-android-64: 0.15.16
+ esbuild-android-arm64: 0.15.16
+ esbuild-darwin-64: 0.15.16
+ esbuild-darwin-arm64: 0.15.16
+ esbuild-freebsd-64: 0.15.16
+ esbuild-freebsd-arm64: 0.15.16
+ esbuild-linux-32: 0.15.16
+ esbuild-linux-64: 0.15.16
+ esbuild-linux-arm: 0.15.16
+ esbuild-linux-arm64: 0.15.16
+ esbuild-linux-mips64le: 0.15.16
+ esbuild-linux-ppc64le: 0.15.16
+ esbuild-linux-riscv64: 0.15.16
+ esbuild-linux-s390x: 0.15.16
+ esbuild-netbsd-64: 0.15.16
+ esbuild-openbsd-64: 0.15.16
+ esbuild-sunos-64: 0.15.16
+ esbuild-windows-32: 0.15.16
+ esbuild-windows-64: 0.15.16
+ esbuild-windows-arm64: 0.15.16
dependenciesMeta:
"@esbuild/android-arm":
optional: true
@@ -20686,7 +21241,7 @@ __metadata:
optional: true
bin:
esbuild: bin/esbuild
- checksum: 9a194a310ac7d6989d1fe7354901d531d3b0d4cc1897a85a7cb9f1ae0fe8d82eb59747e63c91f676bab7bed8d6a1f28f620d49f043e7bd6203f9afe34031f739
+ checksum: 6f9262784b115363290cc9aa54692b3b646cd0508364333a609cc7be5ede4d93f91561ae8da48125e077da2e7add5368105486233ac2258f7169b171e8d78564
languageName: node
linkType: hard
@@ -20863,8 +21418,8 @@ __metadata:
linkType: hard
"eslint-plugin-jest@npm:^27.0.0":
- version: 27.1.5
- resolution: "eslint-plugin-jest@npm:27.1.5"
+ version: 27.1.6
+ resolution: "eslint-plugin-jest@npm:27.1.6"
dependencies:
"@typescript-eslint/utils": ^5.10.0
peerDependencies:
@@ -20875,7 +21430,7 @@ __metadata:
optional: true
jest:
optional: true
- checksum: 7c9de765793f7161afa0bdcdce67f4d072944152880fa638b25d228188dcee47a4b4aada26c57db72bc10193c96a1979e17afb8a7c3e400e961d8adfbf23ddbe
+ checksum: 5b1640b5d575f0d5e27da8ef8cb3110a29f94ebd50ae51edc5ea34c1054f5dcf305416865b2919ac424bc02c4569848bbe7fd2c86e7e1aff23e77f1ff9ef7dfd
languageName: node
linkType: hard
@@ -21159,10 +21714,10 @@ __metadata:
languageName: node
linkType: hard
-"estree-walker@npm:^2.0.1":
- version: 2.0.1
- resolution: "estree-walker@npm:2.0.1"
- checksum: c8e89c1e0dced789554c2c76152ef748ef226aa792eead6eee1777b6faa24e56a539639b8024f3952e80c451dd2c51f9ca8e7a360771dcaa794ad7b92243929c
+"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "estree-walker@npm:2.0.2"
+ checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc
languageName: node
linkType: hard
@@ -21244,7 +21799,7 @@ __metadata:
languageName: node
linkType: hard
-"events@npm:^3.0.0, events@npm:^3.2.0, events@npm:^3.3.0":
+"events@npm:3.3.0, events@npm:^3.0.0, events@npm:^3.2.0, events@npm:^3.3.0":
version: 3.3.0
resolution: "events@npm:3.3.0"
checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780
@@ -21359,7 +21914,7 @@ __metadata:
react-router-dom: ^6.3.0
react-use: ^17.2.4
start-server-and-test: ^1.10.11
- zen-observable: ^0.9.0
+ zen-observable: ^0.10.0
languageName: unknown
linkType: soft
@@ -21397,6 +21952,7 @@ __metadata:
"@backstage/plugin-code-coverage-backend": "workspace:^"
"@backstage/plugin-events-backend": "workspace:^"
"@backstage/plugin-events-node": "workspace:^"
+ "@backstage/plugin-explore-backend": "workspace:^"
"@backstage/plugin-graphql-backend": "workspace:^"
"@backstage/plugin-jenkins-backend": "workspace:^"
"@backstage/plugin-kafka-backend": "workspace:^"
@@ -21545,16 +22101,16 @@ __metadata:
languageName: node
linkType: hard
-"expect@npm:^29.0.0, expect@npm:^29.0.3":
- version: 29.0.3
- resolution: "expect@npm:29.0.3"
+"expect@npm:^29.0.0, expect@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "expect@npm:29.3.1"
dependencies:
- "@jest/expect-utils": ^29.0.3
- jest-get-type: ^29.0.0
- jest-matcher-utils: ^29.0.3
- jest-message-util: ^29.0.3
- jest-util: ^29.0.3
- checksum: 21b7fd346c47896a3de8f1103d7be32dab9409eb3dc170b7a9ff5d8d564b8499bd600b9af6251fe2f46064cf4e2f1456a6c6318da15314b7d74ed6dad723b555
+ "@jest/expect-utils": ^29.3.1
+ jest-get-type: ^29.2.0
+ jest-matcher-utils: ^29.3.1
+ jest-message-util: ^29.3.1
+ jest-util: ^29.3.1
+ checksum: e9588c2a430b558b9a3dc72d4ad05f36b047cb477bc6a7bb9cfeef7614fe7e5edbab424c2c0ce82739ee21ecbbbd24596259528209f84cd72500cc612d910d30
languageName: node
linkType: hard
@@ -22797,7 +23353,7 @@ __metadata:
languageName: node
linkType: hard
-"glob@npm:^8.0.0, glob@npm:^8.0.1":
+"glob@npm:^8.0.0, glob@npm:^8.0.1, glob@npm:^8.0.3":
version: 8.0.3
resolution: "glob@npm:8.0.3"
dependencies:
@@ -23426,9 +23982,9 @@ __metadata:
linkType: hard
"helmet@npm:^6.0.0":
- version: 6.0.0
- resolution: "helmet@npm:6.0.0"
- checksum: 0dd89d5b77c5334e815f5d29376ca7af0ad1007136890f497be3455d9ed9734e7203e13d9931e29e4d2ced1c632c52440f16d2a02e8835fd8b8706a12052faad
+ version: 6.0.1
+ resolution: "helmet@npm:6.0.1"
+ checksum: 1ca20d0b7888b6208130bbb50d183e68d53bb5fa0caead2106226d6d53216dfc893b4b5c07528304e342884f75d87702003b80884b065cb5dcbc705fb4a6ad52
languageName: node
linkType: hard
@@ -24045,7 +24601,7 @@ __metadata:
languageName: node
linkType: hard
-"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3":
+"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3, inherits@npm:~2.0.4":
version: 2.0.4
resolution: "inherits@npm:2.0.4"
checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1
@@ -24667,7 +25223,7 @@ __metadata:
languageName: node
linkType: hard
-"is-reference@npm:^1.2.1":
+"is-reference@npm:1.2.1":
version: 1.2.1
resolution: "is-reference@npm:1.2.1"
dependencies:
@@ -25075,57 +25631,57 @@ __metadata:
languageName: node
linkType: hard
-"jest-changed-files@npm:^29.0.0":
- version: 29.0.0
- resolution: "jest-changed-files@npm:29.0.0"
+"jest-changed-files@npm:^29.2.0":
+ version: 29.2.0
+ resolution: "jest-changed-files@npm:29.2.0"
dependencies:
execa: ^5.0.0
p-limit: ^3.1.0
- checksum: 5642ace8cd1e7e4f9e3ee423b97d0b018b00ad85ea7e5864592b4657e8500ef56ec50d2189229b912223046bbf31c9196c8ef2442a917be9726a5911d40db1b2
+ checksum: 8ad8290324db1de2ee3c9443d3e3fbfdcb6d72ec7054c5796be2854b2bc239dea38a7c797c8c9c2bd959f539d44305790f2f75b18f3046b04317ed77c7480cb1
languageName: node
linkType: hard
-"jest-circus@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-circus@npm:29.0.3"
+"jest-circus@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-circus@npm:29.3.1"
dependencies:
- "@jest/environment": ^29.0.3
- "@jest/expect": ^29.0.3
- "@jest/test-result": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/environment": ^29.3.1
+ "@jest/expect": ^29.3.1
+ "@jest/test-result": ^29.3.1
+ "@jest/types": ^29.3.1
"@types/node": "*"
chalk: ^4.0.0
co: ^4.6.0
dedent: ^0.7.0
is-generator-fn: ^2.0.0
- jest-each: ^29.0.3
- jest-matcher-utils: ^29.0.3
- jest-message-util: ^29.0.3
- jest-runtime: ^29.0.3
- jest-snapshot: ^29.0.3
- jest-util: ^29.0.3
+ jest-each: ^29.3.1
+ jest-matcher-utils: ^29.3.1
+ jest-message-util: ^29.3.1
+ jest-runtime: ^29.3.1
+ jest-snapshot: ^29.3.1
+ jest-util: ^29.3.1
p-limit: ^3.1.0
- pretty-format: ^29.0.3
+ pretty-format: ^29.3.1
slash: ^3.0.0
stack-utils: ^2.0.3
- checksum: 6ba495d4fb68ebb59f269b59029837f55009793d632ba2f29300992de80f7e3a37e619ea4e88676982cf74128416265a5929b3f9b77142fbf27c1dd0d6b6f98c
+ checksum: 125710debd998ad9693893e7c1235e271b79f104033b8169d82afe0bc0d883f8f5245feef87adcbb22ad27ff749fd001aa998d11a132774b03b4e2b8af77d5d8
languageName: node
linkType: hard
-"jest-cli@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-cli@npm:29.0.3"
+"jest-cli@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-cli@npm:29.3.1"
dependencies:
- "@jest/core": ^29.0.3
- "@jest/test-result": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/core": ^29.3.1
+ "@jest/test-result": ^29.3.1
+ "@jest/types": ^29.3.1
chalk: ^4.0.0
exit: ^0.1.2
graceful-fs: ^4.2.9
import-local: ^3.0.2
- jest-config: ^29.0.3
- jest-util: ^29.0.3
- jest-validate: ^29.0.3
+ jest-config: ^29.3.1
+ jest-util: ^29.3.1
+ jest-validate: ^29.3.1
prompts: ^2.0.1
yargs: ^17.3.1
peerDependencies:
@@ -25135,34 +25691,34 @@ __metadata:
optional: true
bin:
jest: bin/jest.js
- checksum: 4cd6ed7effcf703c3275bb07231227e32bd2de2dfc84354f0bbd25a2a8b26395570c8902c7dc87b02bed4a57c304a6b48e21a60fa26025b89c1e4e61eae1ea38
+ checksum: 829895d33060042443bd1e9e87eb68993773d74f2c8a9b863acf53cece39d227ae0e7d76df2e9c5934c414bdf70ce398a34b3122cfe22164acb2499a74d7288d
languageName: node
linkType: hard
-"jest-config@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-config@npm:29.0.3"
+"jest-config@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-config@npm:29.3.1"
dependencies:
"@babel/core": ^7.11.6
- "@jest/test-sequencer": ^29.0.3
- "@jest/types": ^29.0.3
- babel-jest: ^29.0.3
+ "@jest/test-sequencer": ^29.3.1
+ "@jest/types": ^29.3.1
+ babel-jest: ^29.3.1
chalk: ^4.0.0
ci-info: ^3.2.0
deepmerge: ^4.2.2
glob: ^7.1.3
graceful-fs: ^4.2.9
- jest-circus: ^29.0.3
- jest-environment-node: ^29.0.3
- jest-get-type: ^29.0.0
- jest-regex-util: ^29.0.0
- jest-resolve: ^29.0.3
- jest-runner: ^29.0.3
- jest-util: ^29.0.3
- jest-validate: ^29.0.3
+ jest-circus: ^29.3.1
+ jest-environment-node: ^29.3.1
+ jest-get-type: ^29.2.0
+ jest-regex-util: ^29.2.0
+ jest-resolve: ^29.3.1
+ jest-runner: ^29.3.1
+ jest-util: ^29.3.1
+ jest-validate: ^29.3.1
micromatch: ^4.0.4
parse-json: ^5.2.0
- pretty-format: ^29.0.3
+ pretty-format: ^29.3.1
slash: ^3.0.0
strip-json-comments: ^3.1.1
peerDependencies:
@@ -25173,7 +25729,7 @@ __metadata:
optional: true
ts-node:
optional: true
- checksum: b2861ebf946e8c332c0526559de7f41d79bbe27731ee4de15add1a2ac8baec160ed572d22e66fd8dae6cde38dbedc9dd0987397021499f7aa44f558da651c65a
+ checksum: 6e663f04ae1024a53a4c2c744499b4408ca9a8b74381dd5e31b11bb3c7393311ecff0fb61b06287768709eb2c9e5a2fd166d258f5a9123abbb4c5812f99c12fe
languageName: node
linkType: hard
@@ -25186,146 +25742,152 @@ __metadata:
languageName: node
linkType: hard
-"jest-diff@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-diff@npm:29.0.3"
+"jest-diff@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-diff@npm:29.3.1"
dependencies:
chalk: ^4.0.0
- diff-sequences: ^29.0.0
- jest-get-type: ^29.0.0
- pretty-format: ^29.0.3
- checksum: 1e12b63ea6254ea25146b6fb19f8b2d1ba334e1b8b635a007767c17dc272728afbdf41ccccce26c2a40cd9c7f3176bcfed53be2572927a3fc7b1ee5fff43eb26
+ diff-sequences: ^29.3.1
+ jest-get-type: ^29.2.0
+ pretty-format: ^29.3.1
+ checksum: ac5c09745f2b1897e6f53216acaf6ed44fc4faed8e8df053ff4ac3db5d2a1d06a17b876e49faaa15c8a7a26f5671bcbed0a93781dcc2835f781c79a716a591a9
languageName: node
linkType: hard
-"jest-docblock@npm:^29.0.0":
- version: 29.0.0
- resolution: "jest-docblock@npm:29.0.0"
+"jest-docblock@npm:^29.2.0":
+ version: 29.2.0
+ resolution: "jest-docblock@npm:29.2.0"
dependencies:
detect-newline: ^3.0.0
- checksum: b4f81426cc0dffb05b873d3cc373a1643040be62d72cce4dfed499fbcb57c55ac02c44af7aba5e7753915ff5e85b8d6030456981156eaea20be1cb57d2719904
+ checksum: b3f1227b7d73fc9e4952180303475cf337b36fa65c7f730ac92f0580f1c08439983262fee21cf3dba11429aa251b4eee1e3bc74796c5777116b400d78f9d2bbe
languageName: node
linkType: hard
-"jest-each@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-each@npm:29.0.3"
+"jest-each@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-each@npm:29.3.1"
dependencies:
- "@jest/types": ^29.0.3
+ "@jest/types": ^29.3.1
chalk: ^4.0.0
- jest-get-type: ^29.0.0
- jest-util: ^29.0.3
- pretty-format: ^29.0.3
- checksum: 80c1912eb573a2972e29d9731cfbfa773b010c1416998eca28a90bda4f50de393c60860a2cb1531a4d3e0a0d23698c561a64e8942d48a75023b683136de519cc
+ jest-get-type: ^29.2.0
+ jest-util: ^29.3.1
+ pretty-format: ^29.3.1
+ checksum: 16d51ef8f96fba44a3479f1c6f7672027e3b39236dc4e41217c38fe60a3b66b022ffcee72f8835a442f7a8a0a65980a93fb8e73a9782d192452526e442ad049a
languageName: node
linkType: hard
"jest-environment-jsdom@npm:^29.0.2":
- version: 29.0.3
- resolution: "jest-environment-jsdom@npm:29.0.3"
+ version: 29.3.1
+ resolution: "jest-environment-jsdom@npm:29.3.1"
dependencies:
- "@jest/environment": ^29.0.3
- "@jest/fake-timers": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/environment": ^29.3.1
+ "@jest/fake-timers": ^29.3.1
+ "@jest/types": ^29.3.1
"@types/jsdom": ^20.0.0
"@types/node": "*"
- jest-mock: ^29.0.3
- jest-util: ^29.0.3
+ jest-mock: ^29.3.1
+ jest-util: ^29.3.1
jsdom: ^20.0.0
- checksum: fee4f06b61fd0a402cbbf770d6a4cee70ea2b93a9bd776830d16d4b8dcf488943b7d7b2779301e977747bb7ef3ce1e6265725b6296236803385bb7a212ca6290
+ peerDependencies:
+ canvas: ^2.5.0
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+ checksum: 91b04ed02b2275c3a47740e20c2691f67c4295e17174c8ccd3a71fe77707239e487506bd157279b4257ce1be0a8c2be377817ee85689966a9e604bb6ef1199f0
languageName: node
linkType: hard
-"jest-environment-node@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-environment-node@npm:29.0.3"
+"jest-environment-node@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-environment-node@npm:29.3.1"
dependencies:
- "@jest/environment": ^29.0.3
- "@jest/fake-timers": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/environment": ^29.3.1
+ "@jest/fake-timers": ^29.3.1
+ "@jest/types": ^29.3.1
"@types/node": "*"
- jest-mock: ^29.0.3
- jest-util: ^29.0.3
- checksum: 76cd5759cdb08d3a4619004a23cc45fb8d103004b4d3e95451a36b981540c5d56e4f2a5b3cafb8ecf144bf874633ea86118a202e08aec1f445a25caf4081d8bc
+ jest-mock: ^29.3.1
+ jest-util: ^29.3.1
+ checksum: 16d4854bd2d35501bd4862ca069baf27ce9f5fd7642fdcab9d2dab49acd28c082d0c8882bf2bb28ed7bbaada486da577c814c9688ddc62d1d9f74a954fde996a
languageName: node
linkType: hard
-"jest-get-type@npm:^29.0.0":
- version: 29.0.0
- resolution: "jest-get-type@npm:29.0.0"
- checksum: 9abdd11d69788963a92fb9d813a7b887654ecc8f3a3c8bf83166d33aaf4d57ed380e74ab8ef106f57565dd235446ca6ebc607679f0c516c4633e6d09f0540a2b
+"jest-get-type@npm:^29.2.0":
+ version: 29.2.0
+ resolution: "jest-get-type@npm:29.2.0"
+ checksum: e396fd880a30d08940ed8a8e43cd4595db1b8ff09649018eb358ca701811137556bae82626af73459e3c0f8c5e972ed1e57fd3b1537b13a260893dac60a90942
languageName: node
linkType: hard
-"jest-haste-map@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-haste-map@npm:29.0.3"
+"jest-haste-map@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-haste-map@npm:29.3.1"
dependencies:
- "@jest/types": ^29.0.3
+ "@jest/types": ^29.3.1
"@types/graceful-fs": ^4.1.3
"@types/node": "*"
anymatch: ^3.0.3
fb-watchman: ^2.0.0
fsevents: ^2.3.2
graceful-fs: ^4.2.9
- jest-regex-util: ^29.0.0
- jest-util: ^29.0.3
- jest-worker: ^29.0.3
+ jest-regex-util: ^29.2.0
+ jest-util: ^29.3.1
+ jest-worker: ^29.3.1
micromatch: ^4.0.4
walker: ^1.0.8
dependenciesMeta:
fsevents:
optional: true
- checksum: fb766e0d8174e7e3a43a63b28e23bd35db61a5939d6c5c1335d7f3d642d1c608e16fef8a105289b78795e308ab3176a62bc45acfa3fa14087e7635cb008795c3
+ checksum: 97ea26af0c28a2ba568c9c65d06211487bbcd501cb4944f9d55e07fd2b00ad96653ea2cc9033f3d5b7dc1feda33e47ae9cc56b400191ea4533be213c9f82e67c
languageName: node
linkType: hard
-"jest-leak-detector@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-leak-detector@npm:29.0.3"
+"jest-leak-detector@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-leak-detector@npm:29.3.1"
dependencies:
- jest-get-type: ^29.0.0
- pretty-format: ^29.0.3
- checksum: a1657dbb72f2c3b4a8af148daec491d42eabdadc4e27eb8ec325d5267c21ac958e82e5c8ee679861c2131afd2bdfed4139b806511de7624d93b9838c6fcf5b2e
+ jest-get-type: ^29.2.0
+ pretty-format: ^29.3.1
+ checksum: 0dd8ed31ae0b5a3d14f13f567ca8567f2663dd2d540d1e55511d3b3fd7f80a1d075392179674ebe9fab9be0b73678bf4d2f8bbbc0f4bdd52b9815259194da559
languageName: node
linkType: hard
-"jest-matcher-utils@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-matcher-utils@npm:29.0.3"
+"jest-matcher-utils@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-matcher-utils@npm:29.3.1"
dependencies:
chalk: ^4.0.0
- jest-diff: ^29.0.3
- jest-get-type: ^29.0.0
- pretty-format: ^29.0.3
- checksum: e39ab74a046ada8fbd75a275bfe54bd5f8ec14a98f77e1162a49d4e1ea82e68c5a4575691767cea0f60dd0b74cb481275012bf3467cd91fdb014311c670b8a83
+ jest-diff: ^29.3.1
+ jest-get-type: ^29.2.0
+ pretty-format: ^29.3.1
+ checksum: 311e8d9f1e935216afc7dd8c6acf1fbda67a7415e1afb1bf72757213dfb025c1f2dc5e2c185c08064a35cdc1f2d8e40c57616666774ed1b03e57eb311c20ec77
languageName: node
linkType: hard
-"jest-message-util@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-message-util@npm:29.0.3"
+"jest-message-util@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-message-util@npm:29.3.1"
dependencies:
"@babel/code-frame": ^7.12.13
- "@jest/types": ^29.0.3
+ "@jest/types": ^29.3.1
"@types/stack-utils": ^2.0.0
chalk: ^4.0.0
graceful-fs: ^4.2.9
micromatch: ^4.0.4
- pretty-format: ^29.0.3
+ pretty-format: ^29.3.1
slash: ^3.0.0
stack-utils: ^2.0.3
- checksum: 04bee1fee10106f4eb875092e5d06187930d44050a4f99e7aa1d1e42768b18d6d9e5439623d9242202942deb8a1eec08359e0cd19a43ae505d96aeaf243a3f8d
+ checksum: 15d0a2fca3919eb4570bbf575734780c4b9e22de6aae903c4531b346699f7deba834c6c86fe6e9a83ad17fac0f7935511cf16dce4d71a93a71ebb25f18a6e07b
languageName: node
linkType: hard
-"jest-mock@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-mock@npm:29.0.3"
+"jest-mock@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-mock@npm:29.3.1"
dependencies:
- "@jest/types": ^29.0.3
+ "@jest/types": ^29.3.1
"@types/node": "*"
- checksum: 8a04823334216f5fca9733a200cbb4cca207bdd74c523321a4170cbec3b2086b44eb1744a9faef808d2853593f132dda90d17e4bce59678fc373e1bab666ad0f
+ jest-util: ^29.3.1
+ checksum: 9098852cb2866db4a1a59f9f7581741dfc572f648e9e574a1b187fd69f5f2f6190ad387ede21e139a8b80a6a1343ecc3d6751cd2ae1ae11d7ea9fa1950390fb2
languageName: node
linkType: hard
@@ -25341,102 +25903,102 @@ __metadata:
languageName: node
linkType: hard
-"jest-regex-util@npm:^29.0.0":
- version: 29.0.0
- resolution: "jest-regex-util@npm:29.0.0"
- checksum: dce16394c357213008e6f84f2288f77c64bba59b7cb48ea614e85c5aae036a7e46dbfd1f45aa08180b7e7c576102bf4f8f0ff8bc60fb9721fb80874adc3ae0ea
+"jest-regex-util@npm:^29.2.0":
+ version: 29.2.0
+ resolution: "jest-regex-util@npm:29.2.0"
+ checksum: 7c533e51c51230dac20c0d7395b19b8366cb022f7c6e08e6bcf2921626840ff90424af4c9b4689f02f0addfc9b071c4cd5f8f7a989298a4c8e0f9c94418ca1c3
languageName: node
linkType: hard
-"jest-resolve-dependencies@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-resolve-dependencies@npm:29.0.3"
+"jest-resolve-dependencies@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-resolve-dependencies@npm:29.3.1"
dependencies:
- jest-regex-util: ^29.0.0
- jest-snapshot: ^29.0.3
- checksum: 43980c0c03a7f00459209315832f03c28d8289ca30ccd8bb6652c87a2c03275aacdba8789177cefc162ceb05218ba3db8bf5a1968920aa4e510cbbefd54f9793
+ jest-regex-util: ^29.2.0
+ jest-snapshot: ^29.3.1
+ checksum: 6ec4727a87c6e7954e93de9949ab9967b340ee2f07626144c273355f05a2b65fa47eb8dece2d6e5f4fd99cdb893510a3540aa5e14ba443f70b3feb63f6f98982
languageName: node
linkType: hard
-"jest-resolve@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-resolve@npm:29.0.3"
+"jest-resolve@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-resolve@npm:29.3.1"
dependencies:
chalk: ^4.0.0
graceful-fs: ^4.2.9
- jest-haste-map: ^29.0.3
+ jest-haste-map: ^29.3.1
jest-pnp-resolver: ^1.2.2
- jest-util: ^29.0.3
- jest-validate: ^29.0.3
+ jest-util: ^29.3.1
+ jest-validate: ^29.3.1
resolve: ^1.20.0
resolve.exports: ^1.1.0
slash: ^3.0.0
- checksum: 9a774f78decbd9caa863e8c539d439aac76a780ea7acc54e90f2ad9c2000c03294e7f4f38816d16a8aa020ae0e3358845cc8f96fbab5f3e186b00e6e0462bf9b
+ checksum: 0dea22ed625e07b8bfee52dea1391d3a4b453c1a0c627a0fa7c22e44bb48e1c289afe6f3c316def70753773f099c4e8f436c7a2cc12fcc6c7dd6da38cba2cd5f
languageName: node
linkType: hard
-"jest-runner@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-runner@npm:29.0.3"
+"jest-runner@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-runner@npm:29.3.1"
dependencies:
- "@jest/console": ^29.0.3
- "@jest/environment": ^29.0.3
- "@jest/test-result": ^29.0.3
- "@jest/transform": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/console": ^29.3.1
+ "@jest/environment": ^29.3.1
+ "@jest/test-result": ^29.3.1
+ "@jest/transform": ^29.3.1
+ "@jest/types": ^29.3.1
"@types/node": "*"
chalk: ^4.0.0
- emittery: ^0.10.2
+ emittery: ^0.13.1
graceful-fs: ^4.2.9
- jest-docblock: ^29.0.0
- jest-environment-node: ^29.0.3
- jest-haste-map: ^29.0.3
- jest-leak-detector: ^29.0.3
- jest-message-util: ^29.0.3
- jest-resolve: ^29.0.3
- jest-runtime: ^29.0.3
- jest-util: ^29.0.3
- jest-watcher: ^29.0.3
- jest-worker: ^29.0.3
+ jest-docblock: ^29.2.0
+ jest-environment-node: ^29.3.1
+ jest-haste-map: ^29.3.1
+ jest-leak-detector: ^29.3.1
+ jest-message-util: ^29.3.1
+ jest-resolve: ^29.3.1
+ jest-runtime: ^29.3.1
+ jest-util: ^29.3.1
+ jest-watcher: ^29.3.1
+ jest-worker: ^29.3.1
p-limit: ^3.1.0
source-map-support: 0.5.13
- checksum: db62830d1635be5e376fd261e38d37a4855146c9a586ec616cfb64257ef6f79697bd947bbb9751377dc2302626e73d1b77036eafd78ef6f93e1e53ca89c23e3e
+ checksum: 61ad445d8a5f29573332f27a21fc942fb0d2a82bf901a0ea1035bf3bd7f349d1e425f71f54c3a3f89b292a54872c3248d395a2829d987f26b6025b15530ea5d2
languageName: node
linkType: hard
-"jest-runtime@npm:^29.0.2, jest-runtime@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-runtime@npm:29.0.3"
+"jest-runtime@npm:^29.0.2, jest-runtime@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-runtime@npm:29.3.1"
dependencies:
- "@jest/environment": ^29.0.3
- "@jest/fake-timers": ^29.0.3
- "@jest/globals": ^29.0.3
- "@jest/source-map": ^29.0.0
- "@jest/test-result": ^29.0.3
- "@jest/transform": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/environment": ^29.3.1
+ "@jest/fake-timers": ^29.3.1
+ "@jest/globals": ^29.3.1
+ "@jest/source-map": ^29.2.0
+ "@jest/test-result": ^29.3.1
+ "@jest/transform": ^29.3.1
+ "@jest/types": ^29.3.1
"@types/node": "*"
chalk: ^4.0.0
cjs-module-lexer: ^1.0.0
collect-v8-coverage: ^1.0.0
glob: ^7.1.3
graceful-fs: ^4.2.9
- jest-haste-map: ^29.0.3
- jest-message-util: ^29.0.3
- jest-mock: ^29.0.3
- jest-regex-util: ^29.0.0
- jest-resolve: ^29.0.3
- jest-snapshot: ^29.0.3
- jest-util: ^29.0.3
+ jest-haste-map: ^29.3.1
+ jest-message-util: ^29.3.1
+ jest-mock: ^29.3.1
+ jest-regex-util: ^29.2.0
+ jest-resolve: ^29.3.1
+ jest-snapshot: ^29.3.1
+ jest-util: ^29.3.1
slash: ^3.0.0
strip-bom: ^4.0.0
- checksum: e13bfadfe225e9c06a95809d34e209e1769723c0c3d5913d86e4e748a22777e2bec11a352f2d12ca790e04203a6defc6556f77a3050518ebf6600a454a56fd36
+ checksum: 82f27b48f000be074064a854e16e768f9453e9b791d8c5f9316606c37f871b5b10f70544c1b218ab9784f00bd972bb77f868c5ab6752c275be2cd219c351f5a7
languageName: node
linkType: hard
-"jest-snapshot@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-snapshot@npm:29.0.3"
+"jest-snapshot@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-snapshot@npm:29.3.1"
dependencies:
"@babel/core": ^7.11.6
"@babel/generator": ^7.7.2
@@ -25444,69 +26006,69 @@ __metadata:
"@babel/plugin-syntax-typescript": ^7.7.2
"@babel/traverse": ^7.7.2
"@babel/types": ^7.3.3
- "@jest/expect-utils": ^29.0.3
- "@jest/transform": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/expect-utils": ^29.3.1
+ "@jest/transform": ^29.3.1
+ "@jest/types": ^29.3.1
"@types/babel__traverse": ^7.0.6
"@types/prettier": ^2.1.5
babel-preset-current-node-syntax: ^1.0.0
chalk: ^4.0.0
- expect: ^29.0.3
+ expect: ^29.3.1
graceful-fs: ^4.2.9
- jest-diff: ^29.0.3
- jest-get-type: ^29.0.0
- jest-haste-map: ^29.0.3
- jest-matcher-utils: ^29.0.3
- jest-message-util: ^29.0.3
- jest-util: ^29.0.3
+ jest-diff: ^29.3.1
+ jest-get-type: ^29.2.0
+ jest-haste-map: ^29.3.1
+ jest-matcher-utils: ^29.3.1
+ jest-message-util: ^29.3.1
+ jest-util: ^29.3.1
natural-compare: ^1.4.0
- pretty-format: ^29.0.3
+ pretty-format: ^29.3.1
semver: ^7.3.5
- checksum: 412c0fc4c12c14470aa33beeddfeb04fa0d5724235321e8284b52097c74c97ada40ea52f5ac52a8e01e6d42dd5894b9a0260577d30c8c723ca84fcc7a60bd40c
+ checksum: d7d0077935e78c353c828be78ccb092e12ba7622cb0577f21641fadd728ae63a7c1f4a0d8113bfb38db3453a64bfa232fb1cdeefe0e2b48c52ef4065b0ab75ae
languageName: node
linkType: hard
-"jest-util@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-util@npm:29.0.3"
+"jest-util@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-util@npm:29.3.1"
dependencies:
- "@jest/types": ^29.0.3
+ "@jest/types": ^29.3.1
"@types/node": "*"
chalk: ^4.0.0
ci-info: ^3.2.0
graceful-fs: ^4.2.9
picomatch: ^2.2.3
- checksum: 39c31e75ba5bcb4c3ccdf0895f9fdbb83f839c432e7c6639a688beb414d681b5d50282da017c723ea1f2a7033e74a4938fd33dcff231c3e90f903173919991d5
+ checksum: f67c60f062b94d21cb60e84b3b812d64b7bfa81fe980151de5c17a74eb666042d0134e2e756d099b7606a1fcf1d633824d2e58197d01d76dde1e2dc00dfcd413
languageName: node
linkType: hard
-"jest-validate@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-validate@npm:29.0.3"
+"jest-validate@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-validate@npm:29.3.1"
dependencies:
- "@jest/types": ^29.0.3
+ "@jest/types": ^29.3.1
camelcase: ^6.2.0
chalk: ^4.0.0
- jest-get-type: ^29.0.0
+ jest-get-type: ^29.2.0
leven: ^3.1.0
- pretty-format: ^29.0.3
- checksum: 096df6a77837155d9b65cd7ff9198489317c53903eb74a7f207e053c0b56204c18b6a8047e168eced291eb550b792ef4ab322b05c7da348af76cd78ea3556b4e
+ pretty-format: ^29.3.1
+ checksum: 92584f0b8ac284235f12b3b812ccbc43ef6dea080a3b98b1aa81adbe009e962d0aa6131f21c8157b30ac3d58f335961694238a93d553d1d1e02ab264c923778c
languageName: node
linkType: hard
-"jest-watcher@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-watcher@npm:29.0.3"
+"jest-watcher@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-watcher@npm:29.3.1"
dependencies:
- "@jest/test-result": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/test-result": ^29.3.1
+ "@jest/types": ^29.3.1
"@types/node": "*"
ansi-escapes: ^4.2.1
chalk: ^4.0.0
- emittery: ^0.10.2
- jest-util: ^29.0.3
+ emittery: ^0.13.1
+ jest-util: ^29.3.1
string-length: ^4.0.1
- checksum: d585b9dda467d08946357c8ed1f971f15a302f958ccd3f6e2e59df5da245edca91cd4a72329d0126de8ac5793567965e4be1e555c4e40ecadb4f8f14306441bb
+ checksum: 60d189473486c73e9d540406a30189da5a3c67bfb0fb4ad4a83991c189135ef76d929ec99284ca5a505fe4ee9349ae3c99b54d2e00363e72837b46e77dec9642
languageName: node
linkType: hard
@@ -25541,25 +26103,26 @@ __metadata:
languageName: node
linkType: hard
-"jest-worker@npm:^29.0.3":
- version: 29.0.3
- resolution: "jest-worker@npm:29.0.3"
+"jest-worker@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "jest-worker@npm:29.3.1"
dependencies:
"@types/node": "*"
+ jest-util: ^29.3.1
merge-stream: ^2.0.0
supports-color: ^8.0.0
- checksum: cdae4a58f6ab1ec3c384b42f1106004d434e65febcb34ba14a1e7d8538f7a5a5c2ebb0cf29cecfe8c71882c526ee02c4aa338a9ce0abcf11fcec9b8fa662189b
+ checksum: 38687fcbdc2b7ddc70bbb5dfc703ae095b46b3c7f206d62ecdf5f4d16e336178e217302138f3b906125576bb1cfe4cfe8d43681276fa5899d138ed9422099fb3
languageName: node
linkType: hard
"jest@npm:^29.0.2":
- version: 29.0.3
- resolution: "jest@npm:29.0.3"
+ version: 29.3.1
+ resolution: "jest@npm:29.3.1"
dependencies:
- "@jest/core": ^29.0.3
- "@jest/types": ^29.0.3
+ "@jest/core": ^29.3.1
+ "@jest/types": ^29.3.1
import-local: ^3.0.2
- jest-cli: ^29.0.3
+ jest-cli: ^29.3.1
peerDependencies:
node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
peerDependenciesMeta:
@@ -25567,7 +26130,7 @@ __metadata:
optional: true
bin:
jest: bin/jest.js
- checksum: 6bffa1ec703dbf64ce79aa7ef2887b586fdc96881cf2b83c8e86569237124a17aa001ddd4e7be7877202abe530ee5c04e9f0dd54e7320533b05b90709aca2607
+ checksum: 613f4ec657b14dd84c0056b2fef1468502927fd551bef0b19d4a91576a609678fb316c6a5b5fc6120dd30dd4ff4569070ffef3cb507db9bb0260b28ddaa18d7a
languageName: node
linkType: hard
@@ -26405,9 +26968,9 @@ __metadata:
linkType: hard
"kafkajs@npm:^2.0.0":
- version: 2.1.0
- resolution: "kafkajs@npm:2.1.0"
- checksum: b751b06f8005ac9ff192d98306f59c6ae018ce09acc0f959dfbfd4fbb4731fe7dfd42de0c3592d45a6b66b6d5caa40926673a02eb764b701c2953ea203ced60c
+ version: 2.2.3
+ resolution: "kafkajs@npm:2.2.3"
+ checksum: 30f17de75da852942334b6069c5c515e2531a7b610997f0e4c6088281f16588df45ac920218411d9ae995c09af1f69186ed4d73cbe0e5f1247ec756dd9c7678e
languageName: node
linkType: hard
@@ -26641,10 +27204,10 @@ __metadata:
languageName: node
linkType: hard
-"lilconfig@npm:2.0.5, lilconfig@npm:^2.0.3":
- version: 2.0.5
- resolution: "lilconfig@npm:2.0.5"
- checksum: f7bb9e42656f06930ad04e583026f087508ae408d3526b8b54895e934eb2a966b7aafae569656f2c79a29fe6d779b3ec44ba577e80814734c8655d6f71cdf2d1
+"lilconfig@npm:2.0.6, lilconfig@npm:^2.0.3":
+ version: 2.0.6
+ resolution: "lilconfig@npm:2.0.6"
+ checksum: 40a3cd72f103b1be5975f2ac1850810b61d4053e20ab09be8d3aeddfe042187e1ba70b4651a7e70f95efa1642e7dc8b2ae395b317b7d7753b241b43cef7c0f7d
languageName: node
linkType: hard
@@ -26665,25 +27228,25 @@ __metadata:
linkType: hard
"lint-staged@npm:^13.0.0":
- version: 13.0.3
- resolution: "lint-staged@npm:13.0.3"
+ version: 13.0.4
+ resolution: "lint-staged@npm:13.0.4"
dependencies:
cli-truncate: ^3.1.0
- colorette: ^2.0.17
- commander: ^9.3.0
+ colorette: ^2.0.19
+ commander: ^9.4.1
debug: ^4.3.4
execa: ^6.1.0
- lilconfig: 2.0.5
- listr2: ^4.0.5
+ lilconfig: 2.0.6
+ listr2: ^5.0.5
micromatch: ^4.0.5
normalize-path: ^3.0.0
object-inspect: ^1.12.2
pidtree: ^0.6.0
string-argv: ^0.3.1
- yaml: ^2.1.1
+ yaml: ^2.1.3
bin:
lint-staged: bin/lint-staged.js
- checksum: 53d585007df06e162febab6b0836b55016d902586a267823c8a1158529d8c742dc7297e523f7023dff02250bef3eb0d6934f4ec4f9961adfc2ebbed5f54162d0
+ checksum: 4676172df5dc734a7f409ad786a72d39bd2239de8b2e5eb1d99eaa751479f60f7b4ef85c8508698855b51b125a512f395ac6a3c7d2d57de8e8221e0aaaab6f4f
languageName: node
linkType: hard
@@ -26729,6 +27292,27 @@ __metadata:
languageName: node
linkType: hard
+"listr2@npm:^5.0.5":
+ version: 5.0.5
+ resolution: "listr2@npm:5.0.5"
+ 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
+ through: ^2.3.8
+ wrap-ansi: ^7.0.0
+ peerDependencies:
+ enquirer: ">= 2.3.0 < 3"
+ peerDependenciesMeta:
+ enquirer:
+ optional: true
+ checksum: 71c44eb648405d2725f248747ef8d5e192dd16938ec81df854c4a7e74ff1b3f4c3149461b1cff31c761bfbdf110f7f2603c9957c908294a1c6db299c9168608c
+ languageName: node
+ linkType: hard
+
"load-bmfont@npm:^1.3.1, load-bmfont@npm:^1.4.0":
version: 1.4.1
resolution: "load-bmfont@npm:1.4.1"
@@ -27253,9 +27837,9 @@ __metadata:
linkType: hard
"luxon@npm:^3.0.0":
- version: 3.1.0
- resolution: "luxon@npm:3.1.0"
- checksum: f8a850b759ba7a2e009d904c522ed7bc264bf4add57578f8948e52a0ed96b627b025b5aad8032295b570ae19fac41f0ffab91bdb128715fb0cc020798a7ba886
+ version: 3.1.1
+ resolution: "luxon@npm:3.1.1"
+ checksum: 388fb35d3c51a19d8b305a3338e7e74634b08562e7d2f9ed5c05a7f4bc9ee1c1ab6a2546b6d9c4c104516b24043757d65f5f3fe3d78b206fbf55a9586ab62230
languageName: node
linkType: hard
@@ -27277,7 +27861,7 @@ __metadata:
languageName: node
linkType: hard
-"magic-string@npm:^0.26.6":
+"magic-string@npm:^0.26.4, magic-string@npm:^0.26.6":
version: 0.26.7
resolution: "magic-string@npm:0.26.7"
dependencies:
@@ -28241,13 +28825,13 @@ __metadata:
linkType: hard
"mini-css-extract-plugin@npm:^2.4.2":
- version: 2.7.0
- resolution: "mini-css-extract-plugin@npm:2.7.0"
+ version: 2.7.1
+ resolution: "mini-css-extract-plugin@npm:2.7.1"
dependencies:
schema-utils: ^4.0.0
peerDependencies:
webpack: ^5.0.0
- checksum: e6b111d4289132bd496286eec42801c74c83af7eac71af630a5babae48ca65377f47d8b39e1f0653b449e68e67b57dbd0d36917242f08fc3e7770e70c0cb56cd
+ checksum: 0da0db7befa4da5df2293440e540d9414b23b99768bbec4b8dab40c1c961ad31532239635be06c6ca9a6d4cfcb0caeb6dbd19d5e31d3271d734e0a39c3245c23
languageName: node
linkType: hard
@@ -28283,12 +28867,12 @@ __metadata:
languageName: node
linkType: hard
-"minimatch@npm:5.1.0, minimatch@npm:^5.0.0, minimatch@npm:^5.0.1, minimatch@npm:^5.1.0":
- version: 5.1.0
- resolution: "minimatch@npm:5.1.0"
+"minimatch@npm:^5.0.0, minimatch@npm:^5.0.1, minimatch@npm:^5.1.0, minimatch@npm:^5.1.1":
+ version: 5.1.1
+ resolution: "minimatch@npm:5.1.1"
dependencies:
brace-expansion: ^2.0.1
- checksum: 15ce53d31a06361e8b7a629501b5c75491bc2b59712d53e802b1987121d91b433d73fcc5be92974fde66b2b51d8fb28d75a9ae900d249feb792bb1ba2a4f0a90
+ checksum: 215edd0978320a3354188f84a537d45841f2449af4df4379f79b9b777e71aa4f5722cc9d1717eabd2a70d38ef76ab7b708d24d83ea6a6c909dfd8833de98b437
languageName: node
linkType: hard
@@ -28557,9 +29141,44 @@ __metadata:
languageName: node
linkType: hard
+"msw@npm:^0.47.0":
+ version: 0.47.4
+ resolution: "msw@npm:0.47.4"
+ dependencies:
+ "@mswjs/cookies": ^0.2.2
+ "@mswjs/interceptors": ^0.17.5
+ "@open-draft/until": ^1.0.3
+ "@types/cookie": ^0.4.1
+ "@types/js-levenshtein": ^1.1.1
+ chalk: 4.1.1
+ chokidar: ^3.4.2
+ cookie: ^0.4.2
+ graphql: ^15.0.0 || ^16.0.0
+ headers-polyfill: ^3.1.0
+ inquirer: ^8.2.0
+ is-node-process: ^1.0.1
+ js-levenshtein: ^1.1.6
+ node-fetch: ^2.6.7
+ outvariant: ^1.3.0
+ path-to-regexp: ^6.2.0
+ statuses: ^2.0.0
+ strict-event-emitter: ^0.2.6
+ type-fest: ^2.19.0
+ yargs: ^17.3.1
+ peerDependencies:
+ typescript: ">= 4.2.x <= 4.8.x"
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ bin:
+ msw: cli/index.js
+ checksum: 10ff632641d40384d6622abf4df6399e4ae649db0f676b5d1ee2d0a515ec96f33abe9d4fecba08cdba4b2e43255af419da9eefc020d40a7e10669d0906457197
+ languageName: node
+ linkType: hard
+
"msw@npm:^0.49.0":
- version: 0.49.0
- resolution: "msw@npm:0.49.0"
+ version: 0.49.1
+ resolution: "msw@npm:0.49.1"
dependencies:
"@mswjs/cookies": ^0.2.2
"@mswjs/interceptors": ^0.17.5
@@ -28587,7 +29206,7 @@ __metadata:
optional: true
bin:
msw: cli/index.js
- checksum: 514d3d1ec8d2e7663409fae3904d1f6f0134ad6a9e7b43083ca5230b41afaee68c09dd3c3aadc555b5cbeac3f1a81b55cb6168bef1eb2c8d92b00445dbfbdd2f
+ checksum: 4d8ebcc21cbe20d73070857653a1e90b1be7c78ac2ea68ae497baa2a5d9bc1fb764ccfb292fc8eda0b6cfabd4542a80bbacb0302e9ba939a0bc94b024848850d
languageName: node
linkType: hard
@@ -28710,6 +29329,13 @@ __metadata:
languageName: node
linkType: hard
+"natural-compare-lite@npm:^1.4.0":
+ version: 1.4.0
+ resolution: "natural-compare-lite@npm:1.4.0"
+ checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225
+ languageName: node
+ linkType: hard
+
"natural-compare@npm:^1.4.0":
version: 1.4.0
resolution: "natural-compare@npm:1.4.0"
@@ -28753,16 +29379,16 @@ __metadata:
languageName: node
linkType: hard
-"nise@npm:^5.1.0, nise@npm:^5.1.1":
- version: 5.1.1
- resolution: "nise@npm:5.1.1"
+"nise@npm:^5.1.1, nise@npm:^5.1.2":
+ version: 5.1.2
+ resolution: "nise@npm:5.1.2"
dependencies:
- "@sinonjs/commons": ^1.8.3
- "@sinonjs/fake-timers": ">=5"
+ "@sinonjs/commons": ^2.0.0
+ "@sinonjs/fake-timers": ^7.0.4
"@sinonjs/text-encoding": ^0.7.1
just-extend: ^4.0.2
path-to-regexp: ^1.7.0
- checksum: d8be29e84a014743c9a10f428fac86f294ac5f92bed1f606fe9b551e935f494d8e0ce1af8a12673c6014010ec7f771f2d48aa5c8e116f223eb4f40c5e1ab44b3
+ checksum: 688c557333dcbc5b41f4f1f1b0ea32fb0f8b424541a8958140bc61074980362c954b2aeb027c282de26b9ddcb4b230656f68ac4206777499e405dd7e716ec1f8
languageName: node
linkType: hard
@@ -29489,14 +30115,14 @@ __metadata:
linkType: hard
"openid-client@npm:^5.1.6, openid-client@npm:^5.2.1":
- version: 5.3.0
- resolution: "openid-client@npm:5.3.0"
+ version: 5.3.1
+ resolution: "openid-client@npm:5.3.1"
dependencies:
jose: ^4.10.0
lru-cache: ^6.0.0
object-hash: ^2.0.1
oidc-token-hash: ^5.0.1
- checksum: 27faa298e083daae2a2a99629b25cc89f648302f4845dd1acd04ec6e7105a6edf13a5c38ab1159bcb7b88c5bc54be08e021c911e22f0b8bfcca1b2d686ae3d95
+ checksum: e8993cfe6ac55942fb7a5fc4db8ab88ab36bbcf2a6519993a9a2e288bfc248fcfb07804b6785eb7852a9eea0eec27f80ae57a29193c0b835f31f611b11b9bda1
languageName: node
linkType: hard
@@ -31247,14 +31873,14 @@ __metadata:
languageName: node
linkType: hard
-"pretty-format@npm:^29.0.0, pretty-format@npm:^29.0.3":
- version: 29.0.3
- resolution: "pretty-format@npm:29.0.3"
+"pretty-format@npm:^29.0.0, pretty-format@npm:^29.3.1":
+ version: 29.3.1
+ resolution: "pretty-format@npm:29.3.1"
dependencies:
"@jest/schemas": ^29.0.0
ansi-styles: ^5.0.0
react-is: ^18.0.0
- checksum: 239aa73b09919b195353e62530908b43883af66e3ba8ecb5fda77578b20f297fd774fcf53abbedcb6cfff72521e8a220052a49e6a0e29418082d06386da27bac
+ checksum: 9917a0bb859cd7a24a343363f70d5222402c86d10eb45bcc2f77b23a4e67586257390e959061aec22762a782fe6bafb59bf34eb94527bc2e5d211afdb287eb4e
languageName: node
linkType: hard
@@ -31318,13 +31944,6 @@ __metadata:
languageName: node
linkType: hard
-"promise-any-polyfill@npm:^1.0.1":
- version: 1.0.1
- resolution: "promise-any-polyfill@npm:1.0.1"
- checksum: 8eccebb8f9278c422cda05083e506964e6c75061b9c6d7fb6f3b7ccb707e5d338138aed3092b8358355a18f8d6dd47c139d0e198aae1eb0c84cd943a35d7ee0c
- languageName: node
- linkType: hard
-
"promise-call-limit@npm:^1.0.1":
version: 1.0.1
resolution: "promise-call-limit@npm:1.0.1"
@@ -32176,7 +32795,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.3.0
resolution: "react-router-dom@npm:6.3.0"
dependencies:
@@ -32189,7 +32808,20 @@ __metadata:
languageName: node
linkType: hard
-"react-router-stable@npm:react-router@^6.3.0, react-router@npm:6.3.0, react-router@npm:^6.3.0":
+"react-router-dom@npm:^6.3.0":
+ version: 6.4.3
+ resolution: "react-router-dom@npm:6.4.3"
+ dependencies:
+ "@remix-run/router": 1.0.3
+ react-router: 6.4.3
+ peerDependencies:
+ react: ">=16.8"
+ react-dom: ">=16.8"
+ checksum: 67a44d8dc45761a1c88793cac73839bb657168ef61b9473eb39b186b4a3ea1472454fd96f8997dc541cb1e79a723d62f9503cbc9179b63b8f1d634ed6d2b079a
+ languageName: node
+ linkType: hard
+
+"react-router-stable@npm:react-router@^6.3.0, react-router@npm:6.3.0":
version: 6.3.0
resolution: "react-router@npm:6.3.0"
dependencies:
@@ -32200,6 +32832,17 @@ __metadata:
languageName: node
linkType: hard
+"react-router@npm:6.4.3, react-router@npm:^6.3.0":
+ version: 6.4.3
+ resolution: "react-router@npm:6.4.3"
+ dependencies:
+ "@remix-run/router": 1.0.3
+ peerDependencies:
+ react: ">=16.8"
+ checksum: b89c0495c6837b1457915c08c5acc4eb7a2e9e3fae0420faf9bfc6311ecdfe78627cc1034c0e975bccd9aeeb70d1dcc5021322779dd3053d94c47e37339d77eb
+ languageName: node
+ linkType: hard
+
"react-side-effect@npm:^2.1.0":
version: 2.1.0
resolution: "react-side-effect@npm:2.1.0"
@@ -33030,7 +33673,7 @@ __metadata:
languageName: node
linkType: hard
-"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0":
+"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0":
version: 1.22.1
resolution: "resolve@npm:1.22.1"
dependencies:
@@ -33072,7 +33715,7 @@ __metadata:
languageName: node
linkType: hard
-"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin":
+"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin":
version: 1.22.1
resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b"
dependencies:
@@ -33456,12 +34099,12 @@ __metadata:
languageName: node
linkType: hard
-"rxjs@npm:^7.0.0, rxjs@npm:^7.1.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5":
- version: 7.5.6
- resolution: "rxjs@npm:7.5.6"
+"rxjs@npm:^7.0.0, rxjs@npm:^7.1.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.5.6":
+ version: 7.5.7
+ resolution: "rxjs@npm:7.5.7"
dependencies:
tslib: ^2.1.0
- checksum: fc05f01364a74dac57490fb3e07ea63b422af04017fae1db641a009073f902ef69f285c5daac31359620dc8d9aee7d81e42b370ca2a8573d1feae0b04329383b
+ checksum: edabcdb73b0f7e0f5f6e05c2077aff8c52222ac939069729704357d6406438acca831c24210db320aba269e86dbe1a400f3769c89101791885121a342fb15d9c
languageName: node
linkType: hard
@@ -34045,20 +34688,6 @@ __metadata:
languageName: node
linkType: hard
-"sinon@npm:^11.1.1":
- version: 11.1.2
- resolution: "sinon@npm:11.1.2"
- dependencies:
- "@sinonjs/commons": ^1.8.3
- "@sinonjs/fake-timers": ^7.1.2
- "@sinonjs/samsam": ^6.0.2
- diff: ^5.0.0
- nise: ^5.1.0
- supports-color: ^7.2.0
- checksum: 1d01377e230c9ba976bf33f28b588bae7901b0b5a503d2f6b2a7914b0dbaa9f09823481926c6f2abed820123c7fa865519695af3ae2e9ba18d8b025616163501
- languageName: node
- linkType: hard
-
"sinon@npm:^13.0.2":
version: 13.0.2
resolution: "sinon@npm:13.0.2"
@@ -34073,6 +34702,20 @@ __metadata:
languageName: node
linkType: hard
+"sinon@npm:^14.0.2":
+ version: 14.0.2
+ resolution: "sinon@npm:14.0.2"
+ dependencies:
+ "@sinonjs/commons": ^2.0.0
+ "@sinonjs/fake-timers": ^9.1.2
+ "@sinonjs/samsam": ^7.0.1
+ diff: ^5.0.0
+ nise: ^5.1.2
+ supports-color: ^7.2.0
+ checksum: de7730cd7785a457e42f9a93e955780c870296036a13816e3c0c5648360afae82fdc748e36c854cf26fb8abd117855a7211aee49265c334fa61439aae17a1b72
+ languageName: node
+ linkType: hard
+
"sisteransi@npm:^1.0.5":
version: 1.0.5
resolution: "sisteransi@npm:1.0.5"
@@ -34679,6 +35322,16 @@ __metadata:
languageName: node
linkType: hard
+"stream-browserify@npm:3.0.0":
+ version: 3.0.0
+ resolution: "stream-browserify@npm:3.0.0"
+ dependencies:
+ inherits: ~2.0.4
+ readable-stream: ^3.5.0
+ checksum: 4c47ef64d6f03815a9ca3874e2319805e8e8a85f3550776c47ce523b6f4c6cd57f40e46ec6a9ab8ad260fde61863c2718f250d3bedb3fe9052444eb9abfd9921
+ languageName: node
+ linkType: hard
+
"stream-browserify@npm:^2.0.1":
version: 2.0.2
resolution: "stream-browserify@npm:2.0.2"
@@ -35168,7 +35821,7 @@ __metadata:
languageName: node
linkType: hard
-"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0, supports-color@npm:^7.2.0":
+"supports-color@npm:^7.1.0, supports-color@npm:^7.2.0":
version: 7.2.0
resolution: "supports-color@npm:7.2.0"
dependencies:
@@ -35186,16 +35839,6 @@ __metadata:
languageName: node
linkType: hard
-"supports-hyperlinks@npm:^2.0.0":
- version: 2.1.0
- resolution: "supports-hyperlinks@npm:2.1.0"
- dependencies:
- has-flag: ^4.0.0
- supports-color: ^7.0.0
- checksum: e4f430c870a258c9854b8bd7f166a9c1e76e3b851da84d4399d6a8f1d4a485e4ec36c16455dde80acf06c86e7c0a6df76ed22b6a4644a6ae3eced8616b3f21b5
- languageName: node
- linkType: hard
-
"supports-preserve-symlinks-flag@npm:^1.0.0":
version: 1.0.0
resolution: "supports-preserve-symlinks-flag@npm:1.0.0"
@@ -35495,16 +36138,6 @@ __metadata:
languageName: node
linkType: hard
-"terminal-link@npm:^2.0.0":
- version: 2.1.1
- resolution: "terminal-link@npm:2.1.1"
- dependencies:
- ansi-escapes: ^4.2.1
- supports-hyperlinks: ^2.0.0
- checksum: ce3d2cd3a438c4a9453947aa664581519173ea40e77e2534d08c088ee6dda449eabdbe0a76d2a516b8b73c33262fedd10d5270ccf7576ae316e3db170ce6562f
- languageName: node
- 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"
@@ -37891,10 +38524,10 @@ __metadata:
languageName: node
linkType: hard
-"yaml@npm:^2.0.0, yaml@npm:^2.1.1":
- version: 2.1.1
- resolution: "yaml@npm:2.1.1"
- checksum: f48bb209918aa57cfaf78ef6448d1a1f8187f45c746f933268b7023dc59e5456004611879126c9bb5ea55b0a2b1c2b392dfde436931ece0c703a3d754562bb96
+"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
languageName: node
linkType: hard
@@ -38146,6 +38779,13 @@ __metadata:
languageName: node
linkType: hard
+"zen-observable@npm:^0.10.0":
+ version: 0.10.0
+ resolution: "zen-observable@npm:0.10.0"
+ checksum: cee4e8902fcf4ed49f96937e9bc30b980ad3311b85e94b836c77f787163c98f19c65d2d8ac80990e8ecf4c1497d84821d58580d5ee20015f55516de146e8b7af
+ languageName: node
+ linkType: hard
+
"zen-observable@npm:^0.8.15":
version: 0.8.15
resolution: "zen-observable@npm:0.8.15"
@@ -38153,13 +38793,6 @@ __metadata:
languageName: node
linkType: hard
-"zen-observable@npm:^0.9.0":
- version: 0.9.0
- resolution: "zen-observable@npm:0.9.0"
- checksum: d770639f7cb47c89e442b0b87e6955079b9d0f3f7da220f081c3a478ee7b837ee792be4ae8764f2d49fe0afaaa3fbcdc7a88042c3ed471df9ae551de90e82ea2
- languageName: node
- linkType: hard
-
"zenscroll@npm:^4.0.2":
version: 4.0.2
resolution: "zenscroll@npm:4.0.2"
@@ -38179,11 +38812,11 @@ __metadata:
linkType: hard
"zod-to-json-schema@npm:^3.18.1":
- version: 3.19.1
- resolution: "zod-to-json-schema@npm:3.19.1"
+ version: 3.19.2
+ resolution: "zod-to-json-schema@npm:3.19.2"
peerDependencies:
zod: ^3.19.0
- checksum: 22c07668e3c28c9d7c9bd3ad04a354ea017b6fc8b4df77ed29d11e42c4c03181612319db374932a1f8b5c37ef861157938dced9d848cad5281ee1540a156995c
+ checksum: 3bcc6cbdaa30e78502a12ae04fdd8e57e42715afb9bb8dd2cb249fa9fe4bc7857580cac6bbfa3d4d9375fdfeb946661763a3e6365fd60cac962daacaf4b61554
languageName: node
linkType: hard