diff --git a/.changeset/afraid-insects-do.md b/.changeset/afraid-insects-do.md
new file mode 100644
index 0000000000..dd3a02d063
--- /dev/null
+++ b/.changeset/afraid-insects-do.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-components': patch
+---
+
+Added ARIA landmark to Page component and added ARIA landmark to DesktopSidebar and Sidebar components
diff --git a/.changeset/backend-common-twist-your-ankle.md b/.changeset/backend-common-twist-your-ankle.md
new file mode 100644
index 0000000000..53655d5ab1
--- /dev/null
+++ b/.changeset/backend-common-twist-your-ankle.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': patch
+---
+
+Implemented the `UrlReader.search()` method for Google Cloud Storage. Due to limitations in the underlying storage API, only prefix-based searches are supported right now (for example, `https://storage.cloud.google.com/your-bucket/some-path/*`).
diff --git a/.changeset/beige-panthers-dream.md b/.changeset/beige-panthers-dream.md
new file mode 100644
index 0000000000..e477419c13
--- /dev/null
+++ b/.changeset/beige-panthers-dream.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Fixed a bug that was introduced in `0.13.1-next.0` which caused the `ent` claim of issued tokens to be dropped.
diff --git a/.changeset/brave-starfishes-try.md b/.changeset/brave-starfishes-try.md
new file mode 100644
index 0000000000..a611e78540
--- /dev/null
+++ b/.changeset/brave-starfishes-try.md
@@ -0,0 +1,5 @@
+---
+'@backstage/test-utils': patch
+---
+
+Fixed `renderInTestApp` so that it is able to re-render the result without removing the app wrapping.
diff --git a/.changeset/bright-panthers-guess.md b/.changeset/bright-panthers-guess.md
new file mode 100644
index 0000000000..a83f2e4bf1
--- /dev/null
+++ b/.changeset/bright-panthers-guess.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-api-docs': patch
+---
+
+Updated dependency `graphiql` to `^1.8.8`.
diff --git a/.changeset/clever-trains-greet.md b/.changeset/clever-trains-greet.md
new file mode 100644
index 0000000000..dc75f2f02a
--- /dev/null
+++ b/.changeset/clever-trains-greet.md
@@ -0,0 +1,20 @@
+---
+'@backstage/plugin-tech-insights-backend': minor
+---
+
+**BREAKING**: The `buildTechInsightsContext` function now takes an additional
+field in its options argument: `tokenManager`. This is an instance of
+`TokenManager`, which can be found in your backend initialization code's
+`env`.
+
+```diff
+ const builder = buildTechInsightsContext({
+ logger: env.logger,
+ config: env.config,
+ database: env.database,
+ discovery: env.discovery,
+ scheduler: env.scheduler,
++ tokenManager: env.tokenManager,
+ factRetrievers: [ /* ... */ ],
+ });
+```
diff --git a/.changeset/cool-mice-sit.md b/.changeset/cool-mice-sit.md
new file mode 100644
index 0000000000..321b5fcf0b
--- /dev/null
+++ b/.changeset/cool-mice-sit.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-tech-insights': patch
+---
+
+Add new component `EntityTechInsightsScorecardCard`, which can be used in the overview of the `EntityPage` page or display multiple individual `EntityTechInsightsScorecardCard` in `EntityLayout.Route`.
diff --git a/.changeset/cyan-boxes-double.md b/.changeset/cyan-boxes-double.md
new file mode 100644
index 0000000000..273fc08e17
--- /dev/null
+++ b/.changeset/cyan-boxes-double.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-tech-radar': patch
+---
+
+Rename `use` to `adopt`, to reflect Zalando Tech Radar regarding quadrants and add link to Zalando explanation.
diff --git a/.changeset/dirty-clocks-poke.md b/.changeset/dirty-clocks-poke.md
new file mode 100644
index 0000000000..3eb63ee7a2
--- /dev/null
+++ b/.changeset/dirty-clocks-poke.md
@@ -0,0 +1,18 @@
+---
+'@backstage/backend-tasks': patch
+---
+
+`TaskScheduleDefinition` has been updated to also accept an options object containing duration information in the form of days, hours, seconds and so on. This allows for scheduling without importing `luxon`.
+
+```diff
+-import { Duration } from 'luxon';
+// omitted other code
+
+const schedule = env.scheduler.createScheduledTaskRunner({
+- frequency: Duration.fromObject({ minutes: 10 }),
+- timeout: Duration.fromObject({ minutes: 15 }),
++ frequency: { minutes: 10 },
++ timeout: { minutes: 15 },
+ // omitted other code
+});
+```
diff --git a/.changeset/early-crabs-help.md b/.changeset/early-crabs-help.md
new file mode 100644
index 0000000000..a1464e0338
--- /dev/null
+++ b/.changeset/early-crabs-help.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-components': patch
+---
+
+Announce external links to screen readers
diff --git a/.changeset/early-lemons-add.md b/.changeset/early-lemons-add.md
new file mode 100644
index 0000000000..79b33aa783
--- /dev/null
+++ b/.changeset/early-lemons-add.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Fixed coverage configuration when using `BACKSTAGE_NEXT_TESTS`.
diff --git a/.changeset/empty-poems-lick.md b/.changeset/empty-poems-lick.md
new file mode 100644
index 0000000000..2f620758ed
--- /dev/null
+++ b/.changeset/empty-poems-lick.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': patch
+---
+
+Update types to match the new version of `@keyv/redis`
diff --git a/.changeset/fair-pigs-mate.md b/.changeset/fair-pigs-mate.md
new file mode 100644
index 0000000000..ce82e138b8
--- /dev/null
+++ b/.changeset/fair-pigs-mate.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-tech-insights-node': minor
+---
+
+**BREAKING**: The `FactRetrieverContext` type now contains an additional
+field: `tokenManager`.
diff --git a/.changeset/fast-stingrays-guess.md b/.changeset/fast-stingrays-guess.md
new file mode 100644
index 0000000000..044dfff856
--- /dev/null
+++ b/.changeset/fast-stingrays-guess.md
@@ -0,0 +1,36 @@
+---
+'@backstage/create-app': patch
+---
+
+Simplified the search collator scheduling by removing the need for the `luxon` dependency.
+
+For existing installations the scheduling can be simplified by removing the `luxon` dependency and using the human friendly duration object instead.
+Please note that this only applies if luxon is not used elsewhere in your installation.
+
+`packages/backend/package.json`
+
+```diff
+ "express": "^4.17.1",
+ "express-promise-router": "^4.1.0",
+- "luxon": "^2.0.2",
+```
+
+`packages/backend/src/plugins/search.ts`
+
+```diff
+ import { Router } from 'express';
+-import { Duration } from 'luxon';
+
+ // omitted other code
+
+ const schedule = env.scheduler.createScheduledTaskRunner({
+- frequency: Duration.fromObject({ minutes: 10 }),
+- timeout: Duration.fromObject({ minutes: 15 }),
++ frequency: { minutes: 10 },
++ timeout: { minutes: 15 },
+ // A 3 second delay gives the backend server a chance to initialize before
+ // any collators are executed, which may attempt requests against the API.
+- initialDelay: Duration.fromObject({ seconds: 3 }),
++ initialDelay: { seconds: 3 },
+ });
+```
diff --git a/.changeset/fluffy-poems-sell.md b/.changeset/fluffy-poems-sell.md
new file mode 100644
index 0000000000..07588225c9
--- /dev/null
+++ b/.changeset/fluffy-poems-sell.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend-module-rails': minor
+---
+
+**BREAKING**: Added a new `allowedImageNames` option, which needs to list any image name for it to be allowed as `imageName` input.
diff --git a/.changeset/fresh-panthers-arrive.md b/.changeset/fresh-panthers-arrive.md
new file mode 100644
index 0000000000..7ffba2109f
--- /dev/null
+++ b/.changeset/fresh-panthers-arrive.md
@@ -0,0 +1,18 @@
+---
+'@backstage/create-app': patch
+---
+
+Tweaked the `.dockerignore` file so that it's easier to add additional backend packages if desired.
+
+To apply this change to an existing app, make the following change to `.dockerignore`:
+
+```diff
+ cypress
+ microsite
+ node_modules
+-packages
+-!packages/backend/dist
++packages/*/src
++packages/*/node_modules
+ plugins
+```
diff --git a/.changeset/funny-lamps-turn.md b/.changeset/funny-lamps-turn.md
new file mode 100644
index 0000000000..9db340885e
--- /dev/null
+++ b/.changeset/funny-lamps-turn.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Extended lint rule to prevents imports of stories or tests from production code.
diff --git a/.changeset/grumpy-panthers-peel.md b/.changeset/grumpy-panthers-peel.md
new file mode 100644
index 0000000000..ecf4397554
--- /dev/null
+++ b/.changeset/grumpy-panthers-peel.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-tech-insights-backend-module-jsonfc': patch
+---
+
+Updated usages of `buildTechInsightsContext` in README.
diff --git a/.changeset/hip-monkeys-hide.md b/.changeset/hip-monkeys-hide.md
new file mode 100644
index 0000000000..94b8e08330
--- /dev/null
+++ b/.changeset/hip-monkeys-hide.md
@@ -0,0 +1,5 @@
+---
+'@backstage/test-utils': minor
+---
+
+Added the options parameter to `renderWithEffects`, which if forwarded to the `render` function from `@testling-library/react`. Initially only the `wrapper` option is supported.
diff --git a/.changeset/hungry-chefs-return.md b/.changeset/hungry-chefs-return.md
new file mode 100644
index 0000000000..d369b95edb
--- /dev/null
+++ b/.changeset/hungry-chefs-return.md
@@ -0,0 +1,24 @@
+---
+'@backstage/plugin-catalog-backend-module-github': patch
+---
+
+`GitHubOrgEntityProvider.fromConfig` now supports a `schedule` option like other
+entity providers, that makes it more convenient to leverage using the common
+task scheduler.
+
+If you want to use this in your own project, it is used something like the following:
+
+```ts
+// In packages/backend/src/plugins/catalog.ts
+builder.addEntityProvider(
+ GitHubOrgEntityProvider.fromConfig(env.config, {
+ id: 'production',
+ orgUrl: 'https://github.com/backstage',
+ schedule: env.scheduler.createScheduledTaskRunner({
+ frequency: { cron: '*/30 * * * *' },
+ timeout: { minutes: 10 },
+ }),
+ logger: env.logger,
+ }),
+);
+```
diff --git a/.changeset/hungry-goats-mate.md b/.changeset/hungry-goats-mate.md
new file mode 100644
index 0000000000..733b1c7cf5
--- /dev/null
+++ b/.changeset/hungry-goats-mate.md
@@ -0,0 +1,9 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Updates the OAuth2 Proxy provider to require less infrastructure configuration.
+
+The auth result object of the OAuth2 Proxy now provides access to the request headers, both through the `headers` object as well as `getHeader` method. The existing logic that parses and extracts the user information from ID tokens is deprecated and will be removed in a future release. See the OAuth2 Proxy provider documentation for more details.
+
+The OAuth2 Proxy provider now also has a default `authHandler` implementation that reads the display name and email from the incoming request headers.
diff --git a/.changeset/kind-cats-clap.md b/.changeset/kind-cats-clap.md
new file mode 100644
index 0000000000..a415705d7f
--- /dev/null
+++ b/.changeset/kind-cats-clap.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-user-settings': patch
+---
+
+Added alternative text to profile picture
diff --git a/.changeset/loud-peaches-warn.md b/.changeset/loud-peaches-warn.md
new file mode 100644
index 0000000000..19d3503116
--- /dev/null
+++ b/.changeset/loud-peaches-warn.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-gerrit': patch
+---
+
+Fix incorrect main path in `publishConfig`
diff --git a/.changeset/lovely-houses-argue.md b/.changeset/lovely-houses-argue.md
new file mode 100644
index 0000000000..cfd902a958
--- /dev/null
+++ b/.changeset/lovely-houses-argue.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-components': patch
+---
+
+Added optional anchorOrigin alignment prop to AlertDisplay
diff --git a/.changeset/mean-owls-share.md b/.changeset/mean-owls-share.md
new file mode 100644
index 0000000000..df02959247
--- /dev/null
+++ b/.changeset/mean-owls-share.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder': patch
+---
+
+Allow validation for custom field extension with type object
diff --git a/.changeset/mean-seas-burn.md b/.changeset/mean-seas-burn.md
new file mode 100644
index 0000000000..1cd3a206dd
--- /dev/null
+++ b/.changeset/mean-seas-burn.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Minor internal tweak to support TypeScript 4.6
diff --git a/.changeset/metal-hairs-build.md b/.changeset/metal-hairs-build.md
new file mode 100644
index 0000000000..9ed8bba01b
--- /dev/null
+++ b/.changeset/metal-hairs-build.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-rollbar-backend': patch
+---
+
+Updated README to include clearer installation instructions on how to install and configure.
diff --git a/.changeset/nasty-paws-move.md b/.changeset/nasty-paws-move.md
new file mode 100644
index 0000000000..19d73ddc4d
--- /dev/null
+++ b/.changeset/nasty-paws-move.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': patch
+---
+
+Tweaked template to provide an example and guidance for how to configure sign-in in `packages/backend/src/plugins/auth.ts`. There is no need to add this to existing apps, but for more information about sign-in configuration, see https://backstage.io/docs/auth/identity-resolver.
diff --git a/.changeset/nine-actors-fly.md b/.changeset/nine-actors-fly.md
new file mode 100644
index 0000000000..b87ad1408f
--- /dev/null
+++ b/.changeset/nine-actors-fly.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-components': patch
+---
+
+Add an aria-label to the support button to improve accessibility for screen readers
diff --git a/.changeset/nine-geese-rest.md b/.changeset/nine-geese-rest.md
new file mode 100644
index 0000000000..da91c6234b
--- /dev/null
+++ b/.changeset/nine-geese-rest.md
@@ -0,0 +1,6 @@
+---
+'@backstage/cli': patch
+---
+
+Changed Rollup configuration for TypeScript definition plugin to ignore `css`,
+`scss`, `sass`, `svg`, `eot`, `woff`, `woff2` and `ttf` files.
diff --git a/.changeset/odd-apples-smash.md b/.changeset/odd-apples-smash.md
new file mode 100644
index 0000000000..e93e87b3c1
--- /dev/null
+++ b/.changeset/odd-apples-smash.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Lighthouse was reporting this button as having invalid aria- values, as the popover doesn't exist until clicked. This adds additional labels to the button to make it valid aria
diff --git a/.changeset/orange-elephants-laugh.md b/.changeset/orange-elephants-laugh.md
new file mode 100644
index 0000000000..08087786af
--- /dev/null
+++ b/.changeset/orange-elephants-laugh.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-react': patch
+---
+
+Added menu parent role for menu items accessibility
diff --git a/.changeset/polite-planets-learn.md b/.changeset/polite-planets-learn.md
new file mode 100644
index 0000000000..283af6e801
--- /dev/null
+++ b/.changeset/polite-planets-learn.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-org': patch
+---
+
+Fix linking ownership card to catalog owner filter when namespaces are used
diff --git a/.changeset/pre.json b/.changeset/pre.json
index f598c9f725..cdcad84ba8 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -144,52 +144,100 @@
"@backstage/plugin-user-settings": "0.4.3",
"@backstage/plugin-xcmetrics": "0.2.24",
"@backstage/plugin-catalog-backend-module-gerrit": "0.0.0",
- "@backstage/plugin-techdocs-module-addons-contrib": "0.0.0"
+ "@backstage/plugin-techdocs-module-addons-contrib": "0.0.0",
+ "@backstage/plugin-adr": "0.0.0",
+ "@backstage/plugin-adr-backend": "0.0.0",
+ "@backstage/plugin-adr-common": "0.0.0",
+ "@internal/plugin-todo-list": "1.0.0",
+ "@internal/plugin-todo-list-backend": "1.0.0",
+ "@internal/plugin-todo-list-common": "1.0.0",
+ "@backstage/plugin-techdocs-addons-test-utils": "0.0.0"
},
"changesets": [
+ "afraid-insects-do",
+ "beige-panthers-dream",
+ "brave-starfishes-try",
"breezy-days-prove",
+ "bright-panthers-guess",
+ "chatty-forks-bathe",
+ "clever-trains-greet",
+ "cool-mice-sit",
"cool-ties-share",
"curly-parrots-applaud",
+ "cyan-boxes-double",
"dirty-eagles-hunt",
+ "early-crabs-help",
+ "early-lemons-add",
"eighty-chicken-retire",
+ "empty-mugs-bow",
+ "empty-poems-lick",
"fair-kings-retire",
+ "fair-pigs-mate",
+ "funny-lamps-turn",
"fuzzy-seahorses-teach",
"giant-cheetahs-thank",
+ "grumpy-panthers-peel",
"hip-adults-collect",
+ "hip-monkeys-hide",
"honest-kids-live",
"hot-peaches-give",
+ "hungry-goats-mate",
+ "kind-cats-clap",
"lazy-zebras-pay",
+ "loud-peaches-warn",
+ "lovely-houses-argue",
"mean-flowers-change",
+ "mean-owls-share",
+ "mean-seas-burn",
+ "metal-hairs-build",
"metal-pants-fly",
"moody-laws-boil",
"moody-suns-smell",
"nasty-humans-give",
+ "nasty-paws-move",
"new-beds-argue",
+ "nine-actors-fly",
+ "nine-geese-rest",
+ "odd-apples-smash",
"old-bikes-study",
+ "orange-elephants-laugh",
"perfect-penguins-rescue",
"pink-mayflies-rhyme",
+ "polite-planets-learn",
+ "renovate-05696d1",
+ "renovate-5970cc2",
+ "renovate-b063c4b",
"renovate-bf43c44",
+ "renovate-ca619fc",
"search-dry-wolves-join",
"search-heavy-llamas-worry",
"seven-deers-rule",
"shiny-students-approve",
+ "short-chicken-act",
"short-dodos-sparkle",
"short-flies-collect",
"silver-readers-deliver",
+ "six-buckets-tap",
"sixty-llamas-change",
+ "smart-ghosts-search",
"spotty-plums-rule",
"stale-pigs-reply",
"strong-mangos-sell",
"swift-bugs-share",
"swift-parrots-hammer",
+ "tall-parents-deny",
"tasty-drinks-teach",
"techdocs-changeset-not-found",
+ "techdocs-five-hundred-ml",
+ "techdocs-low-calorie-drink",
"techdocs-nice-boats-wonder",
"techdocs-quick-owls-smile",
"techdocs-touch-screen-wipes",
+ "techdocs-vitamin-well-reload",
"thick-bees-brush",
"tough-forks-carry",
"violet-steaks-knock",
+ "wicked-vans-press",
"wild-pigs-work",
"wise-emus-wait"
]
diff --git a/.changeset/renovate-05696d1.md b/.changeset/renovate-05696d1.md
new file mode 100644
index 0000000000..cd9fe676b0
--- /dev/null
+++ b/.changeset/renovate-05696d1.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-api-docs': patch
+---
+
+Updated dependency `@asyncapi/react-component` to `1.0.0-next.37`.
diff --git a/.changeset/renovate-4b92131.md b/.changeset/renovate-4b92131.md
new file mode 100644
index 0000000000..2926b306d4
--- /dev/null
+++ b/.changeset/renovate-4b92131.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder': patch
+---
+
+Updated dependency `use-immer` to `^0.7.0`.
diff --git a/.changeset/renovate-5970cc2.md b/.changeset/renovate-5970cc2.md
new file mode 100644
index 0000000000..47d339fee3
--- /dev/null
+++ b/.changeset/renovate-5970cc2.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-api-docs': patch
+---
+
+Updated dependency `@asyncapi/react-component` to `1.0.0-next.38`.
diff --git a/.changeset/renovate-abcbd6e.md b/.changeset/renovate-abcbd6e.md
new file mode 100644
index 0000000000..e96d9ea875
--- /dev/null
+++ b/.changeset/renovate-abcbd6e.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-scaffolder': patch
+'@backstage/plugin-techdocs': patch
+---
+
+Updated dependency `event-source-polyfill` to `1.0.26`.
diff --git a/.changeset/renovate-b063c4b.md b/.changeset/renovate-b063c4b.md
new file mode 100644
index 0000000000..89292d03a0
--- /dev/null
+++ b/.changeset/renovate-b063c4b.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder': patch
+---
+
+Updated dependency `@codemirror/legacy-modes` to `^0.20.0`.
diff --git a/.changeset/renovate-ca619fc.md b/.changeset/renovate-ca619fc.md
new file mode 100644
index 0000000000..cbbfe69d2f
--- /dev/null
+++ b/.changeset/renovate-ca619fc.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-graphiql': patch
+---
+
+Updated dependency `@types/codemirror` to `^0.0.109`.
diff --git a/.changeset/search-the-worst-of-you.md b/.changeset/search-the-worst-of-you.md
new file mode 100644
index 0000000000..29d9661f24
--- /dev/null
+++ b/.changeset/search-the-worst-of-you.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-search-backend-node': patch
+'@backstage/plugin-search-backend-module-elasticsearch': patch
+'@backstage/plugin-search-backend-module-pg': patch
+---
+
+Search Engines will now index documents in batches of 1000 instead of 100 (under the hood). This may result in your Backstage backend consuming slightly more memory during index runs, but should dramatically improve indexing performance for large document sets.
diff --git a/.changeset/short-chicken-act.md b/.changeset/short-chicken-act.md
new file mode 100644
index 0000000000..ed8e70edac
--- /dev/null
+++ b/.changeset/short-chicken-act.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Added the ability to help a user get started with a new organization
diff --git a/.changeset/six-buckets-tap.md b/.changeset/six-buckets-tap.md
new file mode 100644
index 0000000000..c596f6fb85
--- /dev/null
+++ b/.changeset/six-buckets-tap.md
@@ -0,0 +1,5 @@
+---
+'@backstage/test-utils': minor
+---
+
+Added `createTestAppWrapper`, which returns a component that can be used as the `wrapper` option for `render` or `renderWithEffects`.
diff --git a/.changeset/smart-ghosts-search.md b/.changeset/smart-ghosts-search.md
new file mode 100644
index 0000000000..3fb3c9c716
--- /dev/null
+++ b/.changeset/smart-ghosts-search.md
@@ -0,0 +1,28 @@
+---
+'@backstage/create-app': patch
+---
+
+Removed the database choice from the `create-app` command.
+
+This reduces the step from development to production by always installing the dependencies and templating the production configuration in `app-config.production.yaml`.
+
+Added `app-config.local.yaml` to allow for local configuration overrides.
+To replicate this behavior in an existing installation simply `touch app-config.local.yaml` in the project root and apply your local configuration.
+
+`better-sqlite3` has been moved to devDependencies, for existing installations using postgres in production and SQLite in development it's recommended to move SQLite into the devDependencies section to avoid unnecessary dependencies during builds.
+
+in `packages/backend/package.json`
+
+```diff
+ "dependencies": {
+ ...
+ "pg": "^8.3.0",
+- "better-sqlite3": "^7.5.0",
+ "winston": "^3.2.1"
+ },
+ "devDependencies": {
+ ...
+ "@types/luxon": "^2.0.4",
++ "better-sqlite3": "^7.5.0"
+ }
+```
diff --git a/.changeset/tall-parents-deny.md b/.changeset/tall-parents-deny.md
new file mode 100644
index 0000000000..c757b37b79
--- /dev/null
+++ b/.changeset/tall-parents-deny.md
@@ -0,0 +1,20 @@
+---
+'@backstage/plugin-search-react': minor
+---
+
+**BREAKING**: `SearchContextProviderForStorybook` and `SearchApiProviderForStorybook` has been deleted. New mock implementation of the `SearchApi` introduced. If you need to mock the api we recommend you to do the following:
+
+```tsx
+import {
+ searchApiRef,
+ MockSearchApi,
+ SearchContextProvider,
+} from '@backstage/plugin-search-react';
+import { TestApiProvider } from '@backstage/test-utils';
+
+
+
+
+
+ ;
+```
diff --git a/.changeset/techdocs-five-hundred-ml.md b/.changeset/techdocs-five-hundred-ml.md
new file mode 100644
index 0000000000..775a5c55ab
--- /dev/null
+++ b/.changeset/techdocs-five-hundred-ml.md
@@ -0,0 +1,5 @@
+---
+'@techdocs/cli': patch
+---
+
+The TechDocs CLI's embedded app now imports all API refs from the `@backstage/plugin-techdocs-react` package.
diff --git a/.changeset/techdocs-low-calorie-drink.md b/.changeset/techdocs-low-calorie-drink.md
new file mode 100644
index 0000000000..6290085d91
--- /dev/null
+++ b/.changeset/techdocs-low-calorie-drink.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-techdocs-react': patch
+'@backstage/plugin-techdocs': patch
+---
+
+The `TechDocsStorageApi` and its associated ref are now exported by `@backstage/plugin-techdocs-react`. The API interface, ref, and types are now deprecated in `@backstage/plugin-techdocs` and will be removed in a future release.
diff --git a/.changeset/techdocs-vitamin-well-reload.md b/.changeset/techdocs-vitamin-well-reload.md
new file mode 100644
index 0000000000..967cc6b6a6
--- /dev/null
+++ b/.changeset/techdocs-vitamin-well-reload.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-techdocs-addons-test-utils': minor
+---
+
+Introducing a package with utilities to help test TechDocs Addons.
diff --git a/.changeset/three-tips-hunt.md b/.changeset/three-tips-hunt.md
new file mode 100644
index 0000000000..3782fc315b
--- /dev/null
+++ b/.changeset/three-tips-hunt.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Updated `create-github-app` command to prompt for read or write permissions to simplify setup.
diff --git a/.changeset/tricky-phones-sing.md b/.changeset/tricky-phones-sing.md
new file mode 100644
index 0000000000..df588fe585
--- /dev/null
+++ b/.changeset/tricky-phones-sing.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-tasks': patch
+---
+
+Correctly set next run time for tasks
diff --git a/.changeset/wicked-vans-press.md b/.changeset/wicked-vans-press.md
new file mode 100644
index 0000000000..d56c77b358
--- /dev/null
+++ b/.changeset/wicked-vans-press.md
@@ -0,0 +1,15 @@
+---
+'@backstage/create-app': patch
+---
+
+Bumped the `typescript` version in the template to `~4.6.4`.
+
+To apply this change to an existing app, make the following change to the root `package.json`:
+
+```diff
+ dependencies: {
+ ...
+- "typescript": "~4.5.4"
++ "typescript": "~4.6.4"
+ },
+```
diff --git a/.changeset/witty-lions-reply.md b/.changeset/witty-lions-reply.md
new file mode 100644
index 0000000000..d79937e027
--- /dev/null
+++ b/.changeset/witty-lions-reply.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-react': patch
+---
+
+Make Menu item on filters accessible through keyboard
diff --git a/.dockerignore b/.dockerignore
index e34ae2c37d..45f9f52059 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -3,6 +3,6 @@ docs
cypress
microsite
node_modules
-packages
-!packages/backend/dist
+packages/*/src
+packages/*/node_modules
plugins
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 3665a4952d..b4f825d221 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -5,6 +5,8 @@
# https://help.github.com/articles/about-codeowners/
* @backstage/reviewers
+yarn.lock @backstage/reviewers @backstage-service
+*/yarn.lock @backstage/reviewers @backstage-service
/.changeset/cost-insights-* @backstage/reviewers @backstage/silver-lining
/.changeset/search-* @backstage/reviewers @backstage/techdocs-core
/.changeset/techdocs-* @backstage/reviewers @backstage/techdocs-core
diff --git a/.github/styles/vocab.txt b/.github/vale/Vocab/Backstage/accept.txt
similarity index 98%
rename from .github/styles/vocab.txt
rename to .github/vale/Vocab/Backstage/accept.txt
index acbc47a861..32044d66a1 100644
--- a/.github/styles/vocab.txt
+++ b/.github/vale/Vocab/Backstage/accept.txt
@@ -8,9 +8,6 @@ airbrake
Anddddd
Apdex
api
-Api
-apis
-args
asciidoc
async
Atlassian
@@ -19,7 +16,6 @@ autoscaling
Autoscaling
autoselect
Avro
-aws
backported
backporting
Bigtable
@@ -38,7 +34,6 @@ changesets
Changesets
chanwit
Chanwit
-ci
CI/CD
classname
cli
@@ -127,7 +122,6 @@ hoc
horizontalpodautoscalers
Hostname
hotspots
-html
http
https
Iain
@@ -224,6 +218,8 @@ performant
Performant
periskop
Periskop
+permissioned
+permissioning
plantuml
Platformize
Podman
@@ -314,8 +310,8 @@ templaters
Templaters
theia
thumbsup
-toc
todo
+todos
tolerations
Tolerations
toolchain
@@ -339,7 +335,6 @@ unregistration
untracked
upsert
upvote
-url
URIs
URLs
utils
diff --git a/.github/vale/config.ini b/.github/vale/config.ini
new file mode 100644
index 0000000000..36acb2c058
--- /dev/null
+++ b/.github/vale/config.ini
@@ -0,0 +1,6 @@
+StylesPath = .
+Vocab = Backstage
+
+[*.md]
+BasedOnStyles = Vale
+Vale.Terms = NO
diff --git a/.github/workflows/automate_merge_renovate_prs.yaml b/.github/workflows/automate_merge_renovate_prs.yaml
new file mode 100644
index 0000000000..8de488cf05
--- /dev/null
+++ b/.github/workflows/automate_merge_renovate_prs.yaml
@@ -0,0 +1,85 @@
+name: Automate Merge Renovate PRs
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '*/10 * * * *'
+
+jobs:
+ diff:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/github-script@v6
+ with:
+ script: |
+ const owner = "backstage";
+ const repo = "backstage";
+ const query = `{
+ repository(owner: "backstage", name: "backstage") {
+ pullRequests(labels: ["dependencies"], last: 10, states: [OPEN]) {
+ nodes {
+ title
+ author {
+ login
+ }
+ number
+ mergeable
+ files(first: 1) {
+ nodes {
+ path
+ }
+ }
+ changedFiles
+ commits(last: 1) {
+ nodes {
+ commit {
+ statusCheckRollup {
+ state
+ }
+ }
+ }
+ }
+ reviewDecision
+ reviews(first: 10) {
+ nodes {
+ author {
+ login
+ }
+ }
+ }
+ }
+ }
+ }
+ }`;
+
+ const date = new Date();
+ if (date.getDay() === 2) {
+ console.log("Skipping auto merge because Tuesday is release day");
+ return;
+ }
+
+ const r = await github.graphql(query);
+ const mergable = r.repository.pullRequests.nodes.filter(
+ (pr) =>
+ pr.author.login === "renovate" &&
+ pr.mergeable === "MERGEABLE" &&
+ pr.changedFiles === 1 &&
+ pr.files.nodes[0].path.split("/").slice(-1)[0] === "yarn.lock" &&
+ pr.commits.nodes[0].commit.statusCheckRollup.state === "SUCCESS" &&
+ pr.reviewDecision === "APPROVED"
+ );
+
+ if (mergable.length === 0) {
+ console.log("no mergable PRs");
+ return;
+ }
+
+ for (const pr of mergable) {
+ console.log(`Merging #${pr.number} - ${pr.title}`);
+ await github.rest.pulls.merge({
+ owner,
+ repo,
+ pull_number: pr.number,
+ });
+ await new Promise((r) => setTimeout(r, 2000));
+ }
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 31a315d044..f0993cf549 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -75,7 +75,7 @@ jobs:
# Cache every node_modules folder inside the monorepo
- name: cache all node_modules
id: cache-modules
- uses: actions/cache@v2
+ uses: actions/cache@v3
with:
path: '**/node_modules'
# We use both yarn.lock and package.json as cache keys to ensure that
@@ -91,7 +91,7 @@ jobs:
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: cache global yarn cache
- uses: actions/cache@v2
+ uses: actions/cache@v3
if: steps.cache-modules.outputs.cache-hit != 'true'
with:
path: ${{ steps.yarn-cache.outputs.dir }}
diff --git a/.github/workflows/deploy_nightly.yml b/.github/workflows/deploy_nightly.yml
index 85668bdc3a..82c67501e8 100644
--- a/.github/workflows/deploy_nightly.yml
+++ b/.github/workflows/deploy_nightly.yml
@@ -28,7 +28,7 @@ jobs:
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: cache all node_modules
id: cache-modules
- uses: actions/cache@v2
+ uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
@@ -37,7 +37,7 @@ jobs:
if: steps.cache-modules.outputs.cache-hit != 'true'
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: cache global yarn cache
- uses: actions/cache@v2
+ uses: actions/cache@v3
if: steps.cache-modules.outputs.cache-hit != 'true'
with:
path: ${{ steps.yarn-cache.outputs.dir }}
diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml
index bcb4016ab9..b0067dd8ad 100644
--- a/.github/workflows/deploy_packages.yml
+++ b/.github/workflows/deploy_packages.yml
@@ -69,7 +69,7 @@ jobs:
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: cache all node_modules
id: cache-modules
- uses: actions/cache@v2
+ uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
@@ -78,7 +78,7 @@ jobs:
if: steps.cache-modules.outputs.cache-hit != 'true'
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: cache global yarn cache
- uses: actions/cache@v2
+ uses: actions/cache@v3
if: steps.cache-modules.outputs.cache-hit != 'true'
with:
path: ${{ steps.yarn-cache.outputs.dir }}
@@ -165,7 +165,7 @@ jobs:
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: cache all node_modules
id: cache-modules
- uses: actions/cache@v2
+ uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
@@ -174,7 +174,7 @@ jobs:
if: steps.cache-modules.outputs.cache-hit != 'true'
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: cache global yarn cache
- uses: actions/cache@v2
+ uses: actions/cache@v3
if: steps.cache-modules.outputs.cache-hit != 'true'
with:
path: ${{ steps.yarn-cache.outputs.dir }}
diff --git a/.github/workflows/sync_approve_renovate_pr.yaml b/.github/workflows/sync_approve_renovate_pr.yaml
new file mode 100644
index 0000000000..2d25bea223
--- /dev/null
+++ b/.github/workflows/sync_approve_renovate_pr.yaml
@@ -0,0 +1,37 @@
+name: Approve renovate lock file changes
+on:
+ pull_request_target:
+ paths:
+ - '.github/workflows/sync_renovate-changesets.yml'
+ - '**/yarn.lock'
+
+jobs:
+ generate-changeset:
+ runs-on: ubuntu-latest
+ if: github.actor == 'renovate[bot]' && github.repository == 'backstage/backstage'
+ steps:
+ - name: Approve
+ uses: actions/github-script@v6
+ with:
+ github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }}
+ script: |
+ const owner = 'backstage';
+ const repo = 'backstage';
+
+ const r = await github.rest.pulls.listFiles({
+ owner,
+ repo,
+ pull_number: context.issue.number,
+ });
+
+ if (r.data.some((f) => f.filename.split('/').slice(-1)[0] !== 'yarn.lock')) {
+ console.log('skipping approval since some files are not yarn.lock');
+ return;
+ }
+
+ await github.rest.pulls.createReview({
+ owner,
+ repo,
+ pull_number: context.issue.number,
+ event: 'APPROVE'
+ })
diff --git a/.github/workflows/sync_code-formatting.yml b/.github/workflows/sync_code-formatting.yml
index c1a4b9e1d0..c238f33306 100644
--- a/.github/workflows/sync_code-formatting.yml
+++ b/.github/workflows/sync_code-formatting.yml
@@ -22,7 +22,7 @@ jobs:
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: cache all node_modules
id: cache-modules
- uses: actions/cache@v2
+ uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
@@ -31,7 +31,7 @@ jobs:
if: steps.cache-modules.outputs.cache-hit != 'true'
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: cache global yarn cache
- uses: actions/cache@v2
+ uses: actions/cache@v3
if: steps.cache-modules.outputs.cache-hit != 'true'
with:
path: ${{ steps.yarn-cache.outputs.dir }}
diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml
index 0bf0340f68..4d6b184b02 100644
--- a/.github/workflows/sync_snyk-github-issues.yml
+++ b/.github/workflows/sync_snyk-github-issues.yml
@@ -24,7 +24,7 @@ jobs:
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: cache all node_modules
id: cache-modules
- uses: actions/cache@v2
+ uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
@@ -33,7 +33,7 @@ jobs:
if: steps.cache-modules.outputs.cache-hit != 'true'
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: cache global yarn cache
- uses: actions/cache@v2
+ uses: actions/cache@v3
if: steps.cache-modules.outputs.cache-hit != 'true'
with:
path: ${{ steps.yarn-cache.outputs.dir }}
diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml
index 55c1c23587..ad2e92799f 100644
--- a/.github/workflows/verify_docs-quality.yml
+++ b/.github/workflows/verify_docs-quality.yml
@@ -12,10 +12,18 @@ jobs:
steps:
- uses: actions/checkout@v2
+
+ # Vale does not support file excludes, so we use the script to generate a list of files instead
+ # The action also does not allow args or a local config file to be passed in, so the files array
+ # also contains an "--config=.github/vale/config.ini" option
+ - name: generate vale args
+ id: generate
+ run: echo "::set-output name=args::$(node scripts/check-docs-quality.js --ci-args)"
+
- name: documentation quality check
- uses: errata-ai/vale-action@v1.4.0
- # Whitelist excluding ADOPTERS, CHANGELOG and OWNERS (no exclude flag exists)
+ uses: errata-ai/vale-action@v1.5.0
with:
- files: '[".changeset", ".github", "contrib", "docs", "microsite", "packages", "plugins", "CONTRIBUTING.md", "CODE_OF_CONDUCT.md", "GOVERNANCE.md", "README.md"]'
+ # This also contains --config=.github/vale/config.ini ... :/
+ files: '${{ steps.generate.outputs.args }}'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml
index e333aaba0c..8d69eef262 100644
--- a/.github/workflows/verify_e2e-linux.yml
+++ b/.github/workflows/verify_e2e-linux.yml
@@ -48,7 +48,7 @@ jobs:
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: cache all node_modules
id: cache-modules
- uses: actions/cache@v2
+ uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
@@ -59,7 +59,7 @@ jobs:
- name: setup chrome
uses: browser-actions/setup-chrome@latest
- name: cache global yarn cache
- uses: actions/cache@v2
+ uses: actions/cache@v3
if: steps.cache-modules.outputs.cache-hit != 'true'
with:
path: ${{ steps.yarn-cache.outputs.dir }}
@@ -78,3 +78,7 @@ jobs:
yarn e2e-test run
env:
BACKSTAGE_TEST_DISABLE_DOCKER: 1
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: postgres
+ POSTGRES_HOST: localhost
+ POSTGRES_PORT: ${{ job.services.postgres.ports[5432] }}
diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml
index 60f58f4c66..c869d61c87 100644
--- a/.github/workflows/verify_storybook.yml
+++ b/.github/workflows/verify_storybook.yml
@@ -31,7 +31,7 @@ jobs:
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: cache all node_modules
id: cache-modules
- uses: actions/cache@v2
+ uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
@@ -40,7 +40,7 @@ jobs:
if: steps.cache-modules.outputs.cache-hit != 'true'
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: cache global yarn cache
- uses: actions/cache@v2
+ uses: actions/cache@v3
if: steps.cache-modules.outputs.cache-hit != 'true'
with:
path: ${{ steps.yarn-cache.outputs.dir }}
diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml
index 7156bec4f6..690aed7634 100644
--- a/.github/workflows/verify_windows.yml
+++ b/.github/workflows/verify_windows.yml
@@ -36,7 +36,7 @@ jobs:
id: yarn-cache
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: cache global yarn cache
- uses: actions/cache@v2
+ uses: actions/cache@v3
with:
path: ${{ steps.yarn-cache.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}
diff --git a/.gitignore b/.gitignore
index 60d0d6da3b..a54955ac73 100644
--- a/.gitignore
+++ b/.gitignore
@@ -130,6 +130,7 @@ site
# Local configuration files
*.local.yaml
+!packages/create-app/templates/default-app/app-config.local.yaml
# Sensitive credentials
*-credentials.yaml
diff --git a/ADOPTERS.md b/ADOPTERS.md
index 904654890d..bd9da8393d 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -26,7 +26,7 @@ _If you're using Backstage in your organization, please try to add your company
| [Acast.com](https://acast.com) | [Olle Lundberg](https://github.com/lndbrg) | Developer portal with tech docs, service catalog and a bunch of other internal tooling |
| [Lunar](https://lunar.app) | [Jacob Valdemar](https://github.com/JacobValdemar) | Internal developer portal for service overview and insights, API documentation, technical guides, onboarding guides and RFC's. |
| [Trendyol](https://trendyol.com) | [Gamze Senturk](https://github.com/gmzsenturk), [Mert Can Bilgic](https://github.com/mertcb) | The Developer Portal has been called `Pandora`. Provides an overview of Trendyol tech ecosystem. TechDocs, Catalog, Custom Plugins and Theme. |
-| [Peloton](https://www.onepeloton.com/) | [Matt Waldron](https://github.com/daftgopher) | Creating our first developer portal and tech-docs. Exploring Service Catalog, Tech Insights and Cost Insights as well. |
+| [Peloton](https://www.onepeloton.com/) | [Matt Waldron](https://github.com/daftgopher) | Creating our first developer portal and tech-docs. Exploring Service Catalog, Tech Insights and Cost Insights as well. |
| [TELUS](https://telus.com) | [Seb Barre](https://github.com/sbarre) | The Go-to place to find answers about development and delivery at TELUS. |
| [Brex](https://www.brex.com/) | [Vamsi Chitters](https://github.com/vamsikc) | A centralized UI to understand how a service fits in the whole Brex architecture and manage a team’s engineering dependencies. |
| [Oriflame](https://www.oriflame.com/) | [Oriflame](https://github.com/oriflame) | Internal developer portal for services, single page apps and packages overview, API documentation, technical guides, tech-radar and more. |
@@ -34,7 +34,7 @@ _If you're using Backstage in your organization, please try to add your company
| [Netflix](https://www.netflix.com/) | [bleathem](https://github.com/bleathem) | Our Backstage implementation will be the front door to a unified experience connecting our internal platform products across important workflows with integrated knowledge and support. |
| [b.well](https://www.icanbwell.com/) | [Jacob Rosales](https://github.com/jrosales) | Foundation for our engineering portal and cloud insights. |
| [PagerDuty](https://www.pagerduty.com/) | [Mark Shaw](https://github.com/markshawtoronto) | Developer portal, initially focused on software templates and tech-docs. |
-| [MoonShiner](https://moonshiner.at) | [Fabian Hippmann](https://github.com/FabianHippmann) | Developer portal - helps us keep track of our customer projects, onboard new developers & improve our development process 🌕🚀🧑🚀 |
+| [MoonShiner](https://moonshiner.at) | [Fabian Hippmann](https://github.com/FabianHippmann) | Developer portal - helps us keep track of our customer projects, onboard new developers & improve our development process 🌕🚀🧑🚀 |
| [FundApps](https://www.fundapps.co/) | [Elliot Greenwood](https://github.com/egnwd) | Developer Portal - A place for us to keep track of our projects and documentation for all services and processes |
| [DAZN](https://dazn.com/) | [Lou Bichard](https://twitter.com/loujaybee), [Marco Crivellaro](https://github.com/crivetechie), [Alex Hollerith](mailto:alex.hollerith@dazn.com) | Ingesting all of DAZN's repos for the catalog, migrating our internal platform apps (pull request boards, release information, inner source marketplace etc) to Backstage plugins (where applicable). |
| [HelloFresh](https://www.hellofresh.de/) | [@iammuho](https://github.com/iammuho), [@ElenaForester](https://github.com/ElenaForester), [@diegomarangoni](https://github.com/diegomarangoni) | Our developer portal at HelloFresh - Spread across an organisation of 500+ engineers globally. |
@@ -113,8 +113,13 @@ _If you're using Backstage in your organization, please try to add your company
| [SIX](https://www.six-group.com/) | [@jbadeau](https://github.com/jbadeau), [@tomassatka](https://github.com/tomassatka) | Internal DevOps portal hosting our software and dataset catalog, as well as custom plugins for observability, service virtualization, deployments, incident managment and quality metrics. |
| [Raiffeisen Bank International](https://www.rbinternational.com/) | [Daniel Baumgartner](https://github.com/dabarbi) | From developers for developers: software catalog, techdocs and heavy use of scaffolder to drive reuse on engineering level forward. Part of inner source initiative. Multi national setup coming. |
| [Spread Group](https://www.spreadgroup.com/) | [Luna Stadler](https://github.com/heyLu), [Iván González](https://github.com/ivangonzalezacuna) | Internal Developer Portal, an overview of all running software, architecture documentation and more; replacing and unifying a variety of internal tools. |
-| [RD Station](https://rdstation.com) | [Rogerio Angeliski](https://github.com/angeliski), [Paula Assis](https://github.com/paulassis), [Guilherme Eric](https://github.com/guilhermeeric), [Daniela Adamatti](https://github.com/daniadamatti), [Luana Negreiros](https://github.com/luananegreiros) | Developer portal, scaffolding, services catalog. We are looking to centralize automations and information for the whole engineering team . | |
-| [Resuelve Tu Deuda](https://resuelve.mx)| [Iván Álvarez](https://github.com/ivanhoe), [Jorge Medina](https://github.com/jorgearma1982) | Internal developer portal, service catalog, tech docs, api doc
-| [Pachama](https://pachama.com/) | [Aron Gates](https://github.com/agates4) | Internal Developer Portal, a catalog of all microservices, architecture documentation, and templates to generate developer resources. |
-| [SEEK](https://www.seek.com.au) | [Jahred Hope](https://github.com/jahredhope) | Developer portal for developer tooling and technical documentation. |
-| [Marks & Spencer](https://www.marksandspencer.com/) | [Kamal Cheriyath](https://github.com/kcheriyath) | Centralised discovery, adoption and devops automation hub for Engineering & Architecture. |
\ No newline at end of file
+| [RD Station](https://rdstation.com) | [Rogerio Angeliski](https://github.com/angeliski), [Paula Assis](https://github.com/paulassis), [Guilherme Eric](https://github.com/guilhermeeric), [Daniela Adamatti](https://github.com/daniadamatti), [Luana Negreiros](https://github.com/luananegreiros) | Developer portal, scaffolding, services catalog. We are looking to centralize automations and information for the whole engineering team . |
+| [Resuelve Tu Deuda](https://resuelve.mx) | [Iván Álvarez](https://github.com/ivanhoe), [Jorge Medina](https://github.com/jorgearma1982) | Internal developer portal, service catalog, tech docs, api doc |
+| [Pachama](https://pachama.com/) | [Aron Gates](https://github.com/agates4) | Internal Developer Portal, a catalog of all microservices, architecture documentation, and templates to generate developer resources. |
+| [SEEK](https://www.seek.com.au) | [Jahred Hope](https://github.com/jahredhope) | Developer portal for developer tooling and technical documentation. |
+| [Marks & Spencer](https://www.marksandspencer.com/) | [Kamal Cheriyath](https://github.com/kcheriyath) | Centralised discovery, adoption and devops automation hub for Engineering & Architecture. |
+| [McKesson](https://www.mckesson.com/) | [Agnel Antony](https://github.com/aantony2) | Internal Developer Platform for developer gated CI/CD templates, technical documentation, cloud automation service catalog, etc. |
+| [World Fuel Services](https://www.wfscorp.com/) | [Anirudh Kurapathi](https://github.com/anirudhkurapati), [Alex Kwon](https://github.com/alexkwon), [Lester Hernandez](https://github.com/lhernandez-wfscorp), [Avi Boru](https://github.com/aviboru), [Vardhan Annapureddy](https://github.com/harshaaws) | Internal Developer Portal, service catalog product, API's, Software Templates, tech docs and more. |
+| [leboncoin](https://www.leboncoin.fr/) | [Andy Ladjadj](https://github.com/aladjadj) | Centralize our multiple UI in a single portal. Simplify onbording, new features and harmonize how people search information. Core features (catalog,api,docs,scafolder) are good to start the adoption. status: internal beta. |
+| [Contentful](https://www.contentful.com) | [James Bourne](https://github.com/jamesmbourne) | Centralized documentation of service ownership, APIs, and documentation, and new service creation with a custom scaffolder - [full case study with Roadie](https://roadie.io/case-studies/maintaining-velocity-through-hypergrowth-contentful/). |
+| [Back Market](https://www.backmarket.com) | [Sami Farhat](https://github.com/skfarhat) | Internal Developer Portal featuring catalog, tech-radar, ownership management, component creation (scaffolder) and centralized infrastructure management -- probably more to come. |
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e4aad09207..eb60bc48e0 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -16,7 +16,7 @@ No one likes bugs. Report bugs as an issue [here](https://github.com/backstage/b
### Fix bugs or build new features
-Look through the GitHub issues for [bugs](https://github.com/backstage/backstage/labels/bugs), [good first issues](https://github.com/backstage/backstage/labels/good%20first%20issue) or [help wanted](https://github.com/backstage/backstage/labels/help%20wanted).
+Look through the GitHub issues for [bugs](https://github.com/backstage/backstage/labels/bug), [good first issues](https://github.com/backstage/backstage/labels/good%20first%20issue) or [help wanted](https://github.com/backstage/backstage/labels/help%20wanted).
### Build a plugin
@@ -78,7 +78,7 @@ If you're contributing to the backend or CLI tooling, be mindful of cross-platfo
Also be sure to skim through our [ADRs](docs/architecture-decisions) to see if they cover what you're working on. In particular [ADR006: Avoid React.FC and React.SFC](docs/architecture-decisions/adr006-avoid-react-fc.md) is one to look out for.
-If there are any updates in `markdown` file please make sure to run `yarn run lint:docs`. Though it is checked on `lint-staged`. It is required to install [vale](https://docs.errata.ai/vale/install) `1.4.0` separately and make sure it is accessed by global command.
+If there are any updates in `markdown` file please make sure to run `yarn run lint:docs`. Though it is checked on `lint-staged`. It is required to install [vale](https://docs.errata.ai/vale/install) separately and make sure it is accessed by global command.
## Developer Certificate of Origin
diff --git a/STYLE.md b/STYLE.md
index 391b31ce50..b28c5da4fa 100644
--- a/STYLE.md
+++ b/STYLE.md
@@ -146,7 +146,7 @@ There are a few things to pay attention to, in order to make the documentation s
API documenter will not recognize arrow functions as functions, but rather as a constant that shows up in the list of exported variables. By declaring functions using the `function` keyword, they will show up in the list of functions. They will also get a much nicer documentation page for the individual function that shows information about parameters and return types.
-This also extends to React components, since API documenter doesn't have any special handling of those. By always defining exported React components using the `function` keyword, we make them show up among the list of functions in the API reference, where they are then easily discoverable through the `(props)` args (which you should be sure to include!).
+This also extends to React components, since API documenter doesn't have any special handling of those. By always defining exported React components using the `function` keyword, we make them show up among the list of functions in the API reference, where they are then easily discoverable through the `(props)` argument (which you should be sure to include!).

diff --git a/app-config.yaml b/app-config.yaml
index b3ca3c7203..1156b9b340 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -378,6 +378,8 @@ auth:
clientId: ${AUTH_ATLASSIAN_CLIENT_ID}
clientSecret: ${AUTH_ATLASSIAN_CLIENT_SECRET}
scopes: ${AUTH_ATLASSIAN_SCOPES}
+ myproxy:
+ development: {}
costInsights:
engineerCost: 200000
products:
diff --git a/contrib/docs/tutorials/help-im-behind-a-corporate-proxy.md b/contrib/docs/tutorials/help-im-behind-a-corporate-proxy.md
index 8a4d6fb273..9ec3f1ca64 100644
--- a/contrib/docs/tutorials/help-im-behind-a-corporate-proxy.md
+++ b/contrib/docs/tutorials/help-im-behind-a-corporate-proxy.md
@@ -64,8 +64,8 @@ if (process.env.HTTPS_PROXY) {
If your development environment is in the cloud (like with [AWS Cloud9](https://aws.amazon.com/cloud9/) or an instance of [Theia](https://theia-ide.org/)), you will need to update your configuration.
-You will probably need to make some changes in `app-config.yaml` (or another config file like `app-config.local.yaml` if you've created it, see the [configuration doc](https://backstage.io/docs/conf/#supplying-configuration)).
-The exact values will depend on your setup but for instance, if your public url is `https://your-public-url.com` and the port `3000` and `8080` are open:
+You will probably need to make some changes in `app-config.yaml` (or another config file like `app-config.local.yaml` if you've created it, see the [configuration doc](https://backstage.io/docs/conf/#supplying-configuration)).
+The exact values will depend on your setup but for instance, if your public URL is `https://your-public-url.com` and the port `3000` and `8080` are open:
```yaml
app:
diff --git a/cypress/README.md b/cypress/README.md
index 2bb310e300..15338fe371 100644
--- a/cypress/README.md
+++ b/cypress/README.md
@@ -18,6 +18,17 @@ yarn install
yarn cypress run
```
+Note that the tests expect to run against a built application, so you'll want to
+run a Docker image and either create an `app-config.cypress.yaml` or pass the
+necessary environment variables:
+
+```sh
+yarn tsc
+yarn build
+yarn workspace example-backend build-image
+docker run -p 7007:7007 example-backend
+```
+
You can open up the `cypress` console by using `yarn cypress open`.
You can also run towards any Backstage installation by using the Cypress Environment Variable overrides.
diff --git a/cypress/yarn.lock b/cypress/yarn.lock
index bb9aaecb89..c667cc6c03 100644
--- a/cypress/yarn.lock
+++ b/cypress/yarn.lock
@@ -1036,9 +1036,9 @@ type-fest@^0.21.3:
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
typescript@^4.1.3:
- version "4.1.3"
- resolved "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7"
- integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==
+ version "4.6.4"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9"
+ integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==
universalify@^2.0.0:
version "2.0.0"
diff --git a/docs/assets/permission/disabled-unregister-entity.png b/docs/assets/permission/disabled-unregister-entity.png
new file mode 100644
index 0000000000..f7975a0ced
Binary files /dev/null and b/docs/assets/permission/disabled-unregister-entity.png differ
diff --git a/docs/assets/permission/permission-framework-overview.drawio.svg b/docs/assets/permission/permission-framework-overview.drawio.svg
new file mode 100644
index 0000000000..c7e628f8a6
--- /dev/null
+++ b/docs/assets/permission/permission-framework-overview.drawio.svg
@@ -0,0 +1,4 @@
+
+
+
+User Plugin Permission Response Permission Framework Action... Resources Resource read... Permission Policy Permission Request Provided by Backstage Configured by integrators
Configured by integrators Configured by plugin authors
Configured by plugin authors Permission Backend Permission hooks Integration helpers ...
Permission Backend... 1 2 3 4 Text is not SVG - cannot display
\ No newline at end of file
diff --git a/docs/assets/permission/permission-todo-list-page.png b/docs/assets/permission/permission-todo-list-page.png
new file mode 100644
index 0000000000..cec2d66485
Binary files /dev/null and b/docs/assets/permission/permission-todo-list-page.png differ
diff --git a/docs/assets/techdocs/addon-locations.png b/docs/assets/techdocs/addon-locations.png
new file mode 100644
index 0000000000..e535fe61aa
Binary files /dev/null and b/docs/assets/techdocs/addon-locations.png differ
diff --git a/docs/auth/add-auth-provider.md b/docs/auth/add-auth-provider.md
index 07d6869fe3..282088fef9 100644
--- a/docs/auth/add-auth-provider.md
+++ b/docs/auth/add-auth-provider.md
@@ -74,7 +74,7 @@ export class ProviderAAuthProvider implements OAuthProviderHandlers {
clientID: options.clientId,
clientSecret: options.clientSecret,
callbackURL: options.callbackUrl,
- passReqToCallback: false as true,
+ passReqToCallback: false,
response_type: 'code',
/// ... etc
}
@@ -230,7 +230,7 @@ name.
### Test the new provider
You can `curl -i localhost:7007/api/auth/providerA/start` and which should
-provide a `302` redirect with a `Location` header. Paste the url from that
+provide a `302` redirect with a `Location` header. Paste the URL from that
header into a web browser and you should be able to trigger the authorization
flow.
diff --git a/docs/auth/github/provider.md b/docs/auth/github/provider.md
index 14b99bfea5..a8c6020cae 100644
--- a/docs/auth/github/provider.md
+++ b/docs/auth/github/provider.md
@@ -50,7 +50,7 @@ The GitHub provider is a structure with three configuration keys:
- `clientSecret`: The client secret tied to the generated client ID.
- `enterpriseInstanceUrl` (optional): The base URL for a GitHub Enterprise
instance, e.g. `https://ghe..com`. Only needed for GitHub Enterprise.
-- `callbackUrl` (optional): The callback url that GitHub will use when
+- `callbackUrl` (optional): The callback URL that GitHub will use when
initiating an OAuth flow, e.g.
`https://your-intermediate-service.com/handler`. Only needed if Backstage is
not the immediate receiver (e.g. one OAuth app for many backstage instances).
diff --git a/docs/auth/google/gcp-iap-auth.md b/docs/auth/google/gcp-iap-auth.md
index cdafeb1317..1ebfcaf15b 100644
--- a/docs/auth/google/gcp-iap-auth.md
+++ b/docs/auth/google/gcp-iap-auth.md
@@ -1,5 +1,5 @@
---
-id: provider
+id: gcp-iap-auth
title: Google Identity-Aware Proxy Provider
sidebar_label: Google IAP
# prettier-ignore
@@ -43,7 +43,8 @@ Add a `providerFactories` entry to the router in
`packages/backend/plugin/auth.ts`.
```ts
-import { createGcpIapProvider } from '@backstage/plugin-auth-backend';
+import { providers } from '@backstage/plugin-auth-backend';
+import { stringifyEntityRef } from '@backstage/catalog-model';
export default async function createPlugin(
env: PluginEnvironment,
@@ -54,7 +55,7 @@ export default async function createPlugin(
database: env.database,
discovery: env.discovery,
providerFactories: {
- 'gcp-iap': createGcpIapProvider({
+ 'gcp-iap': providers.gcpIap.create({
// Replace the auth handler if you want to customize the returned user
// profile info (can be left out; the default implementation is shown
// below which only returns the email). You may want to amend this code
@@ -71,12 +72,10 @@ export default async function createPlugin(
// Somehow compute the Backstage token claims. Just some dummy 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 = `user:default/${iapToken.email.split('@')[0]}`;
- const fullEnt = ['group:default/team-name'];
- const token = await ctx.tokenIssuer.issueToken({
- claims: { sub: id, ent: fullEnt },
- });
- return { id, token };
+ const id = iapToken.email.split('@')[0];
+ const sub = stringifyEntityRef({ kind: 'User', name: id });
+ const ent = [sub, stringifyEntityRef({ kind: 'Group', name: 'team-name' });
+ return ctx.issueToken({ claims: { sub, ent } });
},
},
}),
@@ -91,23 +90,8 @@ sign-in mechanism to poll that endpoint through the IAP, on the user's behalf.
## Frontend Changes
-All Backstage apps need a `SignInPage` to be configured. Its purpose is to
-establish who the user is and what their identifying credentials are, blocking
-rendering the rest of the UI until that's complete, and then keeping those
-credentials fresh.
-
-When using IAP Proxy authentication, the Backstage UI will only be loaded once
-the user has already successfully completely authenticated themselves with the
-IAP and has an active session, so we don't want to make the user have to go
-through a _second_ layer of authentication flows after that.
-
-As such, we want to not display a sign-in page visually at all. Instead, we will
-pick a `SignInPage` implementation component which knows how to silently make
-requests to the backend provider we configured above, and just trusting its
-output to properly represent the current user. Luckily, Backstage comes with a
-component for this purpose out of the box.
-
-Update your `createApp` call in `packages/app/src/App.tsx`, as follows.
+It is recommended to use the `ProxiedSignInPage` for this provider, which is
+installed in `packages/app/src/App.tsx` like this:
```diff
+import { ProxiedSignInPage } from '@backstage/core-components';
@@ -117,5 +101,4 @@ Update your `createApp` call in `packages/app/src/App.tsx`, as follows.
+ SignInPage: props => ,
```
-After this, your app should be ready to leverage the Identity-Aware Proxy for
-authentication!
+See the [Sign-In with Proxy Providers](../index.md#sign-in-with-proxy-providers) section for more information.
diff --git a/docs/auth/identity-resolver.md b/docs/auth/identity-resolver.md
index 6544b0de7b..686c9a9dab 100644
--- a/docs/auth/identity-resolver.md
+++ b/docs/auth/identity-resolver.md
@@ -186,16 +186,59 @@ async ({ profile: { email } }, ctx) => {
const ownershipRefs = getDefaultOwnershipRefs(entity);
// The last step is to issue the token, where we might provide more options in the future.
- const token = ctx.issueToken({
+ return ctx.issueToken({
claims: {
sub: stringifyEntityRef(entity),
ent: ownershipRefs,
},
});
- return { token };
};
```
+## Sign-In without Users in the Catalog
+
+While populating the catalog with organizational data unlocks more powerful ways
+to browse your software ecosystem, it might not always be a viable or prioritized
+option. However, even if you do not have user entities populated in your catalog, you
+can still sign in users. As there are currently no built-in sign-in resolvers for
+this scenario you will need to implement your own.
+
+Signing in a user that doesn't exist in the catalog is as simple as skipping the
+catalog lookup step from the above example. Rather than looking up the user, we
+instead immediately issue a token using whatever information is available. One caveat
+is that it can be tricky to determine the ownership references, although it can
+be achieved for example through a lookup to an external service. You typically
+want to at least use the user itself as a lone ownership reference.
+
+```ts
+import { DEFAULT_NAMESPACE, stringifyEntityRef, } from '@backstage/catalog-model';
+
+// This example only shows the resolver function itself.
+async ({ profile }, ctx) => {
+ if (!profile.email) {
+ throw new Error(
+ 'Login failed, user profile does not contain an email',
+ );
+ }
+ // We again use the local part of the email as the user name.
+ const [localPart] = profile.email.split('@');
+
+ // By using `stringifyEntityRef` we ensure that the reference is formatted correctly
+ const userEntityRef = stringifyEntityRef({
+ kind: 'User',
+ name: localPart,
+ namespace: DEFAULT_NAMESPACE,
+ });
+
+ return ctx.issueToken({
+ claims: {
+ sub: userEntityRef,
+ ent: [userEntityRef],
+ },
+ });
+},
+```
+
## AuthHandler
Similar to a custom sign-in resolver, you can also write a custom auth handler
diff --git a/docs/auth/index.md b/docs/auth/index.md
index 3beae72d0b..c34d244886 100644
--- a/docs/auth/index.md
+++ b/docs/auth/index.md
@@ -21,6 +21,7 @@ Backstage comes with many common authentication providers in the core library:
- [GitHub](github/provider.md)
- [GitLab](gitlab/provider.md)
- [Google](google/provider.md)
+- [Google IAP](google/gcp-iap-auth.md)
- [Okta](okta/provider.md)
- [OneLogin](onelogin/provider.md)
- [OAuth2Proxy](oauth2-proxy/provider.md)
@@ -126,6 +127,64 @@ allows allowing guest access:
bindRoutes({ bind }) {
```
+## Sign-In with Proxy Providers
+
+Some auth providers are so-called "proxy" providers, meaning they're meant to be used
+behind an authentication proxy. Examples of these are
+[AWS ALB](https://github.com/backstage/backstage/blob/master/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md),
+[GCP IAP](./google/gcp-iap-auth.md), and [OAuth2 Proxy](./oauth2-proxy/provider.md).
+
+When using a proxy provider, you'll end up wanting to use a different sign-in page, as
+there is no need for further user interaction once you've signed in towards the proxy.
+All the sign-in page needs to do is to call the `/refresh` endpoint of the auth providers
+to get the existing session, which is exactly what the `ProxiedSignInPage` does. The only
+thing you need to do to configure the `ProxiedSignInPage` is to pass the ID of the provider like this:
+
+```tsx
+const app = createApp({
+ ...,
+ components: {
+ SignInPage: props => ,
+ },
+});
+```
+
+A downside of this method is that it can be cumbersome to set up for local development.
+As a workaround for this, it's possible to dynamically select the sign-in page based on
+what environment the app is running in, and then use a different sign-in method for local
+development, if one is needed at all. Depending on the exact setup, one might choose to
+select the sign-in method based on the `process.env.NODE_ENV` environment variable,
+by checking the `hostname` of the current location, or by accessing the configuration API
+to read a configuration value. For example:
+
+```tsx
+const app = createApp({
+ ...,
+ components: {
+ SignInPage: props => {
+ const configApi = useApi(configApiRef);
+ if (configApi.getString('auth.environment') === 'development') {
+ return (
+
+ );
+ }
+ return ;
+ },
+ },
+});
+```
+
+When using multiple auth providers like this, it's important that you configure the different
+sign-in resolvers so that they resolve to the same identity regardless of the method used.
+
## For Plugin Developers
The Backstage frontend core APIs provide a set of Utility APIs for plugin developers
diff --git a/docs/auth/oauth2-proxy/provider.md b/docs/auth/oauth2-proxy/provider.md
index f366929fe8..966596e268 100644
--- a/docs/auth/oauth2-proxy/provider.md
+++ b/docs/auth/oauth2-proxy/provider.md
@@ -20,86 +20,52 @@ The provider configuration can be added to your `app-config.yaml` under the root
```yaml
auth:
- environment: development
providers:
oauth2proxy: {}
```
-Right now no configuration options are supported. To make use of the provider,
-make sure that your `oauth2-proxy` is configured correctly and provides a custom
-`X-OAUTH2-PROXY-ID-TOKEN` header. To do so, enable the
-`--set-authorization-header=true` of your `oauth2-proxy` and forward the
-`Authorization` header as `X-OAUTH2-PROXY-ID-TOKEN`. For more details check the
-[configuration docs](https://oauth2-proxy.github.io/oauth2-proxy/configuration).
+Right now no configuration options are supported, but the empty object is needed
+to enable the provider in the auth backend.
-_Example for kubernetes ingress:_
+To use the `oauth2proxy` provider you must also configure it with a sign-in resolver.
+For more information about the sign-in process in general, see the
+[Sign-in Identities and Resolvers](../identity-resolver.md) documentation.
-```bash
-# forward the authorization header from the auth request in the X-OAUTH2-PROXY-ID-TOKEN header
-auth_request_set $name_upstream_authorization $upstream_http_authorization;
-proxy_set_header X-OAUTH2-PROXY-ID-TOKEN $name_upstream_authorization;
-```
+For the `oauth2proxy` provider, the sign-in result is quite different than other providers.
+Because it's a proxy provider that can be configured to forward information through
+arbitrary headers, the auth result simply just gives you access to the HTTP headers
+of the incoming request. Using these you can either extract the information directly,
+or grab ID or access tokens to look up additional information and/or validate the request.
-## Adding the provider to the Backstage backend
-
-When using `oauth2proxy` auth you can configure it as described
-[here](https://backstage.io/docs/auth/identity-resolver).
-
-- use the following code below to introduce changes to
- `packages/backend/plugin/auth.ts`:
+A simple sign-in resolver might for example look like this:
```ts
- providerFactories: {
- oauth2proxy: createOauth2ProxyProvider<{
- id: string;
- email: string;
- }>({
- authHandler: async input => {
- const { email } = input.fullProfile;
-
- return {
- profile: {
- email,
- },
- };
- },
- signIn: {
- resolver: async (signInInfo, ctx) => {
- const { preferred_username: id } = signInInfo.result.fullProfile;
- const sub = `user:default/${id}`;
-
- const token = await ctx.tokenIssuer.issueToken({
- claims: { sub, ent: [`group:default/optional-user-group`] },
- });
-
- return { id, token };
- },
- },
- }),
- }
+providers.oauth2Proxy.create({
+ signIn: {
+ async resolver({ result }, ctx) {
+ const name = result.getHeader('x-forwarded-user');
+ if (!name) {
+ throw new Error('Request did not contain a user')
+ }
+ return ctx.signInWithCatalogUser({
+ entityRef: { name },
+ });
+ },
+ },
+}),
```
## Adding the provider to the Backstage frontend
-All Backstage apps need a `SignInPage` to be configured. Its purpose is to
-establish who the user is and what their identifying credentials are, blocking
-rendering the rest of the UI until that's complete, and then keeping those
-credentials fresh.
-
-When using the OAuth2-Proxy, the Backstage UI can only be accessed after the
-user has already been authenticated at the proxy. Instead of showing the user
-another login page when accessing Backstage, it will handle the login in the
-background. Backstage provides for this case the `ProxiedSignInPage` component
-which has no UI.
-
-Update your `createApp` call in `packages/app/src/App.tsx`, as follows.
+It is recommended to use the `ProxiedSignInPage` for this provider, which is
+installed in `packages/app/src/App.tsx` like this:
```diff
+import { ProxiedSignInPage } from '@backstage/core-components';
+
const app = createApp({
components: {
+ SignInPage: props => ,
```
-After this, your app should be ready to leverage the OAuth2-Proxy for
-authentication!
+See the [Sign-In with Proxy Providers](../index.md#sign-in-with-proxy-providers) section for more information.
diff --git a/docs/auth/troubleshooting.md b/docs/auth/troubleshooting.md
new file mode 100644
index 0000000000..657809292a
--- /dev/null
+++ b/docs/auth/troubleshooting.md
@@ -0,0 +1,101 @@
+---
+id: troubleshooting
+title: Troubleshooting Auth
+description: Guidance for various issues that one might run into when setting up authentication
+---
+
+Auth is tricky and doesn't always work as expected. Below you'll find some of the common
+problems one might run into when setting up authentication, as well as some general
+troubleshooting tips.
+
+## Sign-in fails with "... provider is not configured to support sign-in"
+
+This happens if you try to sign in using an auth provider that has not been
+configured to allow sign-in. See the [Sign-in Identities and Resolvers](./identity-resolver.md)
+page for information about how to configure and customize sign-in.
+
+As part of the 1.1 release of Backstage we removed the default implementations
+of all sign-in resolvers. This was a necessary security fix as well as a step
+towards providing more clarity in the configuration of the sign-in process.
+You may encounter this error if you are upgrading from a previous version, in
+which case you would need to configure a sign-in resolver as described above.
+
+## Auth fails with "Auth provider registered for ... is misconfigured"
+
+This will typically only happen during development, as in a production build the auth
+backend will fail to start up altogether if a provider is misconfigured.
+
+Double check that your configuration for the provider is correct. Note that environment variables
+such as `AUTH_OAUTH2_CLIENT_ID` must be set and will **NOT** be picked up from `.env` files.
+You can use the `yarn backstage-cli config:print --lax` command to print your local configuration.
+
+The backend logs should also provide insight into why the configuration of the provider
+fails. In working setup the backend should log something like `"Configuring provider, oauth2"`,
+while it with otherwise log a warning like `"Skipping oauth2 auth provider, ..."`.
+
+## Auth fails with "Login failed; caused by NotAllowedError: Origin '...' is not allowed"
+
+This will happen if the origin of the configured `app.baseUrl` in the auth backend does not
+match the origin that the frontend is being accessed at. Make sure that `app.baseUrl` matches
+what a user sees in the browser address bar.
+
+If you wish to support multiple different origins at once, there is an experimental configuration
+that lets you do this. The `auth.experimentalExtraAllowedOrigins` key accepts a list of origin
+glob patterns where sign-in should be allowed from.
+
+## Sign-in fails with the error "User not found"
+
+Many built-in sign-in resolvers require user entities to be present in the catalog. This
+error is encountered if authentication is successful, but a matching user entity is not
+present in the catalog. If you wish to enable sign-in without having users be represented
+in the catalog data, see the method that's documented in the
+[sign-in resolver documentation](./identity-resolver.md#sign-in-without-users-in-the-catalog).
+
+If you want to customize this error message, you can create a custom sign-in resolver and
+catch the `NotFoundError` thrown by `ctx.signInWithCatalogUser` or `ctx.findCatalogUser`.
+
+## General troubleshooting
+
+This section contains some general troubleshooting tips.
+
+### Stepping through authentication manually
+
+Authentication happens in a popup window that redirects to the identity providers authorization
+endpoint. Once auth is complete the identity provider will redirect back to the auth backend,
+which immediately serves a simple HTML page that posts the result back to the main window, which
+then closes the popup.
+
+Because the popup is closed automatically it can sometimes be difficult to inspect the auth
+flow, especially if one wants to debug the cookies that are being set. One way around this is to
+manually head to the `/start` endpoint of the provider, which is the page that the popup will
+point to initially. For example, if you want to troubleshoot GitHub auth locally, you'd head
+to `http://localhost:7007/api/auth/github/start?env=development`. Note that the `env` parameter
+needs to be set, and it's possible that you may need to set the `scope` parameter for some providers
+as well.
+
+Once you've stepped through the auth flow you should end up at the `/handler/frame` endpoint, which displays
+an empty page. This is where the result is normally posted back to the main window, but since we've
+reached it using the manual flow that won't happen. You can still inspect the result though, both
+by viewing the source code of the page, or printing the value of the `authResponse` variable in the console.
+
+### Inspecting the refresh call
+
+If you're running into problems with session persistence, such as users being signed out when reloading
+the page, it will be something that's going wrong with the call to the `/refresh` endpoint of the
+auth provider. Head to the network inspector and filter by `/refresh`. Find the `GET` request towards
+`/api/auth//refresh` and inspect the request.
+
+Note that extra calls to the refresh endpoint may be made by the frontend in order to check whether
+auth providers have an existing session. This means that there might be multiple calls, including some
+that are failing. Make sure you're looking at the refresh call to the provider that you're troubleshooting,
+and don't worry about other failing refresh calls.
+
+### Inspecting the contents of a Backstage token
+
+The Backstage token that's issues during sign-in is a plain JWT. You can inspect the contents using
+any tool that supports JWTs, or you can parse the payload yourself in for example the browser console
+or a Node.js REPL:
+
+```js
+atob(token.split('.')[1]);
+```
diff --git a/docs/conf/writing.md b/docs/conf/writing.md
index a4da1e3df0..aef9620373 100644
--- a/docs/conf/writing.md
+++ b/docs/conf/writing.md
@@ -161,7 +161,7 @@ $file: ./my-secret.txt
The `$include` keyword can be used to load configuration values from an external
file. It's able to load and parse data from `.json`, `.yml`, and `.yaml` files.
-It's also possible to include a url fragment (`#`) to point to a value at the
+It's also possible to include a URL fragment (`#`) to point to a value at the
given path in the file, using a dot-separated list of keys.
For example, the following would read `my-secret-key` from `my-secrets.json`:
diff --git a/docs/deployment/docker.md b/docs/deployment/docker.md
index 01bc6279f2..6471ada7f2 100644
--- a/docs/deployment/docker.md
+++ b/docs/deployment/docker.md
@@ -96,8 +96,8 @@ root of the repo to speed up the build by reducing build context size:
```text
.git
node_modules
-packages
-!packages/backend/dist
+packages/*/src
+packages/*/node_modules
plugins
```
diff --git a/docs/features/search/getting-started.md b/docs/features/search/getting-started.md
index 1557a29b53..66540bd096 100644
--- a/docs/features/search/getting-started.md
+++ b/docs/features/search/getting-started.md
@@ -149,7 +149,6 @@ import {
import { PluginEnvironment } from '../types';
import { DefaultCatalogCollator } from '@backstage/plugin-catalog-backend';
import { Router } from 'express';
-import { Duration } from 'luxon';
export default async function createPlugin(
env: PluginEnvironment,
@@ -163,9 +162,9 @@ export default async function createPlugin(
});
const every10MinutesSchedule = env.scheduler.createScheduledTaskRunner({
- frequency: Duration.fromObject({ minutes: 10 }),
- timeout: Duration.fromObject({ minutes: 15 }),
- initialDelay: Duration.fromObject({ seconds: 3 }),
+ frequency: { minutes: 10 },
+ timeout: { minutes: 15 },
+ initialDelay: { seconds: 3 },
});
indexBuilder.addCollator({
@@ -294,20 +293,18 @@ which are responsible for providing documents
number of collators with the `IndexBuilder` like this:
```typescript
-import { Duration } from 'luxon';
-
const indexBuilder = new IndexBuilder({ logger: env.logger, searchEngine });
const every10MinutesSchedule = env.scheduler.createScheduledTaskRunner({
- frequency: Duration.fromObject({ minutes: 10 }),
- timeout: Duration.fromObject({ minutes: 15 }),
- initialDelay: Duration.fromObject({ seconds: 3 }),
+ frequency: { minutes: 10 },
+ timeout: { minutes: 15 },
+ initialDelay: { seconds: 3 },
});
const everyHourSchedule = env.scheduler.createScheduledTaskRunner({
- frequency: Duration.fromObject({ hours: 1 }),
- timeout: Duration.fromObject({ minutes: 90 }),
- initialDelay: Duration.fromObject({ seconds: 3 }),
+ frequency: { hours: 1 },
+ timeout: { minutes: 90 },
+ initialDelay: { seconds: 3 },
});
indexBuilder.addCollator({
@@ -332,9 +329,9 @@ a scheduled `TaskRunner` to pass into the `schedule` value, like this:
```typescript {3}
const every10MinutesSchedule = env.scheduler.createScheduledTaskRunner({
- frequency: Duration.fromObject({ minutes: 10 }),
- timeout: Duration.fromObject({ minutes: 15 }),
- initialDelay: Duration.fromObject({ seconds: 3 }),
+ frequency: { minutes: 10 },
+ timeout: { minutes: 15 },
+ initialDelay: { seconds: 3 },
});
indexBuilder.addCollator({
diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md
index c5f53c905f..d0e0fd95e6 100644
--- a/docs/features/search/how-to-guides.md
+++ b/docs/features/search/how-to-guides.md
@@ -67,11 +67,24 @@ getting started guide.
import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-techdocs-backend';
```
-2. Register the `DefaultTechDocsCollatorFactory` with the IndexBuilder.
+2. If there isn't an existing schedule you'd like to run the collator on, be
+ sure to create it first. Something like...
+
+```typescript
+import { Duration } from 'luxon';
+
+const every10MinutesSchedule = env.scheduler.createScheduledTaskRunner({
+ frequency: Duration.fromObject({ seconds: 600 }),
+ timeout: Duration.fromObject({ seconds: 900 }),
+ initialDelay: Duration.fromObject({ seconds: 3 }),
+});
+```
+
+3. Register the `DefaultTechDocsCollatorFactory` with the IndexBuilder.
```typescript
indexBuilder.addCollator({
- defaultRefreshIntervalSeconds: 600,
+ schedule: every10MinutesSchedule,
factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, {
discovery: env.discovery,
logger: env.logger,
diff --git a/docs/features/software-catalog/external-integrations.md b/docs/features/software-catalog/external-integrations.md
index a344f478d7..d6353d1185 100644
--- a/docs/features/software-catalog/external-integrations.md
+++ b/docs/features/software-catalog/external-integrations.md
@@ -231,7 +231,6 @@ You should now be able to add this class to your backend in
`packages/backend/src/plugins/catalog.ts`:
```diff
-+import { Duration } from 'luxon';
+import { FrobsProvider } from '../path/to/class';
export default async function createPlugin(
@@ -248,8 +247,8 @@ You should now be able to add this class to your backend in
+ await env.scheduler.scheduleTask({
+ id: 'run_frobs_refresh',
+ fn: async () => { await frobs.run(); },
-+ frequency: Duration.fromObject({ minutes: 30 }),
-+ timeout: Duration.fromObject({ minutes: 10 }),
++ frequency: { minutes: 30 },
++ timeout: { minutes: 10 },
+ });
```
diff --git a/docs/features/techdocs/README.md b/docs/features/techdocs/README.md
index 2ac90f791b..c64d0b785d 100644
--- a/docs/features/techdocs/README.md
+++ b/docs/features/techdocs/README.md
@@ -76,17 +76,19 @@ TechDocs packages:
TechDocs promoted to v1.0! To understand how this change affects the package, please check out our [versioning policy](https://backstage.io/docs/overview/versioning-policy).
+**v1.2** 🚧
+
+With the Backstage 1.2 release, we plan to introduce the [TechDocs Addon Framework](https://github.com/backstage/backstage/issues/9636) for augmenting the TechDocs experience at read-time.
+
+In addition to the framework itself, we'll be open sourcing a ` ` addon, helping you to create a feedback loop that drives up documentation quality and fosters a documentation culture at your organization.
+
### **Future work 🔮**
Some of the following items are coming soon and some are potential ideas.
-- [TechDocs Addon Framework](https://github.com/backstage/backstage/issues/9636)
-- Contribute to and deploy from a marketplace of TechDocs Addons
-- Addon: Highlight text and raise an Issue to create a feedback loop to drive up documentation quality
-- Addon: MDX (allows you to use JSX in your Markdown content)
- Better integration with
[Scaffolder V2](https://github.com/backstage/backstage/issues/2771) (e.g. easy to choose and plug documentation template with Software Templates)
-- Static site generator agnostic
+- Static site generator agnostic, including possible support for MDX (allowing you to use JSX in your Markdown content)
- Possible to configure several aspects about TechDocs (e.g. URL, homepage,
theme)
diff --git a/docs/features/techdocs/addons.md b/docs/features/techdocs/addons.md
new file mode 100644
index 0000000000..0fba3b92e3
--- /dev/null
+++ b/docs/features/techdocs/addons.md
@@ -0,0 +1,218 @@
+---
+id: addons
+title: TechDocs Addons
+description: How to find, use, or create TechDocs Addons.
+---
+
+> Note: This page contains documentation for features that have not yet been
+> released on a [main-line version](https://backstage.io/docs/overview/versioning-policy#main-release-line)
+> of Backstage and TechDocs. We plan to make Addons generally available in
+> Backstage v1.2.
+
+## Concepts
+
+TechDocs is a centralized platform for publishing, viewing, and discovering
+technical documentation across an entire organization. It's a solid foundation!
+But it doesn't solve higher-order documentation needs on its own: how do you
+create and reinforce a culture of documentation? How do you build trust in the
+quality of technical documentation?
+
+TechDocs Addons are a mechanism by which you can customize the TechDocs
+experience in order to try and address some of these higher-order needs.
+
+### Addons
+
+An Addon is just a react component. Like any react component, it can retrieve
+and render data using normal Backstage or native hooks, APIs, and components.
+Props can be used to configure its behavior, where appropriate.
+
+### Locations
+
+Addons declare a `location` where they will be rendered. Most locations are
+representative of physical spaces in the TechDocs UI:
+
+- `Header`: For Addons which fill up the header from the right, on the same
+ line as the title.
+- `Subheader`: For Addons that sit below the header but above all content.
+ This is a great location for tooling/configuration of TechDocs display.
+- `PrimarySidebar`: Left of the content, above of the navigation.
+- `SecondarySidebar`: Right of the content, above the table of contents.
+- `Content`: A special location intended for Addons which augment the
+ statically generated content of the documentation itself.
+- `Component`: A [proposed-but-not-yet-implemented](https://github.com/backstage/backstage/issues/11109)
+ virtual location, aimed at simplifying a common type of Addon.
+
+
+
+### Addon Registry
+
+The installation and configuration of Addons happens within a Backstage app's
+frontend. Addons are imported from plugins and added underneath a registry
+component called ``. This registry can be configured for both
+the TechDocs Reader page as well as the Entity docs page.
+
+Addons are rendered in the order in which they are registered.
+
+## Installing and using Addons
+
+Addons can be installed and configured in much the same way as extensions for
+other Backstage plugins: by adding them underneath an extension registry
+component (``) under the route representing the TechDocs Reader
+page in your `App.tsx`:
+
+```tsx
+// packages/app/src/App.tsx
+
+import { TechDocsReaderPage } from '@backstage/plugin-techdocs';
+import { TechDocsAddons } from '@backstage/plugin-techdocs-react/alpha';
+import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib';
+
+// ...
+
+ }>
+
+
+ {/* Other addons can be added here. */}
+
+;
+```
+
+The process for configuring Addons on the documentation tab on the entity page
+is very similar; instead of adding the `` registry under a
+``, you'd add it as a child of ` `:
+
+```tsx
+// packages/app/src/components/catalog/EntityPage.tsx
+
+import { EntityLayout } from '@backstage/plugin-catalog';
+import { EntityTechdocsContent } from '@backstage/plugin-techdocs';
+import { TechDocsAddons } from '@backstage/plugin-techdocs-react/alpha';
+import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib';
+
+// ...
+
+
+
+
+
+ {/* Other addons can be added here. */}
+
+
+ ;
+```
+
+Note that on the entity page, because the Catalog plugin is responsible for the
+page header, TechDocs Addons whose location is `Header` will not be rendered.
+
+## Available Addons
+
+Addons can, in principle, be provided by any plugin! To make it easier to
+discover available Addons, we've compiled a list of them here:
+
+| Addon | Package/Plugin | Description |
+| ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [` `](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.reportissue) | `@backstage/plugin-techdocs-module-addons-contrib` | Allows TechDocs users to select a portion of text on a TechDocs page and open an issue against the repository that contains the documentation, populating the issue description with the selected text according to a configurable template. |
+
+Got an Addon to contribute? Feel free to add a row above!
+
+## Creating an Addon
+
+The simplest Addons are plain old react components that get rendered in
+specific locations within a TechDocs site. To package such a react component as
+an Addon, follow these steps:
+
+1. Write the component in your plugin like any other component
+2. Create, provide, and export the component from your plugin
+
+```ts
+// plugins/your-plugin/src/plugin.ts
+
+import {
+ createTechDocsAddonExtension,
+ TechDocsAddonLocations,
+} from '@backstage/plugin-techdocs-react/alpha';
+import { CatGifComponent, CatGifComponentProps } from './addons';
+
+// ...
+
+// You must "provide" your Addon, just like any extension, via your plugin.
+export const CatGif = yourPlugin.provide(
+ // This function "creates" the Addon given a component and location. If your
+ // component can be configured via props, pass the prop type here too.
+ createTechDocsAddonExtension({
+ name: 'CatGif',
+ location: TechDocsAddonLocations.Header,
+ component: CatGifComponent,
+ }),
+);
+```
+
+### Addons in the Content location
+
+Beyond the "render a component in a region" use-case, it's also possible for
+Addons to access and manipulate a TechDocs site's DOM; this could be used to,
+for example, load and instantiate client-side diagramming libraries, replace
+elements with dynamically loaded content, etc.
+
+This type of Addon is still expressed as a react component, but instead of
+returning a react element to be rendered, it updates the DOM via side-effects
+(e.g. with `useEffect`). Access to the DOM is made available via utility hooks
+provided by the Addon framework.
+
+```tsx
+// plugins/your-plugin/src/addons/MakeAllImagesCatGifs.tsx
+
+import React, { useEffect } from 'react';
+import { useShadowRootElements } from '@backstage/plugin-techdocs-react/alpha';
+
+// This is a normal react component; in order to make it an Addon, you would
+// still create and provide it via your plugin as described above. The only
+// difference is that you'd set `location` to `TechDocsAddonLocations.Content`.
+export const MakeAllImagesCatGifsAddon = () => {
+ // This hook can be used to get references to specific elements. If you need
+ // access to the whole shadow DOM, use the the underlying useShadowRoot()
+ // hook instead.
+ const images = useShadowRootElements(['img']);
+
+ useEffect(() => {
+ images.forEach(img => {
+ if (img.src !== 'https://example.com/cat.gif') {
+ img.src = 'https://example.com/cat.gif';
+ }
+ });
+ }, [images]);
+
+ // Nothing to render directly, so we can just return null.
+ return null;
+};
+```
+
+### Testing Addons
+
+Install `@backstage/plugin-techdocs-addons-test-utils` as a `devDependency` in
+your plugin for access to utilities that make testing such Addons easier.
+
+A test for the above Addon might look something like this:
+
+```tsx
+// plugins/your-plugin/src/addons/MakeAllImagesCatGifs.test.tsx
+import { TechDocsAddonTester } from '@backstage/plugin-techdocs-addons-test-utils';
+
+// Note: import your actual addon (the one provided by your plugin).
+import { MakeAllImagesCatGifs } from '../plugin.ts';
+
+describe('MakeAllImagesCatGifs', () => {
+ it('replaces img srcs with cat gif', async () => {
+ const { getByTestId } = await TechDocsAddonTester.buildAddonsInTechDocs([
+ ,
+ ])
+ .withDom( )
+ .renderWithEffects();
+
+ expect(getByTestId('fixture')).toHaveAttribute(
+ 'src',
+ 'https://example.com/cat.gif',
+ );
+ });
+});
+```
diff --git a/docs/features/techdocs/concepts.md b/docs/features/techdocs/concepts.md
index e34f58bc70..2944197dfb 100644
--- a/docs/features/techdocs/concepts.md
+++ b/docs/features/techdocs/concepts.md
@@ -18,8 +18,8 @@ GitLab, etc.) and passes the files to the generator for next steps.
There are two kinds of preparers available -
-1. Common Git Preparer - Uses `git clone` on any repository url.
-2. Url Reader - Uses source code hosting provider's API to download files.
+1. Common Git Preparer - Uses `git clone` on any repository URL.
+2. URL Reader - Uses source code hosting provider's API to download files.
(Faster and recommended)
### TechDocs Generator
@@ -96,10 +96,6 @@ Documentation generated by TechDocs is generated as static HTML sites. The
TechDocs Reader was therefore created to be able to integrate pre-generated HTML
sites with the Backstage UI.
-The TechDocs Reader purpose is also to open up the opportunity to integrate
-TechDocs widgets for a customized full-featured TechDocs experience.
-([coming soon V.3](./README.md#project-roadmap))
-
[TechDocs Reader](https://github.com/backstage/backstage/blob/master/plugins/techdocs/src/reader/README.md)
## Transformers
@@ -110,3 +106,19 @@ transform the HTML content on pre and post render (e.g. rewrite docs links or
modify css).
[Transformers API docs](https://github.com/backstage/backstage/blob/master/plugins/techdocs/src/reader/README.md)
+
+## TechDocs Addons
+
+Addons (introduced in Backstage v1.2) are client-side, React-based extensions
+that can be used to augment the TechDocs experience at read-time. They offer a
+mechanism for configuring the TechDocs Reader to better suit your
+organization's needs.
+
+Addons can dynamically load and display information anywhere in the TechDocs
+Reader, including within the statically generated content itself.
+
+Addons should not be confused with `mkdocs` plugins, which may be used to
+customize a TechDocs site's content at build-time. While it's possible to take
+advantage of some `mkdocs` plugins, not all such plugins play well with
+TechDocs (primarily, but not exclusively, for security reasons). Addons offer
+an alternative.
diff --git a/docs/features/techdocs/using-cloud-storage.md b/docs/features/techdocs/using-cloud-storage.md
index 66eaf00663..5a53961e81 100644
--- a/docs/features/techdocs/using-cloud-storage.md
+++ b/docs/features/techdocs/using-cloud-storage.md
@@ -461,7 +461,7 @@ Since the new SDK doesn't use the old way authentication, we don't need the keys
The new SDK needs the OpenStack Swift connection URL for connecting the Swift.
So you need to add a new key called `openStackSwift.swiftUrl` and give the
-OpenStack Swift url here. Example url should look like that:
+OpenStack Swift URL here. Example URL should look like that:
`https://example.com:6780/swift/v1`
##### That's it!
diff --git a/docs/getting-started/project-structure.md b/docs/getting-started/project-structure.md
index b67e847272..cbe84db2e0 100644
--- a/docs/getting-started/project-structure.md
+++ b/docs/getting-started/project-structure.md
@@ -24,7 +24,7 @@ the code.
- [`.github/`](https://github.com/backstage/backstage/tree/master/.github) -
Standard GitHub folder. It contains - amongst other things - our workflow
definitions and templates. Worth noting is the
- [styles](https://github.com/backstage/backstage/tree/master/.github/styles)
+ [vale](https://github.com/backstage/backstage/tree/master/.github/vale)
sub-folder which is used for a markdown spellchecker.
- [`.yarn/`](https://github.com/backstage/backstage/tree/master/.yarn) -
@@ -212,9 +212,6 @@ future.
common for companies to have their own npm registry, and this file makes sure
that this folder always uses the public registry.
-- [`.vale.ini`](https://github.com/backstage/backstage/tree/master/.vale.ini) -
- [Spell checker](https://github.com/errata-ai/vale) for Markdown files.
-
- [`.yarnrc`](https://github.com/backstage/backstage/tree/master/.yarnrc) -
Enforces "our" version of Yarn.
diff --git a/docs/integrations/aws-s3/discovery.md b/docs/integrations/aws-s3/discovery.md
index 316b5c5014..5091b4057b 100644
--- a/docs/integrations/aws-s3/discovery.md
+++ b/docs/integrations/aws-s3/discovery.md
@@ -70,8 +70,8 @@ builder.addEntityProvider(
...AwsS3EntityProvider.fromConfig(env.config, {
logger: env.logger,
schedule: env.scheduler.createScheduledTaskRunner({
- frequency: Duration.fromObject({ minutes: 30 }),
- timeout: Duration.fromObject({ minutes: 3 }),
+ frequency: { minutes: 30 },
+ timeout: { minutes: 3 },
}),
}),
);
diff --git a/docs/integrations/gerrit/discovery.md b/docs/integrations/gerrit/discovery.md
index 5cd1f6204b..b801f7b77a 100644
--- a/docs/integrations/gerrit/discovery.md
+++ b/docs/integrations/gerrit/discovery.md
@@ -33,8 +33,8 @@ builder.addEntityProvider(
...GerritEntityProvider.fromConfig(env.config, {
logger: env.logger,
schedule: env.scheduler.createScheduledTaskRunner({
- frequency: Duration.fromObject({ minutes: 30 }),
- timeout: Duration.fromObject({ minutes: 3 }),
+ frequency: { minutes: 30 },
+ timeout: { minutes: 3 },
}),
}),
);
diff --git a/docs/integrations/gerrit/locations.md b/docs/integrations/gerrit/locations.md
index dcbac65849..9bff2385e3 100644
--- a/docs/integrations/gerrit/locations.md
+++ b/docs/integrations/gerrit/locations.md
@@ -34,9 +34,9 @@ a structure with up to six elements:
- `baseUrl` (optional): Needed if the Gerrit instance is not reachable at
the base of the `host` option (e.g. `https://gerrit.company.com`) set the
address here. This is the address that you would open in a browser.
-- `cloneUrl` (optional): The base url for HTTP clones. Will default to `baseUrl` if
+- `cloneUrl` (optional): The base URL for HTTP clones. Will default to `baseUrl` if
not set. The address used to clone a repo is the `cloneUrl` plus the repo name.
-- `gitilesBaseUrl` (optional): This is needed for creating a valid user-friendly url
+- `gitilesBaseUrl` (optional): This is needed for creating a valid user-friendly URL
that can be used for browsing the content of the provider. If not set a default
value will be created in the same way as the "baseUrl" option. There is no
requirement to have Gitiles for the Backstage Gerrit integration but without it
diff --git a/docs/integrations/github/org.md b/docs/integrations/github/org.md
index 0460b1adbc..5482733a58 100644
--- a/docs/integrations/github/org.md
+++ b/docs/integrations/github/org.md
@@ -19,22 +19,72 @@ entities that mirror your org setup.
## Installation
-See the [discovery](discovery.md) article for installation instructions.
+This guide will use the Entity Provider method. If you for some reason prefer
+the Processor method (not recommended), it is described separately below.
+
+The provider is not installed by default, therefore you have to add a dependency
+to `@backstage/plugin-catalog-backend-module-github` to your backend package.
+
+```bash
+# From your Backstage root directory
+yarn add --cwd packages/backend @backstage/plugin-catalog-backend-module-github
+```
+
+> Note: When configuring to use a Provider instead of a Processor you do not
+> need to add a _location_ pointing to your GitHub server/organization
+
+Update the catalog plugin initialization in your backend to add the provider and
+schedule it:
+
+```diff
+ // packages/backend/src/plugins/catalog.ts
++import { GitHubOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-github';
+
+ export default async function createPlugin(
+ env: PluginEnvironment,
+ ): Promise {
+ const builder = await CatalogBuilder.create(env);
+
++ // The org URL below needs to match a configured integrations.github entry
++ // specified in your app-config.
++ builder.addEntityProvider(
++ GitHubOrgEntityProvider.fromConfig(env.config, {
++ id: 'production',
++ orgUrl: 'https://github.com/backstage',
++ logger: env.logger,
++ schedule: env.scheduler.createScheduledTaskRunner({
++ frequency: { minutes: 60 },
++ timeout: { minutes: 15 },
++ }),
++ }),
++ );
+```
## Configuration
-The following configuration enables an import of the teams and users under the
-org `https://github.com/my-org-name` on public GitHub.
+As mentioned above, you also must have some configuration in your app-config
+that describes the targets that you want to import. This lets the entity
+provider know what authorization to use, and what the API endpoints are. You may
+or may not have such an entry already added since before:
```yaml
-catalog:
- locations:
- - type: github-org
- target: https://github.com/my-org-name
- rules:
- - allow: [User, Group]
+integrations:
+ github:
+ # example for public github
+ - host: github.com
+ token: ${GITHUB_TOKEN}
+ # example for a private GitHub Enterprise instance
+ - host: ghe.example.net
+ apiBaseUrl: https://ghe.example.net/api/v3
+ token: ${GHE_TOKEN}
```
+These examples use `${}` placeholders to reference environment variables. This
+is often suitable for production setups, but also means that you will have to
+supply those variables to the backend as it starts up. If you want, for local
+development in particular, you can experiment first by putting the actual tokens
+in a mirrored config directly in your `app-config.local.yaml` as well.
+
If Backstage is configured to use GitHub Apps authentication you must grant
`Read-Only` access for `Members` under `Organization` in order to ingest users
correctly. You can modify the app's permissions under the organization settings,
@@ -47,11 +97,50 @@ that must be approved first before the changes are applied.**

-Locations point out the specific org(s) you want to import. The `type` of these
-locations must be `github-org`, and the `target` must point to the exact URL of
-some organization. You can have several such location entries if needed.
+## Using a Processor instead of a Provider
-The authorization for loading org information comes from a configured
-[GitHub integration](locations.md#configuration). When using a personal access
-token, the token needs to have at least the scopes `read:org`, `read:user`, and
-`user:email` in the given `target`.
+An alternative to using the Provider for ingesting organizational entities is to
+use a Processor. This is the old way that's based on registering locations with
+the proper type and target, triggering the processor to run.
+
+The drawback of this method is that it will leave orphaned Group/User entities
+whenever they are deleted on your GitHub server, and you cannot control the
+frequency with which they are refreshed, separately from other processors.
+
+### Processor Installation
+
+The `GithubOrgReaderProcessor` is not registered by default, so you have to
+install and register it in the catalog plugin:
+
+```bash
+# From your Backstage root directory
+yarn add --cwd packages/backend @backstage/plugin-catalog-backend-module-github
+```
+
+```typescript
+// packages/backend/src/plugins/catalog.ts
+import { GithubOrgReaderProcessor } from '@backstage/plugin-catalog-backend-module-github';
+// ...
+builder.addProcessor(
+ GithubOrgReaderProcessor.fromConfig(env.config, { logger: env.logger }),
+);
+```
+
+### Processor Configuration
+
+The integration section of your app-config needs to be set up in the same way as
+for the Entity Provider - see above.
+
+In addition to that, you typically want to add a few static locations to your
+app-config, which reference your organizations to import. The following
+configuration enables an import of the teams and users under the org
+`https://github.com/my-org-name` on public GitHub.
+
+```yaml
+catalog:
+ locations:
+ - type: github-org
+ target: https://github.com/my-org-name
+ rules:
+ - allow: [User, Group]
+```
diff --git a/docs/integrations/google-cloud-storage/locations.md b/docs/integrations/google-cloud-storage/locations.md
index 16e19ea350..e15cb6346c 100644
--- a/docs/integrations/google-cloud-storage/locations.md
+++ b/docs/integrations/google-cloud-storage/locations.md
@@ -48,7 +48,7 @@ you can check [this documentation page][google gcs docs].
To use this integration to import entities from a GCS bucket go to the Google
console and browse the file you would like to import. Then copy the
`Authenticated URL` and paste it into the text box in the `register component`
-form. This url should look like
+form. This URL should look like
`https://storage.cloud.google.com///catalog-info.yaml`.
[google gcs docs]: https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-nodejs
diff --git a/docs/integrations/ldap/org.md b/docs/integrations/ldap/org.md
index 355bd04227..e7028f34f1 100644
--- a/docs/integrations/ldap/org.md
+++ b/docs/integrations/ldap/org.md
@@ -49,8 +49,8 @@ schedule it:
+ target: 'ldaps://ds.example.net',
+ logger: env.logger,
+ schedule: env.scheduler.createScheduledTaskRunner({
-+ frequency: Duration.fromObject({ minutes: 60 }),
-+ timeout: Duration.fromObject({ minutes: 15 }),
++ frequency: { minutes: 60 },
++ timeout: { minutes: 15 },
+ }),
+ }),
+ );
diff --git a/docs/permission/concepts.md b/docs/permission/concepts.md
new file mode 100644
index 0000000000..e7d65b3583
--- /dev/null
+++ b/docs/permission/concepts.md
@@ -0,0 +1,25 @@
+---
+id: concepts
+title: Concepts
+description: A list of important permission framework concepts
+---
+
+### Permission
+
+Any action that a user performs within Backstage may be represented as a permission. More complex actions, like executing a software template, may require authorization for multiple permissions throughout the flow. Permissions are identified by a unique name and optionally include a set of attributes that describe the corresponding action. Plugins are responsible for defining and exposing the permissions they enforce.
+
+### Policy
+
+User permissions are authorized by a central, user-defined permission policy. At a high level, a policy is a function that receives a Backstage user and permission, and returns a decision to allow or deny. Policies are expressed as code, which decouples the framework from any particular authorization model, like role-based access control (RBAC) or attribute-based access control (ABAC).
+
+### Policy decision versus enforcement
+
+Two important responsibilities of any authorization system are to decide if a user can do something, and to enforce that decision. In the Backstage permission framework, policies are responsible for decisions and plugins (typically backends) are responsible for enforcing them.
+
+### Resources and rules
+
+In many cases, a permission represents a user's interaction with another object. This object likely has information that policy authors can use to define more granular access. The permission framework introduces two abstractions to account for this: resources and rules. Resources represent the objects that users interact with. Rules are predicate-based controls that tap into a resource's data. For example, the catalog plugin defines a resource for catalog entities and a rule to check if an entity has a given annotation.
+
+### Conditional decisions
+
+Rules need additional data before they can be used in a decision. For example, the catalog plugin's "has annotation" rule needs to know what annotation to look for on a given entity. Once a rule is bound to relevant information it forms a condition. Conditions are then used to return a conditional decision from a policy. Conditional decisions tell the permission framework to delegate evaluation to the plugin that owns the corresponding resource. Permission requests that result in a conditional decision are allowed if all of the provided conditions evaluate to be true. This conditional behavior avoids coupling between policies and resource schemas, and allows plugins to evaluate complex rules in an efficient way. For example, a plugin may convert a conditional decision to a database query instead of loading and filtering objects in memory.
diff --git a/docs/permission/custom-rules.md b/docs/permission/custom-rules.md
new file mode 100644
index 0000000000..de993d4c44
--- /dev/null
+++ b/docs/permission/custom-rules.md
@@ -0,0 +1,107 @@
+---
+id: custom-rules
+title: Defining custom permission rules
+description: How to define custom permission rules for existing resources
+---
+
+For some use cases, you may want to define custom [rules](./concepts.md#resources-and-rules) in addition to the ones provided by a plugin. In the [previous section](./writing-a-policy.md) we used the `isEntityOwner` rule to control access for catalog entities. Let's extend this policy with a custom rule that checks what [system](https://backstage.io/docs/features/software-catalog/system-model#system) an entity is part of.
+
+## Define a custom rule
+
+Plugins should export a rule factory that provides type-safety that ensures compatibility with the plugin's backend. The catalog plugin exports `createCatalogPermissionRule` from `@backstage/plugin-catalog-backend/alpha` for this purpose. Note: the `/alpha` path segment is temporary until this API is marked as stable. For this example, we'll define the rule in `packages/backend/src/plugins/permission.ts`, but you can put it anywhere that's accessible by your `backend` package.
+
+```typescript
+import type { Entity } from '@backstage/plugin-catalog-model';
+import { createCatalogPermissionRule } from '@backstage/plugin-catalog-backend';
+import { createConditionFactory } from '@backstage/plugin-permission-node';
+
+export const isInSystemRule = createCatalogPermissionRule({
+ name: 'IS_IN_SYSTEM',
+ description: 'Checks if an entity is part of the system provided',
+ resourceType: 'catalog-entity',
+ apply: (resource: Entity, systemRef: string) => {
+ if (!resource.relations) {
+ return false;
+ }
+
+ return resource.relations
+ .filter(relation => relation.type === 'partOf')
+ .some(relation => relation.targetRef === systemRef);
+ },
+ toQuery: (systemRef: string) => ({
+ key: 'relations.partOf',
+ value: systemRef,
+ }),
+});
+
+const isInSystem = createConditionFactory(isInSystemRule);
+```
+
+For a more detailed explanation on defining rules, refer to the [documentation for plugin authors](./plugin-authors/03-adding-a-resource-permission-check.md#adding-support-for-conditional-decisions).
+
+## Provide the rule during plugin setup
+
+Now that we have a custom rule defined, we need provide it to the catalog plugin. This step is important because the catalog plugin will use the rule's `toQuery` and `apply` methods while evaluating conditional authorize results. There's no guarantee that the catalog and permission backends are running on the same server, so we must explicitly link the rule to ensure that it's available at runtime.
+
+The api for providing custom rules may differ between plugins, but there should typically be some integration point during the creation of the backend router. For the catalog, this integration point is exposed via `CatalogBuilder.addPermissionRules`.
+
+```typescript
+// packages/backend/src/plugins/catalog.ts
+
+import { isInSystemRule } from './permission';
+
+...
+
+export default async function createPlugin(
+ env: PluginEnvironment,
+): Promise {
+ const builder = await CatalogBuilder.create(env);
+ builder.addPermissionRules(isInSystem);
+ ...
+ return router;
+}
+```
+
+The new rule is now ready for use in a permission policy!
+
+## Use the rule in a policy
+
+Let's bring this all together by extending the example policy from the previous section.
+
+```diff
+// packages/backend/src/plugins/permission.ts
+
++ import { isInSystem } from './catalog';
+
+...
+
+class TestPermissionPolicy implements PermissionPolicy {
+ async handle(
+ request: PolicyQuery,
+ user?: BackstageIdentityResponse,
+ ): Promise {
+ if (isResourcePermission(request.permission, 'catalog-entity')) {
+ return createCatalogConditionalDecision(
+ request.permission,
+- catalogConditions.isEntityOwner(
+- user?.identity.ownershipEntityRefs ?? [],
+- ),
++ {
++ anyOf: [
++ catalogConditions.isEntityOwner(
++ user?.identity.ownershipEntityRefs ?? []
++ ),
++ isInSystem('interviewing')
++ ]
++ }
+ );
+ }
+
+ return { result: AuthorizeResult.ALLOW };
+ }
+```
+
+The updated policy will allow catalog entity resource permissions if any of the following are true:
+
+- User owns the target entity
+- Target entity is part of the `'interviewing'` system
diff --git a/docs/permission/getting-started.md b/docs/permission/getting-started.md
new file mode 100644
index 0000000000..b115b674d6
--- /dev/null
+++ b/docs/permission/getting-started.md
@@ -0,0 +1,157 @@
+---
+id: getting-started
+title: Getting Started
+description: How to get started with the permission framework as an integrator
+---
+
+If you prefer to watch a video instead, you can start with this video introduction:
+
+VIDEO
+
+> Note: This video was recorded in the January 2022 Contributors Session using `@backstage/create-app@0.4.14`. Some aspects of the demo may have changed in later releases.
+
+Backstage integrators control permissions by writing a policy. In general terms, a policy is simply an async function which receives a request to authorize a specific action for a user and (optional) resource, and returns a decision on whether to authorize that permission. Integrators can implement their own policies from scratch, or adopt reusable policies written by others.
+
+## Prerequisites
+
+The permissions framework depends on a few other Backstage systems, which must be set up before we can dive into writing a policy.
+
+### Upgrade to the latest version of Backstage
+
+The permissions framework itself is new to Backstage and still evolving quickly. To ensure your version of Backstage has all the latest permission-related functionality, it’s important to upgrade to the latest version. The [Backstage upgrade helper](https://backstage.github.io/upgrade-helper/) is a great tool to help ensure that you’ve made all the necessary changes during the upgrade!
+
+### Enable backend-to-backend authentication
+
+Backend-to-backend authentication allows Backstage backend code to verify that a given request originates from elsewhere in the Backstage backend. This is useful for tasks like collation of catalog entities in the search index. This type of request shouldn’t be permissioned, so it’s important to configure this feature before trying to use the permissions framework.
+
+To set up backend-to-backend authentication, follow the [backend-to-backend authentication docs](../tutorials/backend-to-backend-auth.md).
+
+### Supply an identity resolver to populate group membership on sign in
+
+**Note**: If you are working off of an existing Backstage instance, you likely already have some form of an identity resolver set up.
+
+Like many other parts of Backstage, the permissions framework relies on information about group membership. This simplifies authoring policies through the use of groups, rather than requiring each user to be listed in the configuration. Group membership is also often useful for conditional permissions, for example allowing permissions to act on an entity to be granted when a user is a member of a group that owns that entity.
+
+[The IdentityResolver docs](../auth/identity-resolver.md) describe the process for resolving group membership on sign in.
+
+## Optionally add cookie-based authentication
+
+Asset requests initiated by the browser will not include a token in the `Authorization` header. If these requests check authorization through the permission framework, as done in plugins like TechDocs, then you'll need to set up cookie-based authentication. Refer to the ["Authenticate API requests"](https://github.com/backstage/backstage/blob/master/contrib/docs/tutorials/authenticate-api-requests.md) tutorial for a demonstration on how to implement this behavior.
+
+## Integrating the permission framework with your Backstage instance
+
+### 1. Set up the permission backend
+
+The permissions framework uses a new `permission-backend` plugin to accept authorization requests from other plugins across your Backstage instance. The Backstage backend does not include this permission backend by default, so you will need to add it:
+
+1. Add `@backstage/plugin-permission-backend` as a dependency of your Backstage backend:
+
+```bash
+$ yarn workspace backend add @backstage/plugin-permission-backend
+```
+
+2. Add the following to a new file, `packages/backend/src/plugins/permission.ts`. This adds the permission-backend router, and configures it with a policy which allows everything.
+
+```typescript
+import { IdentityClient } from '@backstage/plugin-auth-node';
+import { createRouter } from '@backstage/plugin-permission-backend';
+import {
+ AuthorizeResult,
+ PolicyDecision,
+} from '@backstage/plugin-permission-common';
+import { PermissionPolicy } from '@backstage/plugin-permission-node';
+import { Router } from 'express';
+import { PluginEnvironment } from '../types';
+
+class TestPermissionPolicy implements PermissionPolicy {
+ async handle(): Promise {
+ return { result: AuthorizeResult.ALLOW };
+ }
+}
+
+export default async function createPlugin(
+ env: PluginEnvironment,
+): Promise {
+ return await createRouter({
+ config: env.config,
+ logger: env.logger,
+ discovery: env.discovery,
+ policy: new TestPermissionPolicy(),
+ identity: IdentityClient.create({
+ discovery: env.discovery,
+ issuer: await env.discovery.getExternalBaseUrl('auth'),
+ }),
+ });
+}
+```
+
+3. Wire up the permission policy in `packages/backend/src/index.ts`. [The index in the example backend](https://github.com/backstage/backstage/blob/master/packages/backend/src/index.ts) shows how to do this. You’ll need to import the module from the previous step, create a plugin environment, and add the router to the express app:
+
+```diff
+ import proxy from './plugins/proxy';
+ import techdocs from './plugins/techdocs';
+ import search from './plugins/search';
++ import permission from './plugins/permission';
+
+ ...
+
+ const techdocsEnv = useHotMemoize(module, () => createEnv('techdocs'));
+ const searchEnv = useHotMemoize(module, () => createEnv('search'));
+ const appEnv = useHotMemoize(module, () => createEnv('app'));
++ const permissionEnv = useHotMemoize(module, () => createEnv('permission'));
+
+ ...
+
+ apiRouter.use('/techdocs', await techdocs(techdocsEnv));
+ apiRouter.use('/proxy', await proxy(proxyEnv));
+ apiRouter.use('/search', await search(searchEnv));
++ apiRouter.use('/permission', await permission(permissionEnv));
+```
+
+### 2. Enable and test the permissions system
+
+Now that the permission backend is running, it’s time to enable the permissions framework and make sure it’s working properly.
+
+1. Set the property `permission.enabled` to `true` in `app-config.yaml`.
+
+```yaml
+permission:
+ enabled: true
+```
+
+2. Update the PermissionPolicy in `packages/backend/src/plugins/permission.ts` to disable a permission that’s easy for us to test. This policy rejects any attempt to delete a catalog entity:
+
+```diff
+ import { IdentityClient } from '@backstage/plugin-auth-node';
+ import { createRouter } from '@backstage/plugin-permission-backend';
+ import {
+ AuthorizeResult,
+ PolicyDecision,
+ } from '@backstage/plugin-permission-common';
+- import { PermissionPolicy } from '@backstage/plugin-permission-node';
++ import {
++ PermissionPolicy,
++ PolicyQuery,
++ } from '@backstage/plugin-permission-node';
+ import { Router } from 'express';
+ import { PluginEnvironment } from '../types';
+
+ class TestPermissionPolicy implements PermissionPolicy {
+- async handle(): Promise {
++ async handle(request: PolicyQuery): Promise {
++ if (request.permission.name === 'catalog.entity.delete') {
++ return {
++ result: AuthorizeResult.DENY,
++ };
++ }
++
+ return { result: AuthorizeResult.ALLOW };
+ }
+ }
+```
+
+3. Now that you’ve made this change, you should find that the unregister entity menu option on the catalog entity page is disabled.
+
+
+
+Now that the framework is fully configured, you can craft a permission policy that works best for your organization by utilizing a provided authorization method or by [writing your own policy](./writing-a-policy.md)!
diff --git a/docs/permission/overview.md b/docs/permission/overview.md
new file mode 100644
index 0000000000..8e87756faa
--- /dev/null
+++ b/docs/permission/overview.md
@@ -0,0 +1,41 @@
+---
+id: overview
+title: Overview
+description: A high level overview of the Backstage permission framework
+---
+
+[The previous section](../auth/index.md) covered the various _authentication_ methods of Backstage, but Backstage can also _authorize_ specific data, APIs, or interface actions - meaning that Backstage has the ability to enforce rules about what type of access is allowed for a given user of a system.
+
+By default, Backstage endpoints are not protected, and all actions are available to anyone. However, configuring which users can access which resources and actions is a common need for many organizations. The permission framework allows integrators to achieve this through the use of granular permissioning for those resources and actions.
+
+The permission framework was designed with a few key properties in mind:
+
+- Flexibility: the framework allows integrators to configure many different authorization methods. This could include implementations like role-based access control (RBAC), attribute-based access control (ABAC), bespoke logic expressed in code, or integrations with external authorization providers.
+
+- Usability: the permission framework allows integrators to focus on configuring what they care about (the permission policy) by providing all of its moving parts out of the box. It also allows plugin authors to integrate support for permissions in their plugins without having to make any changes in Backstage core.
+
+## How does it work?
+
+- **Plugin authors** can add permission support in their plugins by declaring which resources from their plugins can be placed behind authorization and what types of actions users may take upon those resources.
+
+- **Contributors** can implement and share authorization methods (such as RBAC).
+
+- **Integrators** can author or configure policies that define which users can take certain actions upon which resources.
+
+
+
+1. The user triggers a request to perform some action. The request specifies the authorization details using the permission specified by the plugin (in this case, a resource read action).
+
+ - The action may be triggered by a user interacting with the UI, but it can also be a direct request to the plugin's backend.
+
+2. The plugin backend sends a request to the permission framework's backend with the authorization details.
+
+3. The permission framework's backend delegates the authorization decision to the permission policy, which is specified by the integrator using code, a provided authorization method (such as RBAC), or integrations with external authorization providers.
+
+4. An authorization decision is sent to the plugin from the permission backend.
+
+## How do I get started?
+
+See the "[getting started](./getting-started.md)" permission documentation for Backstage integrators.
+
+If you are a plugin author, see the permission [documentation for plugin authors](plugin-authors/01-setup.md) on how to integrate permissions into your plugin.
diff --git a/docs/permission/plugin-authors/01-setup.md b/docs/permission/plugin-authors/01-setup.md
new file mode 100644
index 0000000000..2f070f603b
--- /dev/null
+++ b/docs/permission/plugin-authors/01-setup.md
@@ -0,0 +1,120 @@
+---
+id: 01-setup
+title: 1. Tutorial setup
+description: How to get started with the permission framework as a plugin author
+---
+
+The following tutorial is designed to help plugin authors add support for permissions to their plugins. We'll add support for permissions to example `todo-list` and `todo-list-backend` plugins, but the process should be similar for other plugins!
+
+The rest of this page is focused on adding the `todo-list` and `todo-list-backend` plugins to your Backstage instance. If you want to add support for permissions to your own plugin instead, feel free to skip to the [next section](./02-adding-a-basic-permission-check.md).
+
+## Setup for the Tutorial
+
+We will use a "Todo list" feature, composed of the `todo-list` and `todo-list-backend` plugins, as well as their dependency, `todo-list-common`.
+
+The source code is available here:
+
+- [todo-list](https://github.com/backstage/backstage/blob/master/plugins/example-todo-list)
+- [todo-list-backend](https://github.com/backstage/backstage/blob/master/plugins/example-todo-list-backend)
+- [todo-list-common](https://github.com/backstage/backstage/blob/master/plugins/example-todo-list-common)
+
+1. Copy-paste the three folders into the plugins folder of your backstage application repository (removing the `example-` prefix from each folder) or run the following script from the root of your backstage application:
+
+ ```bash
+ $ cd $(mktemp -d)
+ git clone --depth 1 --quiet --no-checkout --filter=blob:none https://github.com/backstage/backstage.git .
+ git checkout master -- plugins/example-todo-list/
+ git checkout master -- plugins/example-todo-list-backend/
+ git checkout master -- plugins/example-todo-list-common/
+ for file in plugins/*; do mv "$file" "$OLDPWD/${file/example-todo/todo}"; done
+ cd -
+ ```
+
+ The `plugins` directory of your project should now include `todo-list`, `todo-list-backend`, and `todo-list-common`.
+
+ **Important**: if you are on **Windows**, make sure you have WSL and git installed on your machine before executing the script above.
+
+2. Add these packages as dependencies for your Backstage app:
+
+ ```
+ $ yarn workspace backend add @internal/plugin-todo-list-backend@^1.0.0 @internal/plugin-todo-list-common@^1.0.0
+ $ yarn workspace app add @internal/plugin-todo-list@^1.0.0
+ ```
+
+3. Include the backend and frontend plugin in your application:
+
+ Create a new `packages/backend/src/plugins/todolist.ts` with the following content:
+
+ ```javascript
+ import { IdentityClient } from '@backstage/plugin-auth-node';
+ import { createRouter } from '@internal/plugin-todo-list-backend';
+ import { Router } from 'express';
+ import { PluginEnvironment } from '../types';
+
+ export default async function createPlugin({
+ logger,
+ discovery,
+ }: PluginEnvironment): Promise {
+ return await createRouter({
+ logger,
+ identity: IdentityClient.create({
+ discovery,
+ issuer: await discovery.getExternalBaseUrl('auth'),
+ }),
+ });
+ }
+ ```
+
+ Apply the following changes to `packages/backend/src/index.ts`:
+
+ ```diff
+ import techdocs from './plugins/techdocs';
+ + import todoList from './plugins/todolist';
+ import search from './plugins/search';
+
+ ...
+
+ const searchEnv = useHotMemoize(module, () => createEnv('search'));
+ const appEnv = useHotMemoize(module, () => createEnv('app'));
+ + const todoListEnv = useHotMemoize(module, () => createEnv('todolist'));
+
+ ...
+
+ apiRouter.use('/proxy', await proxy(proxyEnv));
+ apiRouter.use('/search', await search(searchEnv));
+ apiRouter.use('/permission', await permission(permissionEnv));
+ + apiRouter.use('/todolist', await todoList(todoListEnv));
+ // Add backends ABOVE this line; this 404 handler is the catch-all fallback
+ apiRouter.use(notFoundHandler());
+ ```
+
+ Apply the following changes to `packages/app/src/App.tsx`:
+
+ ```diff
+ + import { TodoListPage } from '@internal/plugin-todo-list';
+
+ ...
+
+ }>
+ {searchPage}
+
+ } />
+ + } />
+
+ ```
+
+Now if you start your application you should be able to reach the `/todo-list` page:
+
+
+
+---
+
+## Integrate the new plugin
+
+If you play with the UI, you will notice that it is possible to perform a few actions:
+
+- create a new todo item (`POST /todos`)
+- view todo items (`GET /todos`)
+- edit an existing todo item (`PUT /todos`)
+
+Let's try to bring authorization on top of each one of them.
diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md
new file mode 100644
index 0000000000..c73fe800b4
--- /dev/null
+++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md
@@ -0,0 +1,169 @@
+---
+id: 02-adding-a-basic-permission-check
+title: 2. Adding a basic permission check
+description: Explains how to add a basic permission check to a Backstage plugin
+---
+
+If the outcome of a permission check doesn't need to change for different [resources](../concepts.md#resources-and-rules), you can use a _basic permission check_. For this kind of check, we simply need to define a [permission](../concepts.md#resources-and-rules), and call `authorize` with it.
+
+For this tutorial, we'll use a basic permission check to authorize the `create` endpoint in our todo-backend. This will allow Backstage integrators to control whether each of their users is authorized to create todos by adjusting their [permission policy](../concepts.md#policy).
+
+We'll start by creating a new permission, and then we'll use the permission api to call `authorize` with it during todo creation.
+
+## Creating a new permission
+
+Let's navigate to the file `plugins/todo-list-common/src/permissions.ts` and add our first permission:
+
+```diff
+ import { createPermission } from '@backstage/plugin-permission-common';
+
+- export const tempExamplePermission = createPermission({
+- name: 'temp.example.noop',
+- attributes: {},
++ export const todoListCreate = createPermission({
++ name: 'todo.list.create',
++ attributes: { action: 'create' },
+ });
+```
+
+For this tutorial, we've automatically exported all permissions from this file (see `plugins/todo-list-common/src/index.ts`).
+
+> Note: All permissions authorized by your plugin should be exported from a ["common-library" package](https://backstage.io/docs/local-dev/cli-build-system#package-roles). This allows Backstage integrators to reference them in frontend components and permission policies.
+
+## Authorizing using the new permission
+
+Install the following module:
+
+```
+$ yarn workspace @internal/plugin-todo-list-backend \
+ add @backstage/plugin-permission-common @internal/plugin-todo-list-common
+```
+
+Edit `plugins/todo-list-backend/src/service/router.ts`:
+
+```diff
+...
+
+- import { InputError } from '@backstage/errors';
++ import { InputError, NotAllowedError } from '@backstage/errors';
++ import { PermissionEvaluator, AuthorizeResult } from '@backstage/plugin-permission-common';
++ import { todoListCreate } from '@internal/plugin-todo-list-common';
+
+...
+
+ export interface RouterOptions {
+ logger: Logger;
+ identity: IdentityClient;
++ permissions: PermissionEvaluator;
+ }
+
+ export async function createRouter(
+ options: RouterOptions,
+ ): Promise {
+- const { logger, identity } = options;
++ const { logger, identity, permissions } = options;
+
+ ...
+
+ router.post('/todos', async (req, res) => {
+ const token = IdentityClient.getBearerToken(req.header('authorization'));
+ let author: string | undefined = undefined;
+
+ const user = token ? await identity.authenticate(token) : undefined;
+ author = user?.identity.userEntityRef;
++ const decision = (
++ await permissions.authorize([{ permission: todoListCreate }], {
++ token,
++ })
++ )[0];
+
++ if (decision.result === AuthorizeResult.DENY) {
++ throw new NotAllowedError('Unauthorized');
++ }
+
+ if (!isTodoCreateRequest(req.body)) {
+ throw new InputError('Invalid payload');
+ }
+
+ const todo = add({ title: req.body.title, author });
+ res.json(todo);
+ });
+```
+
+Pass the `permissions` object to the plugin in `packages/backend/src/plugins/todolist.ts`:
+
+```diff
+ import { IdentityClient } from '@backstage/plugin-auth-backend';
+ import { createRouter } from '@internal/plugin-todo-list-backend';
+ import { Router } from 'express';
+ import { PluginEnvironment } from '../types';
+
+ export default async function createPlugin({
+ logger,
+ discovery,
++ permissions,
+ }: PluginEnvironment): Promise {
+ return await createRouter({
+ logger,
+ identity: new IdentityClient({
+ discovery,
+ issuer: await discovery.getExternalBaseUrl('auth'),
+ }),
++ permissions,
+ });
+ }
+```
+
+That's it! Now your plugin is fully configured. Let's try to test the logic by denying the permission.
+
+## Test the authorized create endpoint
+
+Before running this step, please make sure you followed the steps described in [Getting started](../getting-started.md) section.
+
+In order to test the logic above, the integrators of your backstage instance need to change their permission policy to return `DENY` for our newly-created permission:
+
+```diff
+// packages/backend/src/plugins/permission.ts
+
+- import { IdentityClient } from '@backstage/plugin-auth-node';
++ import {
++ BackstageIdentityResponse,
++ IdentityClient
++ } from '@backstage/plugin-auth-node';
+ import {
+ PermissionPolicy,
++ PolicyQuery,
+ } from '@backstage/plugin-permission-node';
++ import { isPermission } from '@backstage/plugin-permission-common';
++ import { todoListCreate } from '@internal/plugin-todo-list-common';
+
+ class TestPermissionPolicy implements PermissionPolicy {
+- async handle(): Promise {
++ async handle(
++ request: PolicyQuery,
++ user?: BackstageIdentityResponse,
++ ): Promise {
++ if (isPermission(request.permission, todoListCreate)) {
++ return {
++ result: AuthorizeResult.DENY,
++ };
++ }
++
+ return {
+ result: AuthorizeResult.ALLOW,
+ };
+ }
+```
+
+Now the frontend should show an error whenever you try to create a new Todo item.
+
+Let's flip the result back to `ALLOW` before moving on.
+
+```diff
+ if (isPermission(request.permission, todoListCreate)) {
+ return {
+- result: AuthorizeResult.DENY,
++ result: AuthorizeResult.ALLOW,
+ };
+ }
+```
diff --git a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md
new file mode 100644
index 0000000000..e818557402
--- /dev/null
+++ b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md
@@ -0,0 +1,229 @@
+---
+id: 03-adding-a-resource-permission-check
+title: 3. Adding a resource permission check
+description: Explains how to add a resource permission check to a Backstage plugin
+---
+
+When performing updates (or other operations) on specific [resources](../concepts.md#resources-and-rules), the permissions framework allows for the decision to be based on characteristics of the resource itself. This means that it's possible to write policies that (for example) allow the operation for users that own a resource, and deny the operation otherwise.
+
+## Creating the update permission
+
+Let's add a new permission to the file `plugins/todo-list-common/src/permissions.ts` from [the previous section](./02-adding-a-basic-permission-check.md).
+
+```diff
+ import { createPermission } from '@backstage/plugin-permission-common';
+
++ export const TODO_LIST_RESOURCE_TYPE = 'todo-item';
++
+ export const todoListCreate = createPermission({
+ name: 'todo.list.create',
+ attributes: { action: 'create' },
+ });
++
++ export const todoListUpdate = createPermission({
++ name: 'todo.list.update',
++ attributes: { action: 'update' },
++ resourceType: TODO_LIST_RESOURCE_TYPE,
++ });
+```
+
+Notice that unlike `todoListCreate`, the `todoListUpdate` permission contains a `resourceType` field. This field indicates to the permission framework that this permission is intended to be authorized in the context of a resource with type `'todo-item'`. You can use whatever string you like as the resource type, as long as you use the same value consistently for each type of resource.
+
+## Setting up authorization for the update permission
+
+To start, let's edit `plugins/todo-list-backend/src/service/router.ts` in the same manner as we did in the previous section:
+
+```diff
+- import { todoListCreate } from '@internal/plugin-todo-list-common';
++ import { todoListCreate, todoListUpdate } from '@internal/plugin-todo-list-common';
+
+ ...
+
+ router.put('/todos', async (req, res) => {
++ const token = getBearerTokenFromAuthorizationHeader(
++ req.header('authorization'),
++ );
+
+ if (!isTodoUpdateRequest(req.body)) {
+ throw new InputError('Invalid payload');
+ }
++ const decision = (
++ await permissions.authorize(
++ [{ permission: todoListUpdate, resourceRef: req.body.id }],
++ {
++ token,
++ },
++ )
++ )[0];
++
++ if (decision.result !== AuthorizeResult.ALLOW) {
++ throw new NotAllowedError('Unauthorized');
++ }
+
+ res.json(update(req.body));
+ });
+```
+
+**Important:** Notice that we are passing an extra `resourceRef` field, with the `id` of the todo item as the value.
+
+This enables decisions based on characteristics of the resource, but it's important to note that policy authors will not have access to the resource ref inside of their permission policies. Instead, the policies will return conditional decisions, which we need to now support in our plugin.
+
+## Adding support for conditional decisions
+
+Install the missing module:
+
+```
+$ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permission-node
+```
+
+Create a new `plugins/todo-list-backend/src/service/rules.ts` file and append the following code:
+
+```typescript
+import { makeCreatePermissionRule } from '@backstage/plugin-permission-node';
+import { TODO_LIST_RESOURCE_TYPE } from '@internal/plugin-todo-list-common';
+import { Todo, TodoFilter } from './todos';
+
+export const createTodoListPermissionRule = makeCreatePermissionRule<
+ Todo,
+ TodoFilter
+>();
+
+export const isOwner = createTodoListPermissionRule({
+ name: 'IS_OWNER',
+ description: 'Should allow only if the todo belongs to the user',
+ resourceType: TODO_LIST_RESOURCE_TYPE,
+ apply: (resource: Todo, userId: string) => {
+ return resource.author === userId;
+ },
+ toQuery: (userId: string) => {
+ return {
+ property: 'author',
+ values: [userId],
+ };
+ },
+});
+
+export const rules = { isOwner };
+```
+
+`makeCreatePermissionRule` is a helper used to ensure that rules created for this plugin use consistent types for the resource and query.
+
+> Note: To support custom rules defined by Backstage integrators, you must export `createTodoListPermissionRule` from the backend package and provide some way for custom rules to be passed in before the backend starts, likely via `createRouter`.
+
+We have created a new `isOwner` rule, which is going to be automatically used by the permission framework whenever a conditional response is returned in response to an authorized request with an attached `resourceRef`.
+Specifically, the `apply` function is used to understand whether the passed resource should be authorized or not.
+
+Let's skip the `toQuery` function for now, we'll come back to that in the next section.
+
+Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/service/router.ts`. This uses the `createPermissionIntegrationRouter` helper to add the APIs needed by the permission framework to your plugin. You'll need to supply:
+
+- `getResources`: a function that accepts an array of `resourceRefs` in the same format you expect to be passed to `authorize`, and returns an array of the corresponding resources.
+- `resourceType`: the same value used in the permission rule above.
+- `rules`: an array of all the permission rules you want to support in conditional decisions.
+
+```diff
+...
+
+- import { add, getAll, update } from './todos';
++ import { add, getAll, getTodo, update } from './todos';
++ import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';
++ import { TODO_LIST_RESOURCE_TYPE } from '@internal/plugin-todo-list-common';
++ import { rules } from './rules';
+
+ export async function createRouter(
+ options: RouterOptions,
+ ): Promise {
+ const { logger, identity, permissions } = options;
+
++ const permissionIntegrationRouter = createPermissionIntegrationRouter({
++ getResources: async resourceRefs => {
++ return resourceRefs.map(getTodo);
++ },
++ resourceType: TODO_LIST_RESOURCE_TYPE,
++ rules: Object.values(rules),
++ });
+
+ const router = Router();
+ router.use(express.json());
+
++ router.use(permissionIntegrationRouter);
+
+ router.post('/todos', async (req, res) => {
+```
+
+## Provide utilities for policy authors
+
+Now that we have a new resource type and a corresponding rule, we need to export some utilities for policy authors to reference them.
+
+Create a new `plugins/todo-list-backend/src/conditionExports.ts` file and add the following code:
+
+```typescript
+import { TODO_LIST_RESOURCE_TYPE } from '@internal/plugin-todo-list-common';
+import { createConditionExports } from '@backstage/plugin-permission-node';
+import { permissionRules } from './service/rules';
+
+const { conditions, createConditionalDecision } = createConditionExports({
+ pluginId: 'catalog',
+ resourceType: RESOURCE_TYPE_CATALOG_ENTITY,
+ rules: permissionRules,
+});
+
+export const todoListConditions = conditions;
+
+export const createTodoListConditionalDecision = createConditionalDecision;
+```
+
+Make sure `todoListConditions` and `createTodoListConditionalDecision` are exported from the `todo-list-backend` package.
+
+## Test the authorized update endpoint
+
+Let's go back to the permission policy's handle function and try to authorize our new permission with an `isOwner` condition.
+
+```diff
+ // packages/backend/src/plugins/permission.ts
+
+ import {
+ BackstageIdentityResponse,
+ IdentityClient
+ } from '@backstage/plugin-auth-node';
+ import {
+ PermissionPolicy,
+ PolicyQuery,
+ } from '@backstage/plugin-permission-node';
+ import { isPermission } from '@backstage/plugin-permission-common';
+- import { todoListCreate } from '@internal/plugin-todo-list-common';
++ import {
++ todoListCreate,
++ todoListUpdate,
++ TODO_LIST_RESOURCE_TYPE,
++ } from '@internal/plugin-todo-list-common';
++ import {
++ todoListConditions,
++ createTodoListConditionalDecision,
++ } from '@internal/plugin-todo-list-backend';
+
+...
+
+ if (isPermission(request.permission, todoListCreate)) {
+ return {
+ result: AuthorizeResult.ALLOW,
+ };
+ }
+
++ if (isPermission(request.permission, todoListUpdate)) {
++ return createTodoListConditionalDecision(
++ request.permission,
++ todoListConditions.isOwner(user?.identity.userEntityRef),
++ );
++ }
++
+ return {
+ result: AuthorizeResult.ALLOW,
+ };
+```
+
+For any incoming update requests, we now return a _Conditional Decision_. We are saying:
+
+> Hey permission framework, I can't make a decision alone. Please go to the plugin with id `todolist` and ask it to apply these conditions.
+
+To check that everything works as expected, you should now see an error in the UI whenever you try to edit an item that wasn’t created by you. Success!
diff --git a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md
new file mode 100644
index 0000000000..582553832b
--- /dev/null
+++ b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md
@@ -0,0 +1,149 @@
+---
+id: 04-authorizing-access-to-paginated-data
+title: 4. Authorizing access to paginated data
+description: Explains how to authorize access to paginated data in a Backstage plugin
+---
+
+Authorizing `GET /todos` is similar to the update endpoint, in that it should be possible to authorize access based on the characteristics of each resource. However, we'll need to authorize a list of resources for this endpoint.
+
+One possible solution may leverage the batching functionality to authorize all of the todos, and then returning only the ones for which the decision was `ALLOW`:
+
+```diff
+ router.get('/todos', async (req, res) => {
++ const token = IdentityClient.getBearerToken(req.header('authorization'));
+
+- res.json(getAll())
++ const items = getAll();
++ const decisions = await permissions.authorize(
++ items.map(({ id }) => ({ permission: todosListRead, resourceRef: id })),
++ );
+
++ const filteredItems = decisions.filter(
++ decision => decision.result === AuthorizeResult.ALLOW,
++ );
++ res.json(filteredItems);
+ });
+```
+
+This approach will work for simple cases, but it has a downside: it forces us to retrieve all the elements upfront and authorize them one by one. This forces the plugin implementation to handle concerns like pagination, which is currently handled by the data source.
+
+To avoid this situation, the permissions framework has support for filtering items in the data source itself. In this part of the tutorial, we'll describe the steps required to use that behavior.
+
+> Note: in order to perform authorization filtering in this way, the data source must allow filters to be logically combined with AND, OR, and NOT operators. The conditional decisions returned by the permissions framework use a [nested object](https://backstage.io/docs/reference/plugin-permission-common.permissioncriteria) to combine conditions. If you're implementing a filter API from scratch, we recommend using the same shape for ease of interoperability. If not, you'll need to implement a function which transforms the nested object into your own format.
+
+## Creating the read permission
+
+Let's add another permission to the plugin.
+
+```diff
+ // plugins/todo-list-backend/src/service/permissions.ts
+
+ import { createPermission } from '@backstage/plugin-permission-common';
+
+ export const TODO_LIST_RESOURCE_TYPE = 'todo-item';
+
+ export const todoListCreate = createPermission({
+ name: 'todo.list.create',
+ attributes: { action: 'create' },
+ });
+
+ export const todoListUpdate = createPermission({
+ name: 'todo.list.update',
+ attributes: { action: 'update' },
+ resourceType: TODO_LIST_RESOURCE_TYPE,
+ });
++
++ export const todosListRead = createPermission({
++ name: 'todos.list.read',
++ attributes: { action: 'read' },
++ resourceType: TODO_LIST_RESOURCE_TYPE,
++ });
+```
+
+## Using conditional policy decisions
+
+So far we've only used the `PermissionEvaluator.authorize` method, which will evaluate conditional decisions before returning a result. In this step, we want to evaluate conditional decisions within our plugin, so we'll use `PermissionEvaluator.authorizeConditional` instead.
+
+```diff
+// plugins/todo-list-backend/src/service/router.ts
+
+- import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';
++ import {
++ createPermissionIntegrationRouter,
++ createConditionTransformer,
++ ConditionTransformer,
++ } from '@backstage/plugin-permission-node';
+- import { add, getAll, getTodo, update } from './todos';
++ import { add, getAll, getTodo, TodoFilter, update } from './todos';
+ import {
+ todosListCreate,
+ todosListUpdate,
++ todosListRead,
+ TODO_LIST_RESOURCE_TYPE,
+ } from './permissions';
++ import { rules } from './rules';
+
++ const transformConditions: ConditionTransformer = createConditionTransformer(Object.values(rules));
+
+- router.get('/todos', async (_req, res) => {
++ router.get('/todos', async (req, res) => {
++ const token = getBearerTokenFromAuthorizationHeader(
++ req.header('authorization'),
++ );
++
++ const decision = (
++ await permissions.authorizeConditional([{ permission: todosListRead }], {
++ token,
++ })
++ )[0];
++
++ if (decision.result === AuthorizeResult.DENY) {
++ throw new NotAllowedError('Unauthorized');
++ }
++
++ if (decision.result === AuthorizeResult.CONDITIONAL) {
++ const filter = transformConditions(decision.conditions);
++ res.json(getAll(filter));
++ } else {
++ res.json(getAll());
++ }
++ }
+- res.json(getAll());
+ });
+```
+
+To make the process of handling conditional decisions easier, the permission framework provides a `createConditionTransformer` helper. This function accepts an array of permission rules, and returns a transformer function which converts the conditions to the format needed by the plugin using the `toQuery` method defined on each rule.
+
+Since `TodoFilter` used in our plugin matches the structure of the conditions object, we can directly pass the output of our condition transformer. If the filters were structured differently, we'd need to transform it further before passing it to the api.
+
+## Test the authorized read endpoint
+
+Let's update our permission policy to return a conditional result whenever a `todosListRead` permission is received. In this case, we can reuse the decision returned for the `todosListCreate` permission.
+
+```diff
+// packages/backend/src/plugins/permission.ts
+
+...
+
+import {
+ todoListCreate,
+ todoListUpdate,
++ todoListRead,
+ TODO_LIST_RESOURCE_TYPE,
+} from '@internal/plugin-todo-list-common';
+
+...
+
+- if (isPermission(request.permission, todoListUpdate)) {
++ if (
++ isPermission(request.permission, todoListUpdate) ||
++ isPermission(request.permission, todoListRead)
++ ) {
+ return createTodoListConditionalDecision(
+ request.permission,
+ todoListConditions.isOwner(user?.identity.userEntityRef),
+ );
+ }
+```
+
+Once the changes to the permission policy are saved, the UI should show only the todo items you've created.
diff --git a/docs/permission/writing-a-policy.md b/docs/permission/writing-a-policy.md
new file mode 100644
index 0000000000..be88aea9c5
--- /dev/null
+++ b/docs/permission/writing-a-policy.md
@@ -0,0 +1,134 @@
+---
+id: writing-a-policy
+title: Writing a permission policy
+description: How to write your own permission policy as a Backstage integrator
+---
+
+In the [previous section](./getting-started.md), we were able to set up the permission framework and make a simple change to our `TestPermissionPolicy` to confirm that policy is indeed wired up correctly.
+
+That policy looked like this:
+
+```typescript
+// packages/backend/src/plugins/permission.ts
+
+class TestPermissionPolicy implements PermissionPolicy {
+ async handle(request: PolicyQuery): Promise {
+ if (request.permission.name === 'catalog.entity.delete') {
+ return {
+ result: AuthorizeResult.DENY,
+ };
+ }
+
+ return { result: AuthorizeResult.ALLOW };
+ }
+}
+```
+
+## What's in a policy?
+
+Let's break this down a bit further. The request object of type [PolicyQuery](https://backstage.io/docs/reference/plugin-permission-node.policyquery) is a simple wrapper around [the Permission object](https://backstage.io/docs/reference/plugin-permission-common.permission). This permission object encapsulates information about the action that the user is attempting to perform (See [the Concepts page](./concepts.md) for more details).
+
+In the policy above, we are checking to see if the provided action is a catalog entity delete action, which is the permission that the catalog plugin authors have created to represent the action of unregistering a catalog entity. If this is the case, we return a [Definitive Policy Decision](https://backstage.io/docs/reference/plugin-permission-common.definitivepolicydecision) of DENY. In all other cases, we return ALLOW (resulting in an allow-by-default behavior).
+
+As we confirmed in the previous section, we know that this now prevents us from unregistering catalog components. Hooray! But you may notice that this prevents _anyone_ from unregistering a component, which is not a very realistic policy. Let's improve this policy by disabling the unregister action _unless you are the owner of this component_.
+
+## Conditional decisions
+
+Let's change the policy to the following:
+
+```diff
+- import { IdentityClient } from '@backstage/plugin-auth-node';
++ import {
++ BackstageIdentityResponse,
++ IdentityClient
++ } from '@backstage/plugin-auth-node';
+ import {
+ AuthorizeResult,
+ PolicyDecision,
++ isPermission,
+} from '@backstage/plugin-permission-common';
++ import {
++ catalogConditions,
++ createCatalogConditionalDecision,
++ } from '@backstage/plugin-catalog-backend';
++ import {
++ catalogEntityDeletePermission,
++ } from '@backstage/plugin-catalog-common';
+
+ ...
+
+ class TestPermissionPolicy implements PermissionPolicy {
+- async handle(request: PolicyQuery): Promise {
++ async handle(
++ request: PolicyQuery,
++ user?: BackstageIdentityResponse,
++ ): Promise {
+- if (request.permission.name === 'catalog.entity.delete') {
++ if (isPermission(request.permission, catalogEntityDeletePermission)) {
+- return {
+- result: AuthorizeResult.DENY,
+- };
++ return createCatalogConditionalDecision(
++ request.permission,
++ catalogConditions.isEntityOwner(
++ user?.identity.ownershipEntityRefs ?? [],
++ ),
++ );
+ }
+
+ return { result: AuthorizeResult.ALLOW };
+ }
+ }
+```
+
+Let's walk through the new code that we just added.
+
+Instead of returning an Definitive Policy Decision, we use factory methods to construct a [Conditional Policy Decision](https://backstage.io/docs/reference/plugin-permission-common.conditionalpolicydecision) (See the [Concepts page](./concepts.md) for more details). Since the policy doesn't have enough information to determine if `user` is the entity owner, this criteria is encapsulated within the conditional decision. However, `createCatalogConditionalDecision` will not compile unless `request.permission` is a catalog entity [`ResourcePermission`](https://backstage.io/docs/reference/plugin-permission-common.resourcepermission). This type constraint ensures that policies return conditional decisions that are compatible with the requested permission. To address this, we use [`isPermission`](https://backstage.io/docs/reference/plugin-permission-common.ispermission) to ["narrow"](https://www.typescriptlang.org/docs/handbook/2/narrowing.html) the type of `request.permission` to `ResourcePermission<'catalog-entity'>`. This matches the runtime behavior that was in place before, but you'll notice that the type of `request.permission` has changed within the scope of that `if` statement.
+
+The `catalogConditions` object contains all of the rules defined by the catalog plugin. These rules can be combined to form a [`PermissionCriteria`](https://backstage.io/docs/reference/plugin-permission-common.permissioncriteria) object, but for this case we only need to use the `isEntityOwner` rule. This rule accepts a list of entity refs that represent User identity and Group membership used to determine ownership. The second argument to `PermissionPolicy#handle` provides us with a `BackstageIdentityResponse` object, from which we can grab the user's `ownershipEntityRefs`. We provide an empty array as a fallback since the user may be anonymous.
+
+You should now be able to see in your Backstage app that the unregister entity button is enabled for entities that you own, but disabled for all other entities!
+
+## Resource types
+
+Now let's say we want to prevent all actions on catalog entities unless performed by the owner. One way to achieve this may be to simply update the `if` statement and check for each permission. If you choose to write your policy this way, it will certainly work! However, it may be difficult to maintain as the policy grows, and it may not be obvious if certain permissions are left out. We can author this same policy in a more scalable way by checking the resource type of the requested permission.
+
+```diff
+import {
+ AuthorizeResult,
+ PolicyDecision,
+- isPermission,
++ isResourcePermission,
+} from '@backstage/plugin-permission-common';
+ import {
+ catalogConditions,
+ createCatalogConditionalDecision,
+ } from '@backstage/plugin-catalog-backend';
+- import {
+- catalogEntityDeletePermission,
+- } from '@backstage/plugin-catalog-common';
+
+...
+
+class TestPermissionPolicy implements PermissionPolicy {
+ async handle(
+ request: PolicyQuery,
+ user?: BackstageIdentityResponse,
+ ): Promise {
+- if (isPermission(request.permission, catalogEntityDeletePermission)) {
++ if (isResourcePermission(request.permission, 'catalog-entity')) {
+ return createCatalogConditionalDecision(
+ request.permission,
+ catalogConditions.isEntityOwner(
+ user?.identity.ownershipEntityRefs ?? [],
+ ),
+ );
+ }
+
+ return { result: AuthorizeResult.ALLOW };
+ }
+```
+
+In this example, we use [`isResourcePermission`](https://backstage.io/docs/reference/plugin-permission-common.isresourcepermission) to match all permissions with a resource type of `catalog-entity`. Just like `isPermission`, this helper will "narrow" the type of `request.permission` and enable the use of `createCatalogConditionalDecision`. In addition to the behavior you observed before, you should also see that catalog entities are no longer visible unless you are the owner - success!
+
+_Note:_ Some catalog permissions do not have the `'catalog-entity'` resource type, such as [`catalogEntityCreatePermission`](https://github.com/backstage/backstage/blob/1e5e9fb9de9856a49e60fc70c38a4e4e94c69570/plugins/catalog-common/src/permissions.ts#L49). In those cases, a definitive decision is required because conditions can't be applied to an entity that does not exist yet.
diff --git a/docs/releases/v1.2.0-next.1-changelog.md b/docs/releases/v1.2.0-next.1-changelog.md
new file mode 100644
index 0000000000..d7b843be48
--- /dev/null
+++ b/docs/releases/v1.2.0-next.1-changelog.md
@@ -0,0 +1,956 @@
+# Release v1.2.0-next.1
+
+## @backstage/test-utils@1.1.0-next.1
+
+### Minor Changes
+
+- 1da8b248c2: Added the options parameter to `renderWithEffects`, which if forwarded to the `render` function from `@testling-library/react`. Initially only the `wrapper` option is supported.
+- 1da8b248c2: Added `createTestAppWrapper`, which returns a component that can be used as the `wrapper` option for `render` or `renderWithEffects`.
+
+### Patch Changes
+
+- 1da8b248c2: Fixed `renderInTestApp` so that it is able to re-render the result without removing the app wrapping.
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/core-app-api@1.0.2-next.0
+ - @backstage/plugin-permission-react@0.4.1-next.0
+
+## @backstage/plugin-adr@0.1.0-next.0
+
+### Minor Changes
+
+- e73075a301: Implement ADR plugin
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/plugin-adr-common@0.1.0-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/integration-react@1.1.0-next.1
+
+## @backstage/plugin-adr-backend@0.1.0-next.0
+
+### Minor Changes
+
+- e73075a301: Implement ADR plugin
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-adr-common@0.1.0-next.0
+ - @backstage/backend-common@0.13.3-next.1
+
+## @backstage/plugin-adr-common@0.1.0-next.0
+
+### Minor Changes
+
+- e73075a301: Implement ADR plugin
+
+## @backstage/plugin-search-react@0.2.0-next.1
+
+### Minor Changes
+
+- bdbe620797: **BREAKING**: `SearchContextProviderForStorybook` and `SearchApiProviderForStorybook` has been deleted. New mock implementation of the `SearchApi` introduced. If you need to mock the api we recommend you to do the following:
+
+ ```tsx
+ import {
+ searchApiRef,
+ MockSearchApi,
+ SearchContextProvider,
+ } from '@backstage/plugin-search-react';
+ import { TestApiProvider } from '@backstage/test-utils';
+
+
+
+
+
+ ;
+ ```
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-tech-insights-backend@0.4.0-next.1
+
+### Minor Changes
+
+- 3333e20b27: **BREAKING**: The `buildTechInsightsContext` function now takes an additional
+ field in its options argument: `tokenManager`. This is an instance of
+ `TokenManager`, which can be found in your backend initialization code's
+ `env`.
+
+ ```diff
+ const builder = buildTechInsightsContext({
+ logger: env.logger,
+ config: env.config,
+ database: env.database,
+ discovery: env.discovery,
+ scheduler: env.scheduler,
+ + tokenManager: env.tokenManager,
+ factRetrievers: [ /* ... */ ],
+ });
+ ```
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+ - @backstage/plugin-tech-insights-node@0.3.0-next.1
+
+## @backstage/plugin-tech-insights-node@0.3.0-next.1
+
+### Minor Changes
+
+- 58e2c46151: **BREAKING**: The `FactRetrieverContext` type now contains an additional
+ field: `tokenManager`.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+
+## @backstage/plugin-techdocs-addons-test-utils@0.1.0-next.0
+
+### Minor Changes
+
+- 52fddad92d: Introducing a package with utilities to help test TechDocs Addons.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/test-utils@1.1.0-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog@1.2.0-next.1
+ - @backstage/plugin-search-react@0.2.0-next.1
+ - @backstage/plugin-techdocs-react@0.1.1-next.1
+ - @backstage/plugin-techdocs@1.1.1-next.1
+ - @backstage/integration-react@1.1.0-next.1
+ - @backstage/core-app-api@1.0.2-next.0
+
+## @backstage/app-defaults@1.0.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/core-app-api@1.0.2-next.0
+ - @backstage/plugin-permission-react@0.4.1-next.0
+
+## @backstage/backend-common@0.13.3-next.1
+
+### Patch Changes
+
+- 28b0e4ddef: Update types to match the new version of `@keyv/redis`
+
+## @backstage/cli@0.17.1-next.1
+
+### Patch Changes
+
+- 52fb9920ac: Fixed coverage configuration when using `BACKSTAGE_NEXT_TESTS`.
+- 6cd1f50ae1: Extended lint rule to prevents imports of stories or tests from production code.
+- 4d8736eded: Changed Rollup configuration for TypeScript definition plugin to ignore `css`,
+ `scss`, `sass`, `svg`, `eot`, `woff`, `woff2` and `ttf` files.
+- 2737777e02: Added the ability to help a user get started with a new organization
+
+## @backstage/core-app-api@1.0.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/core-components@0.9.4-next.0
+
+### Patch Changes
+
+- ac19f82936: Added ARIA landmark to Page component and added ARIA landmark to DesktopSidebar and Sidebar components
+- c0055ece91: Announce external links to screen readers
+- cfc0f2e5bd: Added optional anchorOrigin alignment prop to AlertDisplay
+- f4380eb602: Add an aria-label to the support button to improve accessibility for screen readers
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/core-plugin-api@1.0.2-next.0
+
+### Patch Changes
+
+- b653a5595c: The authentication APIs are no longer `@alpha`. Since the `@backstage/core-plugin-api` has no `/alpha` entrypoint, the only effect of marking the APIs as `@alpha` was to hide them in documentation. They are still expected to be widely used and there will be a migration path if they are changed in the future.
+
+## @backstage/create-app@0.4.27-next.1
+
+### Patch Changes
+
+- 7b253072c6: Tweaked template to provide an example and guidance for how to configure sign-in in `packages/backend/src/plugins/auth.ts`. There is no need to add this to existing apps, but for more information about sign-in configuration, see .
+
+- 00fa0dada0: Removed the database choice from the `create-app` command.
+
+ This reduces the step from development to production by always installing the dependencies and templating the production configuration in `app-config.production.yaml`.
+
+ Added `app-config.local.yaml` to allow for local configuration overrides.
+ To replicate this behavior in an existing installation simply `touch app-config.local.yaml` in the project root and apply your local configuration.
+
+ `better-sqlite3` has been moved to devDependencies, for existing installations using postgres in production and SQLite in development it's recommended to move SQLite into the devDependencies section to avoid unnecessary dependencies during builds.
+
+ in `packages/backend/package.json`
+
+ ```diff
+ "dependencies": {
+ ...
+ "pg": "^8.3.0",
+ - "better-sqlite3": "^7.5.0",
+ "winston": "^3.2.1"
+ },
+ "devDependencies": {
+ ...
+ "@types/luxon": "^2.0.4",
+ + "better-sqlite3": "^7.5.0"
+ }
+ ```
+
+- d41f19ca2a: Bumped the `typescript` version in the template to `~4.6.4`.
+
+ To apply this change to an existing app, make the following change to the root `package.json`:
+
+ ```diff
+ dependencies: {
+ ...
+ - "typescript": "~4.5.4"
+ + "typescript": "~4.6.4"
+ },
+ ```
+
+## @backstage/dev-utils@1.0.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/test-utils@1.1.0-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/app-defaults@1.0.2-next.0
+ - @backstage/integration-react@1.1.0-next.1
+ - @backstage/core-app-api@1.0.2-next.0
+
+## @backstage/integration-react@1.1.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @techdocs/cli@1.1.1-next.1
+
+### Patch Changes
+
+- 52fddad92d: The TechDocs CLI's embedded app now imports all API refs from the `@backstage/plugin-techdocs-react` package.
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+
+## @backstage/plugin-airbrake@0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/test-utils@1.1.0-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/dev-utils@1.0.2-next.1
+
+## @backstage/plugin-allure@0.1.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-analytics-module-ga@0.1.16-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-apache-airflow@0.1.13-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-api-docs@0.8.5-next.1
+
+### Patch Changes
+
+- 2c279df4eb: Updated dependency `graphiql` to `^1.8.8`.
+- 165790975d: Updated dependency `@asyncapi/react-component` to `1.0.0-next.37`.
+- 7f6f97d151: Updated dependency `@asyncapi/react-component` to `1.0.0-next.38`.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog@1.2.0-next.1
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-auth-backend@0.13.1-next.1
+
+### Patch Changes
+
+- cac3ba68a2: Fixed a bug that was introduced in `0.13.1-next.0` which caused the `ent` claim of issued tokens to be dropped.
+
+- 5d268623dd: Updates the OAuth2 Proxy provider to require less infrastructure configuration.
+
+ The auth result object of the OAuth2 Proxy now provides access to the request headers, both through the `headers` object as well as `getHeader` method. The existing logic that parses and extracts the user information from ID tokens is deprecated and will be removed in a future release. See the OAuth2 Proxy provider documentation for more details.
+
+ The OAuth2 Proxy provider now also has a default `authHandler` implementation that reads the display name and email from the incoming request headers.
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+
+## @backstage/plugin-azure-devops@0.1.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-badges@0.2.29-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-bazaar@0.1.20-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/cli@0.17.1-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog@1.2.0-next.1
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-bitrise@0.1.32-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-catalog@1.2.0-next.1
+
+### Patch Changes
+
+- 051fc60258: Lighthouse was reporting this button as having invalid aria- values, as the popover doesn't exist until clicked. This adds additional labels to the button to make it valid aria
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/integration-react@1.1.0-next.1
+
+## @backstage/plugin-catalog-backend@1.1.2-next.1
+
+### Patch Changes
+
+- 1ccbe081cc: Minor internal tweak to support TypeScript 4.6
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.1.0-next.1
+
+### Patch Changes
+
+- 57f684f59c: Fix incorrect main path in `publishConfig`
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+ - @backstage/plugin-catalog-backend@1.1.2-next.1
+
+## @backstage/plugin-catalog-graph@0.2.17-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-catalog-import@0.8.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/integration-react@1.1.0-next.1
+
+## @backstage/plugin-catalog-react@1.1.0-next.1
+
+### Patch Changes
+
+- 0418447669: Added menu parent role for menu items accessibility
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-permission-react@0.4.1-next.0
+
+## @backstage/plugin-cicd-statistics@0.1.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-cicd-statistics-module-gitlab@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-cicd-statistics@0.1.7-next.1
+
+## @backstage/plugin-circleci@0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-cloudbuild@0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-code-climate@0.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-code-coverage@0.1.32-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-config-schema@0.1.28-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-cost-insights@0.11.27-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-explore@0.3.36-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/plugin-explore-react@0.0.17-next.0
+
+## @backstage/plugin-explore-react@0.0.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-firehydrant@0.1.22-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-fossa@0.2.37-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-gcalendar@0.3.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-gcp-projects@0.3.24-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-git-release-manager@0.3.18-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-github-actions@0.5.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-github-deployments@0.1.36-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/integration-react@1.1.0-next.1
+
+## @backstage/plugin-gitops-profiles@0.3.23-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-gocd@0.1.11-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-graphiql@0.2.37-next.0
+
+### Patch Changes
+
+- 8d4ecc30f1: Updated dependency `@types/codemirror` to `^0.0.109`.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-home@0.4.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/plugin-stack-overflow@0.1.1-next.1
+
+## @backstage/plugin-ilert@0.1.31-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-jenkins@0.7.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-kafka@0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-kubernetes@0.6.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-lighthouse@0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-newrelic@0.3.23-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-newrelic-dashboard@0.1.13-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-org@0.5.5-next.1
+
+### Patch Changes
+
+- cb0db62344: Fix linking ownership card to catalog owner filter when namespaces are used
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-pagerduty@0.3.32-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-periskop@0.1.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-permission-react@0.4.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-rollbar@0.4.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-rollbar-backend@0.1.29-next.1
+
+### Patch Changes
+
+- ab1435dcc9: Updated README to include clearer installation instructions on how to install and configure.
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+
+## @backstage/plugin-scaffolder@1.2.0-next.1
+
+### Patch Changes
+
+- 8dce7d5244: Allow validation for custom field extension with type object
+- ace230b599: Updated dependency `@codemirror/legacy-modes` to `^0.20.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/integration-react@1.1.0-next.1
+ - @backstage/plugin-permission-react@0.4.1-next.0
+
+## @backstage/plugin-search@0.8.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/plugin-search-react@0.2.0-next.1
+
+## @backstage/plugin-sentry@0.3.43-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-shortcuts@0.2.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-sonarqube@0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-splunk-on-call@0.3.29-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-stack-overflow@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-home@0.4.21-next.1
+
+## @backstage/plugin-tech-insights@0.2.1-next.1
+
+### Patch Changes
+
+- aa8db01acb: Add new component `EntityTechInsightsScorecardCard`, which can be used in the overview of the `EntityPage` page or display multiple individual `EntityTechInsightsScorecardCard` in `EntityLayout.Route`.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.1
+
+### Patch Changes
+
+- 58e2c46151: Updated usages of `buildTechInsightsContext` in README.
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+ - @backstage/plugin-tech-insights-node@0.3.0-next.1
+
+## @backstage/plugin-tech-radar@0.5.12-next.0
+
+### Patch Changes
+
+- 3588a77994: Rename `use` to `adopt`, to reflect Zalando Tech Radar regarding quadrants and add link to Zalando explanation.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-techdocs@1.1.1-next.1
+
+### Patch Changes
+
+- 52fddad92d: The `TechDocsStorageApi` and its associated ref are now exported by `@backstage/plugin-techdocs-react`. The API interface, ref, and types are now deprecated in `@backstage/plugin-techdocs` and will be removed in a future release.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/plugin-search-react@0.2.0-next.1
+ - @backstage/plugin-techdocs-react@0.1.1-next.1
+ - @backstage/integration-react@1.1.0-next.1
+
+## @backstage/plugin-techdocs-module-addons-contrib@0.1.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-techdocs-react@0.1.1-next.1
+ - @backstage/integration-react@1.1.0-next.1
+
+## @backstage/plugin-techdocs-react@0.1.1-next.1
+
+### Patch Changes
+
+- 52fddad92d: The `TechDocsStorageApi` and its associated ref are now exported by `@backstage/plugin-techdocs-react`. The API interface, ref, and types are now deprecated in `@backstage/plugin-techdocs` and will be removed in a future release.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-todo@0.2.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
+## @backstage/plugin-user-settings@0.4.4-next.0
+
+### Patch Changes
+
+- ed075219aa: Added alternative text to profile picture
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## @backstage/plugin-xcmetrics@0.2.25-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
+## example-app@0.2.71-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/plugin-api-docs@0.8.5-next.1
+ - @backstage/plugin-tech-insights@0.2.1-next.1
+ - @backstage/plugin-tech-radar@0.5.12-next.0
+ - @backstage/cli@0.17.1-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-user-settings@0.4.4-next.0
+ - @backstage/plugin-scaffolder@1.2.0-next.1
+ - @backstage/plugin-catalog@1.2.0-next.1
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/plugin-org@0.5.5-next.1
+ - @backstage/plugin-graphiql@0.2.37-next.0
+ - @backstage/plugin-search-react@0.2.0-next.1
+ - @backstage/plugin-techdocs-react@0.1.1-next.1
+ - @backstage/plugin-techdocs@1.1.1-next.1
+ - @backstage/app-defaults@1.0.2-next.0
+ - @backstage/integration-react@1.1.0-next.1
+ - @backstage/plugin-airbrake@0.3.5-next.1
+ - @backstage/plugin-apache-airflow@0.1.13-next.0
+ - @backstage/plugin-azure-devops@0.1.21-next.1
+ - @backstage/plugin-badges@0.2.29-next.1
+ - @backstage/plugin-catalog-graph@0.2.17-next.1
+ - @backstage/plugin-catalog-import@0.8.8-next.1
+ - @backstage/plugin-circleci@0.3.5-next.1
+ - @backstage/plugin-cloudbuild@0.3.5-next.1
+ - @backstage/plugin-code-coverage@0.1.32-next.1
+ - @backstage/plugin-cost-insights@0.11.27-next.0
+ - @backstage/plugin-explore@0.3.36-next.1
+ - @backstage/plugin-gcalendar@0.3.1-next.1
+ - @backstage/plugin-gcp-projects@0.3.24-next.0
+ - @backstage/plugin-github-actions@0.5.5-next.1
+ - @backstage/plugin-gocd@0.1.11-next.1
+ - @backstage/plugin-home@0.4.21-next.1
+ - @backstage/plugin-jenkins@0.7.4-next.1
+ - @backstage/plugin-kafka@0.3.5-next.1
+ - @backstage/plugin-kubernetes@0.6.5-next.1
+ - @backstage/plugin-lighthouse@0.3.5-next.1
+ - @backstage/plugin-newrelic@0.3.23-next.0
+ - @backstage/plugin-newrelic-dashboard@0.1.13-next.1
+ - @backstage/plugin-pagerduty@0.3.32-next.1
+ - @backstage/plugin-rollbar@0.4.5-next.1
+ - @backstage/plugin-search@0.8.1-next.1
+ - @backstage/plugin-sentry@0.3.43-next.1
+ - @backstage/plugin-shortcuts@0.2.6-next.0
+ - @backstage/plugin-stack-overflow@0.1.1-next.1
+ - @backstage/plugin-techdocs-module-addons-contrib@0.1.0-next.1
+ - @backstage/plugin-todo@0.2.7-next.1
+ - @backstage/core-app-api@1.0.2-next.0
+ - @backstage/plugin-permission-react@0.4.1-next.0
+
+## example-backend@0.2.71-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-backend@0.13.1-next.1
+ - @backstage/plugin-tech-insights-backend@0.4.0-next.1
+ - @backstage/backend-common@0.13.3-next.1
+ - @backstage/plugin-tech-insights-node@0.3.0-next.1
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.1
+ - @backstage/plugin-catalog-backend@1.1.2-next.1
+ - @backstage/plugin-rollbar-backend@0.1.29-next.1
+ - example-app@0.2.71-next.1
+
+## techdocs-cli-embedded-app@0.2.70-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/test-utils@1.1.0-next.1
+ - @backstage/cli@0.17.1-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog@1.2.0-next.1
+ - @backstage/plugin-techdocs-react@0.1.1-next.1
+ - @backstage/plugin-techdocs@1.1.1-next.1
+ - @backstage/app-defaults@1.0.2-next.0
+ - @backstage/integration-react@1.1.0-next.1
+ - @backstage/core-app-api@1.0.2-next.0
+
+## @internal/plugin-todo-list@1.0.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
diff --git a/docs/tutorials/using-backstage-proxy-within-plugin.md b/docs/tutorials/using-backstage-proxy-within-plugin.md
index 771aa7a652..3002eb1aff 100644
--- a/docs/tutorials/using-backstage-proxy-within-plugin.md
+++ b/docs/tutorials/using-backstage-proxy-within-plugin.md
@@ -52,7 +52,7 @@ calling `${backend-url}/api/proxy/`. The reason why
`backend-url` is referenced is because the backstage backend creates and runs
the proxy. Backstage is structured in such a way that you could run the
backstage frontend independently of the backend. So when calling your API you
-need to prepend the backend url to your http call.
+need to prepend the backend URL to your http call.
The recommended pattern for calling out to services is to wrap your calls in a
[Utility API](../api/utility-apis.md). This section describes the steps to wrap
diff --git a/microsite/data/plugins/cloud-carbon-footprint.yaml b/microsite/data/plugins/cloud-carbon-footprint.yaml
index 7e73ad6adb..5a50d02fe3 100644
--- a/microsite/data/plugins/cloud-carbon-footprint.yaml
+++ b/microsite/data/plugins/cloud-carbon-footprint.yaml
@@ -1,7 +1,7 @@
---
title: Cloud Carbon Footprint
author: Thoughtworks
-authorUrl: https://github.com/cloud-carbon-footprint
+authorUrl: https://www.cloudcarbonfootprint.org/
category: Metrics
description: View your cloud carbon footprint by estimating energy use (kilowatt-hours) and carbon emissions (metric tons CO2e) from public cloud usage.
documentation: https://github.com/cloud-carbon-footprint/ccf-backstage-plugin/blob/trunk/README.md
diff --git a/microsite/sidebars.json b/microsite/sidebars.json
index 81ad453429..f96747f0ca 100644
--- a/microsite/sidebars.json
+++ b/microsite/sidebars.json
@@ -109,6 +109,7 @@
"features/techdocs/techdocs-overview",
"features/techdocs/getting-started",
"features/techdocs/concepts",
+ "features/techdocs/addons",
"features/techdocs/architecture",
"features/techdocs/creating-and-publishing",
"features/techdocs/configuration",
@@ -243,6 +244,7 @@
"auth/github/provider",
"auth/gitlab/provider",
"auth/google/provider",
+ "auth/google/gcp-iap-auth",
"auth/okta/provider",
"auth/onelogin/provider",
"auth/oauth2-proxy/provider"
@@ -253,8 +255,26 @@
"auth/auth-backend",
"auth/oauth",
"auth/auth-backend-classes",
+ "auth/troubleshooting",
"auth/glossary"
],
+ "Permissions": [
+ "permission/overview",
+ "permission/concepts",
+ "permission/getting-started",
+ "permission/writing-a-policy",
+ "permission/custom-rules",
+ {
+ "type": "subcategory",
+ "label": "Tutorial: using Permissions in your plugin",
+ "ids": [
+ "permission/plugin-authors/01-setup",
+ "permission/plugin-authors/02-adding-a-basic-permission-check",
+ "permission/plugin-authors/03-adding-a-resource-permission-check",
+ "permission/plugin-authors/04-authorizing-access-to-paginated-data"
+ ]
+ }
+ ],
"Deployment": [
"deployment/index",
"deployment/docker",
diff --git a/mkdocs.yml b/mkdocs.yml
index 0e56dcbd73..caaee37f29 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -148,6 +148,7 @@ nav:
- GitHub: 'auth/github/provider.md'
- GitLab: 'auth/gitlab/provider.md'
- Google: 'auth/google/provider.md'
+ - Google IAP: 'auth/google/gcp-iap-auth.md'
- Okta: 'auth/okta/provider.md'
- OneLogin: 'auth/onelogin/provider.md'
- OAuth2Proxy: 'auth/oauth2-proxy/provider.md'
@@ -157,6 +158,7 @@ nav:
- Auth backend: 'auth/auth-backend.md'
- OAuth and OpenID Connect: 'auth/oauth.md'
- Auth backend classes: 'auth/auth-backend-classes.md'
+ - Troubleshooting Auth: 'auth/troubleshooting.md'
- Glossary: 'auth/glossary.md'
- Deployment:
- Deploying Backstage: 'deployment/index.md'
diff --git a/package.json b/package.json
index db8816a7ac..b586e0b8ba 100644
--- a/package.json
+++ b/package.json
@@ -49,12 +49,12 @@
"@types/react": "^17",
"@types/react-dom": "^17"
},
- "version": "1.2.0-next.0",
+ "version": "1.2.0-next.1",
"dependencies": {
"@manypkg/get-packages": "^1.1.3",
- "@microsoft/api-documenter": "^7.17.5",
- "@microsoft/api-extractor": "^7.21.2",
- "@microsoft/api-extractor-model": "^7.16.1",
+ "@microsoft/api-documenter": "^7.17.11",
+ "@microsoft/api-extractor": "^7.23.0",
+ "@microsoft/api-extractor-model": "^7.17.2",
"@microsoft/tsdoc": "^0.14.1"
},
"devDependencies": {
@@ -76,7 +76,7 @@
"semver": "^7.3.2",
"shx": "^0.3.2",
"ts-node": "^10.4.0",
- "typescript": "~4.5.4",
+ "typescript": "~4.6.4",
"yarn-lock-check": "^1.0.5"
},
"prettier": "@spotify/prettier-config",
diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md
index cf09d57fcd..61ca6df40f 100644
--- a/packages/app-defaults/CHANGELOG.md
+++ b/packages/app-defaults/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/app-defaults
+## 1.0.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/core-app-api@1.0.2-next.0
+ - @backstage/plugin-permission-react@0.4.1-next.0
+
## 1.0.1
### Patch Changes
diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json
index ae18b4217f..45f77ce1d1 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.1",
+ "version": "1.0.2-next.0",
"private": false,
"publishConfig": {
"access": "public",
@@ -33,10 +33,10 @@
"start": "backstage-cli package start"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-permission-react": "^0.4.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-permission-react": "^0.4.1-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -46,8 +46,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@types/jest": "^26.0.7",
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index 498cdf6ed5..8ea789e99a 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -1,5 +1,60 @@
# example-app
+## 0.2.71-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/plugin-api-docs@0.8.5-next.1
+ - @backstage/plugin-tech-insights@0.2.1-next.1
+ - @backstage/plugin-tech-radar@0.5.12-next.0
+ - @backstage/cli@0.17.1-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-user-settings@0.4.4-next.0
+ - @backstage/plugin-scaffolder@1.2.0-next.1
+ - @backstage/plugin-catalog@1.2.0-next.1
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/plugin-org@0.5.5-next.1
+ - @backstage/plugin-graphiql@0.2.37-next.0
+ - @backstage/plugin-search-react@0.2.0-next.1
+ - @backstage/plugin-techdocs-react@0.1.1-next.1
+ - @backstage/plugin-techdocs@1.1.1-next.1
+ - @backstage/app-defaults@1.0.2-next.0
+ - @backstage/integration-react@1.1.0-next.1
+ - @backstage/plugin-airbrake@0.3.5-next.1
+ - @backstage/plugin-apache-airflow@0.1.13-next.0
+ - @backstage/plugin-azure-devops@0.1.21-next.1
+ - @backstage/plugin-badges@0.2.29-next.1
+ - @backstage/plugin-catalog-graph@0.2.17-next.1
+ - @backstage/plugin-catalog-import@0.8.8-next.1
+ - @backstage/plugin-circleci@0.3.5-next.1
+ - @backstage/plugin-cloudbuild@0.3.5-next.1
+ - @backstage/plugin-code-coverage@0.1.32-next.1
+ - @backstage/plugin-cost-insights@0.11.27-next.0
+ - @backstage/plugin-explore@0.3.36-next.1
+ - @backstage/plugin-gcalendar@0.3.1-next.1
+ - @backstage/plugin-gcp-projects@0.3.24-next.0
+ - @backstage/plugin-github-actions@0.5.5-next.1
+ - @backstage/plugin-gocd@0.1.11-next.1
+ - @backstage/plugin-home@0.4.21-next.1
+ - @backstage/plugin-jenkins@0.7.4-next.1
+ - @backstage/plugin-kafka@0.3.5-next.1
+ - @backstage/plugin-kubernetes@0.6.5-next.1
+ - @backstage/plugin-lighthouse@0.3.5-next.1
+ - @backstage/plugin-newrelic@0.3.23-next.0
+ - @backstage/plugin-newrelic-dashboard@0.1.13-next.1
+ - @backstage/plugin-pagerduty@0.3.32-next.1
+ - @backstage/plugin-rollbar@0.4.5-next.1
+ - @backstage/plugin-search@0.8.1-next.1
+ - @backstage/plugin-sentry@0.3.43-next.1
+ - @backstage/plugin-shortcuts@0.2.6-next.0
+ - @backstage/plugin-stack-overflow@0.1.1-next.1
+ - @backstage/plugin-techdocs-module-addons-contrib@0.1.0-next.1
+ - @backstage/plugin-todo@0.2.7-next.1
+ - @backstage/core-app-api@1.0.2-next.0
+ - @backstage/plugin-permission-react@0.4.1-next.0
+
## 0.2.71-next.0
### Patch Changes
diff --git a/packages/app/package.json b/packages/app/package.json
index 6e98358a75..4c219916d8 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,65 +1,65 @@
{
"name": "example-app",
- "version": "0.2.71-next.0",
+ "version": "0.2.71-next.1",
"private": true,
"backstage": {
"role": "frontend"
},
"bundled": true,
"dependencies": {
- "@backstage/app-defaults": "^1.0.1",
+ "@backstage/app-defaults": "^1.0.2-next.0",
"@backstage/catalog-model": "^1.0.1",
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@backstage/config": "^1.0.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/integration-react": "^1.1.0-next.0",
- "@backstage/plugin-airbrake": "^0.3.5-next.0",
- "@backstage/plugin-api-docs": "^0.8.5-next.0",
- "@backstage/plugin-azure-devops": "^0.1.21-next.0",
- "@backstage/plugin-apache-airflow": "^0.1.12",
- "@backstage/plugin-badges": "^0.2.29-next.0",
- "@backstage/plugin-catalog": "^1.2.0-next.0",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/integration-react": "^1.1.0-next.1",
+ "@backstage/plugin-airbrake": "^0.3.5-next.1",
+ "@backstage/plugin-api-docs": "^0.8.5-next.1",
+ "@backstage/plugin-azure-devops": "^0.1.21-next.1",
+ "@backstage/plugin-apache-airflow": "^0.1.13-next.0",
+ "@backstage/plugin-badges": "^0.2.29-next.1",
+ "@backstage/plugin-catalog": "^1.2.0-next.1",
"@backstage/plugin-catalog-common": "^1.0.1",
- "@backstage/plugin-catalog-graph": "^0.2.17-next.0",
- "@backstage/plugin-catalog-import": "^0.8.8-next.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
- "@backstage/plugin-circleci": "^0.3.5-next.0",
- "@backstage/plugin-cloudbuild": "^0.3.5-next.0",
- "@backstage/plugin-code-coverage": "^0.1.32-next.0",
- "@backstage/plugin-cost-insights": "^0.11.26",
- "@backstage/plugin-explore": "^0.3.36-next.0",
- "@backstage/plugin-gcalendar": "^0.3.1-next.0",
- "@backstage/plugin-gcp-projects": "^0.3.23",
- "@backstage/plugin-github-actions": "^0.5.5-next.0",
- "@backstage/plugin-gocd": "^0.1.11-next.0",
- "@backstage/plugin-graphiql": "^0.2.36",
- "@backstage/plugin-home": "^0.4.21-next.0",
- "@backstage/plugin-jenkins": "^0.7.4-next.0",
- "@backstage/plugin-kafka": "^0.3.5-next.0",
- "@backstage/plugin-kubernetes": "^0.6.5-next.0",
- "@backstage/plugin-lighthouse": "^0.3.5-next.0",
- "@backstage/plugin-newrelic": "^0.3.22",
- "@backstage/plugin-newrelic-dashboard": "^0.1.13-next.0",
- "@backstage/plugin-org": "^0.5.5-next.0",
- "@backstage/plugin-pagerduty": "0.3.32-next.0",
- "@backstage/plugin-permission-react": "^0.4.0",
- "@backstage/plugin-rollbar": "^0.4.5-next.0",
- "@backstage/plugin-scaffolder": "^1.2.0-next.0",
- "@backstage/plugin-search": "^0.8.1-next.0",
- "@backstage/plugin-search-react": "^0.1.1-next.0",
+ "@backstage/plugin-catalog-graph": "^0.2.17-next.1",
+ "@backstage/plugin-catalog-import": "^0.8.8-next.1",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
+ "@backstage/plugin-circleci": "^0.3.5-next.1",
+ "@backstage/plugin-cloudbuild": "^0.3.5-next.1",
+ "@backstage/plugin-code-coverage": "^0.1.32-next.1",
+ "@backstage/plugin-cost-insights": "^0.11.27-next.0",
+ "@backstage/plugin-explore": "^0.3.36-next.1",
+ "@backstage/plugin-gcalendar": "^0.3.1-next.1",
+ "@backstage/plugin-gcp-projects": "^0.3.24-next.0",
+ "@backstage/plugin-github-actions": "^0.5.5-next.1",
+ "@backstage/plugin-gocd": "^0.1.11-next.1",
+ "@backstage/plugin-graphiql": "^0.2.37-next.0",
+ "@backstage/plugin-home": "^0.4.21-next.1",
+ "@backstage/plugin-jenkins": "^0.7.4-next.1",
+ "@backstage/plugin-kafka": "^0.3.5-next.1",
+ "@backstage/plugin-kubernetes": "^0.6.5-next.1",
+ "@backstage/plugin-lighthouse": "^0.3.5-next.1",
+ "@backstage/plugin-newrelic": "^0.3.23-next.0",
+ "@backstage/plugin-newrelic-dashboard": "^0.1.13-next.1",
+ "@backstage/plugin-org": "^0.5.5-next.1",
+ "@backstage/plugin-pagerduty": "0.3.32-next.1",
+ "@backstage/plugin-permission-react": "^0.4.1-next.0",
+ "@backstage/plugin-rollbar": "^0.4.5-next.1",
+ "@backstage/plugin-scaffolder": "^1.2.0-next.1",
+ "@backstage/plugin-search": "^0.8.1-next.1",
+ "@backstage/plugin-search-react": "^0.2.0-next.1",
"@backstage/plugin-search-common": "^0.3.3",
- "@backstage/plugin-sentry": "^0.3.43-next.0",
- "@backstage/plugin-shortcuts": "^0.2.5",
- "@backstage/plugin-stack-overflow": "^0.1.1-next.0",
- "@backstage/plugin-tech-radar": "^0.5.11",
- "@backstage/plugin-techdocs": "^1.1.1-next.0",
- "@backstage/plugin-techdocs-react": "^0.1.1-next.0",
- "@backstage/plugin-techdocs-module-addons-contrib": "^0.1.0-next.0",
- "@backstage/plugin-todo": "^0.2.7-next.0",
- "@backstage/plugin-user-settings": "^0.4.3",
- "@backstage/plugin-tech-insights": "^0.2.1-next.0",
+ "@backstage/plugin-sentry": "^0.3.43-next.1",
+ "@backstage/plugin-shortcuts": "^0.2.6-next.0",
+ "@backstage/plugin-stack-overflow": "^0.1.1-next.1",
+ "@backstage/plugin-tech-radar": "^0.5.12-next.0",
+ "@backstage/plugin-techdocs": "^1.1.1-next.1",
+ "@backstage/plugin-techdocs-react": "^0.1.1-next.1",
+ "@backstage/plugin-techdocs-module-addons-contrib": "^0.1.0-next.1",
+ "@backstage/plugin-todo": "^0.2.7-next.1",
+ "@backstage/plugin-user-settings": "^0.4.4-next.0",
+ "@backstage/plugin-tech-insights": "^0.2.1-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -80,7 +80,7 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@rjsf/core": "^3.2.1",
"@testing-library/cypress": "^8.0.2",
"@testing-library/jest-dom": "^5.10.1",
diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md
index d64b199d6c..b67b7a3ce8 100644
--- a/packages/backend-common/CHANGELOG.md
+++ b/packages/backend-common/CHANGELOG.md
@@ -1,5 +1,11 @@
# @backstage/backend-common
+## 0.13.3-next.1
+
+### Patch Changes
+
+- 28b0e4ddef: Update types to match the new version of `@keyv/redis`
+
## 0.13.3-next.0
### Patch Changes
diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json
index d66465a471..a2913c7501 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.13.3-next.0",
+ "version": "0.13.3-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -91,7 +91,7 @@
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.24-next.0",
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@types/archiver": "^5.1.0",
"@types/compression": "^1.7.0",
"@types/concat-stream": "^2.0.0",
diff --git a/packages/backend-common/src/cache/CacheManager.test.ts b/packages/backend-common/src/cache/CacheManager.test.ts
index c6cad2e49b..82c04f2cdd 100644
--- a/packages/backend-common/src/cache/CacheManager.test.ts
+++ b/packages/backend-common/src/cache/CacheManager.test.ts
@@ -18,7 +18,6 @@ import { ConfigReader } from '@backstage/config';
import Keyv from 'keyv';
/* @ts-expect-error */
import KeyvMemcache from 'keyv-memcache';
-/* @ts-expect-error */
import KeyvRedis from '@keyv/redis';
import { DefaultCacheClient } from './CacheClient';
import { CacheManager } from './CacheManager';
@@ -215,7 +214,7 @@ describe('CacheManager', () => {
ttl: expectedTtl,
});
expect(mockCacheCalls[0][0].store).toBeInstanceOf(KeyvRedis);
- const redis = KeyvRedis as jest.Mock;
+ const redis = KeyvRedis as unknown as jest.Mock;
const mockRedisCalls = redis.mock.calls.splice(-1);
expect(mockRedisCalls[0][0]).toEqual(redisConnection);
});
diff --git a/packages/backend-common/src/cache/CacheManager.ts b/packages/backend-common/src/cache/CacheManager.ts
index d8652e42d8..99e3770ada 100644
--- a/packages/backend-common/src/cache/CacheManager.ts
+++ b/packages/backend-common/src/cache/CacheManager.ts
@@ -18,7 +18,6 @@ import { Config } from '@backstage/config';
import Keyv from 'keyv';
// @ts-expect-error
import KeyvMemcache from 'keyv-memcache';
-// @ts-expect-error
import KeyvRedis from '@keyv/redis';
import { Logger } from 'winston';
import { getRootLogger } from '../logging';
diff --git a/packages/backend-common/src/reading/GoogleGcsUrlReader.test.ts b/packages/backend-common/src/reading/GoogleGcsUrlReader.test.ts
index 31cf2956f8..0ae6b1f883 100644
--- a/packages/backend-common/src/reading/GoogleGcsUrlReader.test.ts
+++ b/packages/backend-common/src/reading/GoogleGcsUrlReader.test.ts
@@ -21,6 +21,24 @@ import { DefaultReadTreeResponseFactory } from './tree';
import { GoogleGcsUrlReader } from './GoogleGcsUrlReader';
import { UrlReaderPredicateTuple } from './types';
+const bucketGetFilesMock = jest.fn();
+jest.mock('@google-cloud/storage', () => {
+ class Bucket {
+ getFiles(query: any) {
+ return bucketGetFilesMock(query);
+ }
+ }
+ class Storage {
+ bucket() {
+ return new Bucket();
+ }
+ }
+ return {
+ __esModule: true,
+ Storage,
+ };
+});
+
describe('GcsUrlReader', () => {
const createReader = (config: JsonObject): UrlReaderPredicateTuple[] => {
return GoogleGcsUrlReader.factory({
@@ -92,4 +110,51 @@ describe('GcsUrlReader', () => {
expect(predicate(new URL('https://a.example.com/test'))).toBe(false);
});
});
+
+ describe('search', () => {
+ const { reader } = createReader({ integrations: { googleGcs: {} } })[0];
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('throws if search url does not end with *', async () => {
+ const glob = 'https://storage.cloud.google.com/bucket/no-asterisk';
+ await expect(() => reader.search(glob)).rejects.toThrow(
+ 'GcsUrlReader only supports prefix-based searches',
+ );
+ });
+
+ it('throws if search url looks truly glob-y', async () => {
+ const glob = 'https://storage.cloud.google.com/bucket/**/path*';
+ await expect(() => reader.search(glob)).rejects.toThrowError(
+ 'GcsUrlReader only supports prefix-based searches',
+ );
+ });
+
+ it('searches with expected prefix and pagination', () => {
+ bucketGetFilesMock.mockResolvedValue([[]]);
+ const glob = 'https://storage.cloud.google.com/bucket/path/some-prefix-*';
+
+ reader.search(glob);
+ expect(bucketGetFilesMock).toHaveBeenCalledWith(
+ expect.objectContaining({
+ autoPaginate: true,
+ prefix: 'path/some-prefix-',
+ }),
+ );
+ });
+
+ it('returns valid SearchResponse object', async () => {
+ const expectedFile = { name: 'path/some-prefix-1.txt' };
+ bucketGetFilesMock.mockResolvedValue([[expectedFile]]);
+ const glob = 'https://storage.cloud.google.com/bucket/path/some-prefix-*';
+
+ const result = await reader.search(glob);
+ expect(result.files).toHaveLength(1);
+ expect(result.files[0].url).toEqual(
+ 'https://storage.cloud.google.com/bucket/path/some-prefix-1.txt',
+ );
+ });
+ });
});
diff --git a/packages/backend-common/src/reading/GoogleGcsUrlReader.ts b/packages/backend-common/src/reading/GoogleGcsUrlReader.ts
index baa9477c6a..167e20ca2b 100644
--- a/packages/backend-common/src/reading/GoogleGcsUrlReader.ts
+++ b/packages/backend-common/src/reading/GoogleGcsUrlReader.ts
@@ -110,8 +110,34 @@ export class GoogleGcsUrlReader implements UrlReader {
throw new Error('GcsUrlReader does not implement readTree');
}
- async search(): Promise {
- throw new Error('GcsUrlReader does not implement search');
+ async search(url: string): Promise {
+ const { bucket, key: pattern } = parseURL(url);
+
+ if (!pattern.endsWith('*') || pattern.indexOf('*') !== pattern.length - 1) {
+ throw new Error('GcsUrlReader only supports prefix-based searches');
+ }
+
+ const [files] = await this.storage.bucket(bucket).getFiles({
+ autoPaginate: true,
+ prefix: pattern.split('*').join(''),
+ });
+
+ return {
+ files: files.map(file => {
+ const fullUrl = ['https:/', GOOGLE_GCS_HOST, bucket, file.name].join(
+ '/',
+ );
+ return {
+ url: fullUrl,
+ content: async () => {
+ const readResponse = await this.readUrl(fullUrl);
+ return readResponse.buffer();
+ },
+ };
+ }),
+ // TODO etag is not implemented yet.
+ etag: 'NOT/IMPLEMENTED',
+ };
}
toString() {
diff --git a/packages/backend-tasks/README.md b/packages/backend-tasks/README.md
index d170c323c8..b3c304eb34 100644
--- a/packages/backend-tasks/README.md
+++ b/packages/backend-tasks/README.md
@@ -15,14 +15,13 @@ then make use of its facilities as necessary:
```typescript
import { TaskScheduler } from '@backstage/backend-tasks';
-import { Duration } from 'luxon';
const scheduler = TaskScheduler.fromConfig(rootConfig).forPlugin('my-plugin');
await scheduler.scheduleTask({
id: 'refresh_things',
frequency: { cron: '*/5 * * * *' }, // every 5 minutes, also supports Duration
- timeout: Duration.fromObject({ minutes: 15 }),
+ timeout: { minutes: 15 },
fn: async () => {
await entityProvider.run();
},
diff --git a/packages/backend-tasks/api-report.md b/packages/backend-tasks/api-report.md
index 0c82387cc8..c0802fa46c 100644
--- a/packages/backend-tasks/api-report.md
+++ b/packages/backend-tasks/api-report.md
@@ -9,6 +9,18 @@ import { DatabaseManager } from '@backstage/backend-common';
import { Duration } from 'luxon';
import { Logger } from 'winston';
+// @public
+export type HumanDuration = {
+ years?: number;
+ months?: number;
+ weeks?: number;
+ days?: number;
+ hours?: number;
+ minutes?: number;
+ seconds?: number;
+ milliseconds?: number;
+};
+
// @public
export interface PluginTaskScheduler {
createScheduledTaskRunner(schedule: TaskScheduleDefinition): TaskRunner;
@@ -41,10 +53,11 @@ export interface TaskScheduleDefinition {
| {
cron: string;
}
- | Duration;
- initialDelay?: Duration;
+ | Duration
+ | HumanDuration;
+ initialDelay?: Duration | HumanDuration;
scope?: 'global' | 'local';
- timeout: Duration;
+ timeout: Duration | HumanDuration;
}
// @public
diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts
index 1204431434..16550b2d7d 100644
--- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts
+++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts
@@ -20,7 +20,10 @@ import { ConflictError, NotFoundError } from '@backstage/errors';
import { Duration } from 'luxon';
import { AbortSignal } from 'node-abort-controller';
import { migrateBackendTasks } from '../database/migrateBackendTasks';
-import { PluginTaskSchedulerImpl } from './PluginTaskSchedulerImpl';
+import {
+ parseDuration,
+ PluginTaskSchedulerImpl,
+} from './PluginTaskSchedulerImpl';
jest.useFakeTimers();
@@ -177,8 +180,8 @@ describe('PluginTaskManagerImpl', () => {
const promise = new Promise(resolve => fn.mockImplementation(resolve));
await manager.scheduleTask({
id: 'task1',
- timeout: Duration.fromMillis(5000),
- frequency: Duration.fromMillis(5000),
+ timeout: { milliseconds: 5000 },
+ frequency: { milliseconds: 5000 },
fn,
scope: 'local',
});
@@ -294,4 +297,12 @@ describe('PluginTaskManagerImpl', () => {
60_000,
);
});
+
+ describe('parseDuration', () => {
+ it('should parse durations', () => {
+ expect(parseDuration({ milliseconds: 5000 })).toEqual('PT5S');
+ expect(parseDuration(Duration.fromMillis(5000))).toEqual('PT5S');
+ expect(parseDuration({ cron: '1 * * * *' })).toEqual('1 * * * *');
+ });
+ });
});
diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.ts
index 6db8b9f4f5..e43d0c1be6 100644
--- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.ts
+++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.ts
@@ -15,6 +15,7 @@
*/
import { Knex } from 'knex';
+import { Duration } from 'luxon';
import { Logger } from 'winston';
import { LocalTaskWorker } from './LocalTaskWorker';
import { TaskWorker } from './TaskWorker';
@@ -61,12 +62,10 @@ export class PluginTaskSchedulerImpl implements PluginTaskScheduler {
await worker.start(
{
version: 2,
- cadence:
- 'cron' in task.frequency
- ? task.frequency.cron
- : task.frequency.toISO(),
- initialDelayDuration: task.initialDelay?.toISO(),
- timeoutAfterDuration: task.timeout.toISO(),
+ cadence: parseDuration(task.frequency),
+ initialDelayDuration:
+ task.initialDelay && parseDuration(task.initialDelay),
+ timeoutAfterDuration: parseDuration(task.timeout),
},
{
signal: task.signal,
@@ -78,12 +77,10 @@ export class PluginTaskSchedulerImpl implements PluginTaskScheduler {
worker.start(
{
version: 2,
- cadence:
- 'cron' in task.frequency
- ? task.frequency.cron
- : task.frequency.toISO(),
- initialDelayDuration: task.initialDelay?.toISO(),
- timeoutAfterDuration: task.timeout.toISO(),
+ cadence: parseDuration(task.frequency),
+ initialDelayDuration:
+ task.initialDelay && parseDuration(task.initialDelay),
+ timeoutAfterDuration: parseDuration(task.timeout),
},
{
signal: task.signal,
@@ -102,3 +99,17 @@ export class PluginTaskSchedulerImpl implements PluginTaskScheduler {
};
}
}
+
+export function parseDuration(
+ frequency: TaskScheduleDefinition['frequency'],
+): string {
+ if ('cron' in frequency) {
+ return frequency.cron;
+ }
+
+ if (Duration.isDuration(frequency)) {
+ return frequency.toISO();
+ }
+
+ return Duration.fromObject(frequency).toISO();
+}
diff --git a/packages/backend-tasks/src/tasks/TaskWorker.ts b/packages/backend-tasks/src/tasks/TaskWorker.ts
index a60a0a4730..d2269d8118 100644
--- a/packages/backend-tasks/src/tasks/TaskWorker.ts
+++ b/packages/backend-tasks/src/tasks/TaskWorker.ts
@@ -283,8 +283,13 @@ export class TaskWorker {
})}`,
);
nextRun = this.knex.client.config.client.includes('sqlite3')
- ? this.knex.raw('datetime(next_run_start_at, ?)', [`+${dt} seconds`])
- : this.knex.raw(`next_run_start_at + interval '${dt} seconds'`);
+ ? this.knex.raw(
+ `max(datetime(next_run_start_at, ?), datetime('now'))`,
+ [`+${dt} seconds`],
+ )
+ : this.knex.raw(
+ `greatest(next_run_start_at + interval '${dt} seconds', now())`,
+ );
}
const rows = await this.knex(DB_TASKS_TABLE)
diff --git a/packages/backend-tasks/src/tasks/index.ts b/packages/backend-tasks/src/tasks/index.ts
index f6695a8d73..990d6332fc 100644
--- a/packages/backend-tasks/src/tasks/index.ts
+++ b/packages/backend-tasks/src/tasks/index.ts
@@ -21,4 +21,5 @@ export type {
TaskInvocationDefinition,
TaskRunner,
TaskScheduleDefinition,
+ HumanDuration,
} from './types';
diff --git a/packages/backend-tasks/src/tasks/types.ts b/packages/backend-tasks/src/tasks/types.ts
index f9ada1dd17..86c0c5c462 100644
--- a/packages/backend-tasks/src/tasks/types.ts
+++ b/packages/backend-tasks/src/tasks/types.ts
@@ -19,6 +19,21 @@ import { Duration } from 'luxon';
import { AbortSignal } from 'node-abort-controller';
import { z } from 'zod';
+/**
+ * Human friendly durations object
+ * @public
+ */
+export type HumanDuration = {
+ years?: number;
+ months?: number;
+ weeks?: number;
+ days?: number;
+ hours?: number;
+ minutes?: number;
+ seconds?: number;
+ milliseconds?: number;
+};
+
/**
* A function that can be called as a scheduled task.
*
@@ -74,14 +89,15 @@ export interface TaskScheduleDefinition {
*/
cron: string;
}
- | Duration;
+ | Duration
+ | HumanDuration;
/**
* The maximum amount of time that a single task invocation can take, before
* it's considered timed out and gets "released" such that a new invocation
* is permitted to take place (possibly, then, on a different worker).
*/
- timeout: Duration;
+ timeout: Duration | HumanDuration;
/**
* The amount of time that should pass before the first invocation happens.
@@ -100,7 +116,7 @@ export interface TaskScheduleDefinition {
* work; its main intended use is for individual machines to get a chance to
* reach some equilibrium at startup before triggering heavy batch workloads.
*/
- initialDelay?: Duration;
+ initialDelay?: Duration | HumanDuration;
/**
* Sets the scope of concurrency control / locking to apply for invocations of
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index 8a6a052a20..d77bb00d72 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,19 @@
# example-backend
+## 0.2.71-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-backend@0.13.1-next.1
+ - @backstage/plugin-tech-insights-backend@0.4.0-next.1
+ - @backstage/backend-common@0.13.3-next.1
+ - @backstage/plugin-tech-insights-node@0.3.0-next.1
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.1
+ - @backstage/plugin-catalog-backend@1.1.2-next.1
+ - @backstage/plugin-rollbar-backend@0.1.29-next.1
+ - example-app@0.2.71-next.1
+
## 0.2.71-next.0
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index df06840aa0..1757693252 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend",
- "version": "0.2.71-next.0",
+ "version": "0.2.71-next.1",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -26,18 +26,18 @@
"build-image": "docker build ../.. -f Dockerfile --tag example-backend"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-common": "^0.13.3-next.1",
"@backstage/backend-tasks": "^0.3.1-next.0",
"@backstage/catalog-client": "^1.0.1",
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
"@backstage/integration": "^1.2.0-next.0",
"@backstage/plugin-app-backend": "^0.3.32-next.0",
- "@backstage/plugin-auth-backend": "^0.13.1-next.0",
+ "@backstage/plugin-auth-backend": "^0.13.1-next.1",
"@backstage/plugin-auth-node": "^0.2.1-next.0",
"@backstage/plugin-azure-devops-backend": "^0.3.11-next.0",
"@backstage/plugin-badges-backend": "^0.1.26-next.0",
- "@backstage/plugin-catalog-backend": "^1.1.2-next.0",
+ "@backstage/plugin-catalog-backend": "^1.1.2-next.1",
"@backstage/plugin-code-coverage-backend": "^0.1.30-next.0",
"@backstage/plugin-graphql-backend": "^0.1.22-next.0",
"@backstage/plugin-jenkins-backend": "^0.1.22-next.0",
@@ -47,7 +47,7 @@
"@backstage/plugin-permission-common": "^0.6.0",
"@backstage/plugin-permission-node": "^0.6.1-next.0",
"@backstage/plugin-proxy-backend": "^0.2.26-next.0",
- "@backstage/plugin-rollbar-backend": "^0.1.29-next.0",
+ "@backstage/plugin-rollbar-backend": "^0.1.29-next.1",
"@backstage/plugin-scaffolder-backend": "^1.2.0-next.0",
"@backstage/plugin-scaffolder-backend-module-rails": "^0.3.7-next.0",
"@backstage/plugin-search-backend": "^0.5.2-next.0",
@@ -55,9 +55,9 @@
"@backstage/plugin-search-backend-module-elasticsearch": "^0.1.4-next.0",
"@backstage/plugin-search-backend-module-pg": "^0.3.3-next.0",
"@backstage/plugin-techdocs-backend": "^1.1.1-next.0",
- "@backstage/plugin-tech-insights-backend": "^0.3.1-next.0",
- "@backstage/plugin-tech-insights-node": "^0.2.10-next.0",
- "@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.16-next.0",
+ "@backstage/plugin-tech-insights-backend": "^0.4.0-next.1",
+ "@backstage/plugin-tech-insights-node": "^0.3.0-next.1",
+ "@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.16-next.1",
"@backstage/plugin-todo-backend": "^0.1.29-next.0",
"@gitbeaker/node": "^35.1.0",
"@octokit/rest": "^18.5.3",
@@ -75,7 +75,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@types/dockerode": "^3.3.0",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5",
diff --git a/packages/backend/src/plugins/auth.ts b/packages/backend/src/plugins/auth.ts
index 8a60b4b4bd..cd0c42afe5 100644
--- a/packages/backend/src/plugins/auth.ts
+++ b/packages/backend/src/plugins/auth.ts
@@ -14,6 +14,10 @@
* limitations under the License.
*/
+import {
+ DEFAULT_NAMESPACE,
+ stringifyEntityRef,
+} from '@backstage/catalog-model';
import {
createRouter,
providers,
@@ -89,6 +93,27 @@ export default async function createPlugin(
},
},
}),
+
+ // This is an example of how to configure the OAuth2Proxy provider as well
+ // as how to sign a user in without a matching user entity in the catalog.
+ // You can try it out using ` `
+ myproxy: providers.oauth2Proxy.create({
+ signIn: {
+ async resolver({ result }, ctx) {
+ const entityRef = stringifyEntityRef({
+ kind: 'user',
+ namespace: DEFAULT_NAMESPACE,
+ name: result.getHeader('x-forwarded-user')!,
+ });
+ return ctx.issueToken({
+ claims: {
+ sub: entityRef,
+ ent: [entityRef],
+ },
+ });
+ },
+ },
+ }),
},
});
}
diff --git a/packages/backend/src/plugins/search.ts b/packages/backend/src/plugins/search.ts
index fc91d98cfe..a0ea83ab61 100644
--- a/packages/backend/src/plugins/search.ts
+++ b/packages/backend/src/plugins/search.ts
@@ -26,7 +26,6 @@ import {
} from '@backstage/plugin-search-backend-node';
import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-techdocs-backend';
import { Router } from 'express';
-import { Duration } from 'luxon';
import { PluginEnvironment } from '../types';
async function createSearchEngine(
@@ -57,11 +56,11 @@ export default async function createPlugin(
});
const schedule = env.scheduler.createScheduledTaskRunner({
- frequency: Duration.fromObject({ minutes: 10 }),
- timeout: Duration.fromObject({ minutes: 15 }),
+ frequency: { minutes: 10 },
+ timeout: { minutes: 15 },
// A 3 second delay gives the backend server a chance to initialize before
// any collators are executed, which may attempt requests against the API.
- initialDelay: Duration.fromObject({ seconds: 3 }),
+ initialDelay: { seconds: 3 },
});
// Collators are responsible for gathering documents known to plugins. This
diff --git a/packages/backend/src/plugins/techInsights.ts b/packages/backend/src/plugins/techInsights.ts
index 94ce27656a..80ac559859 100644
--- a/packages/backend/src/plugins/techInsights.ts
+++ b/packages/backend/src/plugins/techInsights.ts
@@ -38,6 +38,7 @@ export default async function createPlugin(
database: env.database,
scheduler: env.scheduler,
discovery: env.discovery,
+ tokenManager: env.tokenManager,
factRetrievers: [
createFactRetrieverRegistration({
cadence: '1 1 1 * *', // Example cron, At 01:01 on day-of-month 1.
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index de67cbaf80..da3e112df8 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/cli
+## 0.17.1-next.1
+
+### Patch Changes
+
+- 52fb9920ac: Fixed coverage configuration when using `BACKSTAGE_NEXT_TESTS`.
+- 6cd1f50ae1: Extended lint rule to prevents imports of stories or tests from production code.
+- 4d8736eded: Changed Rollup configuration for TypeScript definition plugin to ignore `css`,
+ `scss`, `sass`, `svg`, `eot`, `woff`, `woff2` and `ttf` files.
+- 2737777e02: Added the ability to help a user get started with a new organization
+
## 0.17.1-next.0
### Patch Changes
diff --git a/packages/cli/config/eslint-factory.js b/packages/cli/config/eslint-factory.js
index e04e3bdb2d..e86146048e 100644
--- a/packages/cli/config/eslint-factory.js
+++ b/packages/cli/config/eslint-factory.js
@@ -130,8 +130,14 @@ function createConfig(dir, extraConfig = {}) {
...(restrictedImports ?? []),
...(restrictedSrcImports ?? []),
],
- // Avoid cross-package imports
- patterns: ['**/../../**/*/src/**', '**/../../**/*/src'],
+ patterns: [
+ // Avoid cross-package imports
+ '**/../../**/*/src/**',
+ '**/../../**/*/src',
+ // Prevent imports of stories or tests
+ '*.stories*',
+ '*.test*',
+ ],
},
],
diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js
index e5e08b4546..21f4462eab 100644
--- a/packages/cli/config/jest.js
+++ b/packages/cli/config/jest.js
@@ -123,7 +123,7 @@ async function getProjectConfig(targetPath, displayName) {
...(displayName && { displayName }),
rootDir: path.resolve(targetPath, 'src'),
coverageDirectory: path.resolve(targetPath, 'coverage'),
- coverageProvider: envOptions.nextTests ? undefined : 'v8',
+ coverageProvider: envOptions.nextTests ? 'babel' : 'v8',
collectCoverageFrom: ['**/*.{js,jsx,ts,tsx,mjs,cjs}', '!**/*.d.ts'],
moduleNameMapper: {
'\\.(css|less|scss|sss|styl)$': require.resolve('jest-css-modules'),
diff --git a/packages/cli/package.json b/packages/cli/package.json
index 67af644dfa..5440982d73 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.17.1-next.0",
+ "version": "0.17.1-next.1",
"private": false,
"publishConfig": {
"access": "public"
@@ -125,13 +125,13 @@
"zod": "^3.11.6"
},
"devDependencies": {
- "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-common": "^0.13.3-next.1",
"@backstage/config": "^1.0.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@types/diff": "^5.0.0",
"@types/express": "^4.17.6",
diff --git a/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts b/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts
index 58a3e97a9a..0fe321541e 100644
--- a/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts
+++ b/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts
@@ -60,14 +60,20 @@ export class GithubCreateAppServer {
private baseUrl?: string;
private webhookUrl?: string;
- static async run({ org }: { org: string }): Promise {
- const encodedOrg = encodeURIComponent(org);
+ static async run(options: {
+ org: string;
+ readWrite: boolean;
+ }): Promise {
+ const encodedOrg = encodeURIComponent(options.org);
const actionUrl = `https://github.com/organizations/${encodedOrg}/settings/apps/new`;
- const server = new GithubCreateAppServer(actionUrl);
+ const server = new GithubCreateAppServer(actionUrl, options.readWrite);
return server.start();
}
- constructor(private readonly actionUrl: string) {
+ private constructor(
+ private readonly actionUrl: string,
+ private readonly readWrite: boolean,
+ ) {
const webhookId = crypto
.randomBytes(15)
.toString('base64')
@@ -122,6 +128,13 @@ export class GithubCreateAppServer {
url: this.webhookUrl,
active: false,
},
+ ...(this.readWrite && {
+ default_permissions: {
+ contents: 'write',
+ actions: 'write',
+ metadata: 'read',
+ },
+ }),
};
const manifestJson = JSON.stringify(manifest).replace(/\"/g, '"');
diff --git a/packages/cli/src/commands/create-github-app/index.ts b/packages/cli/src/commands/create-github-app/index.ts
index 32fa1e9a6d..175530402e 100644
--- a/packages/cli/src/commands/create-github-app/index.ts
+++ b/packages/cli/src/commands/create-github-app/index.ts
@@ -17,16 +17,29 @@
import fs from 'fs-extra';
import chalk from 'chalk';
import { stringify as stringifyYaml } from 'yaml';
+import inquirer, { Question, Answers } from 'inquirer';
import { paths } from '../../lib/paths';
import { GithubCreateAppServer } from './GithubCreateAppServer';
import fetch from 'node-fetch';
-
+import openBrowser from 'react-dev-utils/openBrowser';
// This is an experimental command that at this point does not support GitHub Enterprise
// due to lacking support for creating apps from manifests.
// https://docs.github.com/en/free-pro-team@latest/developers/apps/creating-a-github-app-from-a-manifest
export default async (org: string) => {
+ const answers: Answers = await inquirer.prompt([
+ {
+ type: 'list',
+ name: 'appType',
+ message: chalk.blue('What will the app be used for [required]'),
+ choices: ['Read and Write (needed by Software Templates)', 'Read only'],
+ },
+ ]);
+ const readWrite = answers.appType !== 'Read only';
await verifyGithubOrg(org);
- const { slug, name, ...config } = await GithubCreateAppServer.run({ org });
+ const { slug, name, ...config } = await GithubCreateAppServer.run({
+ org,
+ readWrite,
+ });
const fileName = `github-app-${slug}-credentials.yaml`;
const content = `# Name: ${name}\n${stringifyYaml(config)}`;
@@ -67,8 +80,33 @@ async function verifyGithubOrg(org: string): Promise {
}
if (response?.status === 404) {
- throw new Error(
- `GitHub organization '${org}' does not exist. Please verify the name and try again.`,
+ const questions: Question[] = [
+ {
+ type: 'confirm',
+ name: 'shouldCreateOrg',
+ message: `GitHub organization ${chalk.cyan(
+ org,
+ )} does not exist. Would you like to create a new Organization instead?`,
+ },
+ ];
+
+ const answers = await inquirer.prompt(questions);
+
+ if (!answers.shouldCreateOrg) {
+ console.log(
+ chalk.yellow('GitHub organization must exist to create GitHub app'),
+ );
+ process.exit(1);
+ }
+
+ openBrowser('https://github.com/account/organizations/new');
+
+ console.log(
+ chalk.yellow(
+ 'Please re-run this command when you have created your new organization',
+ ),
);
+
+ process.exit(0);
}
}
diff --git a/packages/cli/src/lib/builder/config.ts b/packages/cli/src/lib/builder/config.ts
index fe91cedbb0..1cfaf15bfc 100644
--- a/packages/cli/src/lib/builder/config.ts
+++ b/packages/cli/src/lib/builder/config.ts
@@ -154,6 +154,16 @@ export async function makeRollupConfigs(
file: resolvePath(distDir, 'index.d.ts'),
format: 'es',
},
+ external: [
+ /\.css$/,
+ /\.scss$/,
+ /\.sass$/,
+ /\.svg$/,
+ /\.eot$/,
+ /\.woff$/,
+ /\.woff2$/,
+ /\.ttf$/,
+ ],
onwarn,
plugins: [dts()],
});
diff --git a/packages/config/package.json b/packages/config/package.json
index 3fda38f6a4..bca6968b01 100644
--- a/packages/config/package.json
+++ b/packages/config/package.json
@@ -37,7 +37,7 @@
"lodash": "^4.17.21"
},
"devDependencies": {
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@types/jest": "^26.0.7",
"@types/node": "^14.14.32"
},
diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md
index 675365ed27..d9450a53c5 100644
--- a/packages/core-app-api/CHANGELOG.md
+++ b/packages/core-app-api/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/core-app-api
+## 1.0.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 1.0.1
### Patch Changes
diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json
index e7ba7fcf47..c4d9ea050f 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.0.1",
+ "version": "1.0.2-next.0",
"private": false,
"publishConfig": {
"access": "public",
@@ -34,7 +34,7 @@
},
"dependencies": {
"@backstage/config": "^1.0.0",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/types": "^1.0.0",
"@backstage/version-bridge": "^1.0.1",
"@types/prop-types": "^15.7.3",
@@ -49,8 +49,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md
index dc246eaa52..147f4b4f52 100644
--- a/packages/core-components/CHANGELOG.md
+++ b/packages/core-components/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/core-components
+## 0.9.4-next.0
+
+### Patch Changes
+
+- ac19f82936: Added ARIA landmark to Page component and added ARIA landmark to DesktopSidebar and Sidebar components
+- c0055ece91: Announce external links to screen readers
+- cfc0f2e5bd: Added optional anchorOrigin alignment prop to AlertDisplay
+- f4380eb602: Add an aria-label to the support button to improve accessibility for screen readers
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.9.3
### Patch Changes
diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md
index 3b3a589ecb..a195d62496 100644
--- a/packages/core-components/api-report.md
+++ b/packages/core-components/api-report.md
@@ -51,8 +51,16 @@ import { Theme } from '@material-ui/core/styles';
import { TooltipProps } from '@material-ui/core/Tooltip';
import { WithStyles } from '@material-ui/core/styles';
+// @public (undocumented)
+export function AlertDisplay(props: AlertDisplayProps): JSX.Element | null;
+
// @public
-export function AlertDisplay(_props: {}): JSX.Element | null;
+export type AlertDisplayProps = {
+ anchorOrigin?: {
+ vertical: 'top' | 'bottom';
+ horizontal: 'left' | 'center' | 'right';
+ };
+};
// @public
enum Alignment {
diff --git a/packages/core-components/package.json b/packages/core-components/package.json
index 8060ddfc8d..35ba6db9c5 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.9.3",
+ "version": "0.9.4-next.0",
"private": false,
"publishConfig": {
"access": "public",
@@ -34,7 +34,7 @@
},
"dependencies": {
"@backstage/config": "^1.0.0",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
"@backstage/theme": "^0.2.15",
"@material-table/core": "^3.1.0",
@@ -78,9 +78,9 @@
"react-dom": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/packages/core-components/src/components/AlertDisplay/AlertDisplay.tsx b/packages/core-components/src/components/AlertDisplay/AlertDisplay.tsx
index 5d90979557..3af261da23 100644
--- a/packages/core-components/src/components/AlertDisplay/AlertDisplay.tsx
+++ b/packages/core-components/src/components/AlertDisplay/AlertDisplay.tsx
@@ -28,13 +28,25 @@ import pluralize from 'pluralize';
* @public
* @remarks
*
- * Shown as SnackBar at the top of the page
+ * Shown as SnackBar at the center top of the page by default. Configurable with props.
*/
+
// TODO: improve on this and promote to a shared component for use by all apps.
-export function AlertDisplay(_props: {}) {
+
+export type AlertDisplayProps = {
+ anchorOrigin?: {
+ vertical: 'top' | 'bottom';
+ horizontal: 'left' | 'center' | 'right';
+ };
+};
+
+/** @public */
+export function AlertDisplay(props: AlertDisplayProps) {
const [messages, setMessages] = useState>([]);
const alertApi = useApi(alertApiRef);
+ const { anchorOrigin = { vertical: 'top', horizontal: 'center' } } = props;
+
useEffect(() => {
const subscription = alertApi
.alert$()
@@ -56,7 +68,7 @@ export function AlertDisplay(_props: {}) {
};
return (
-
+
/^([a-z+.-]+):/.test(uri);
export type LinkProps = MaterialLinkProps &
@@ -62,6 +78,7 @@ const getNodeText = (node: React.ReactNode): string => {
*/
export const Link = React.forwardRef(
({ onClick, noTrack, ...props }, ref) => {
+ const classes = useStyles();
const analytics = useAnalytics();
const to = String(props.to);
const linkText = getNodeText(props.children) || to;
@@ -83,7 +100,10 @@ export const Link = React.forwardRef(
onClick={handleClick}
{...(newWindow ? { target: '_blank', rel: 'noopener' } : {})}
{...props}
- />
+ >
+ {props.children}
+ , Opens in a new window
+
) : (
// Interact with React Router for internal links
}
diff --git a/packages/core-components/src/layout/Page/Page.tsx b/packages/core-components/src/layout/Page/Page.tsx
index 0b35a59d8f..9bfc16fea3 100644
--- a/packages/core-components/src/layout/Page/Page.tsx
+++ b/packages/core-components/src/layout/Page/Page.tsx
@@ -52,7 +52,7 @@ export function Page(props: Props) {
page: baseTheme.getPageTheme({ themeId }),
})}
>
- {children}
+ {children}
);
}
diff --git a/packages/core-components/src/layout/Sidebar/Bar.tsx b/packages/core-components/src/layout/Sidebar/Bar.tsx
index 7a0b3f5b76..ea3200176d 100644
--- a/packages/core-components/src/layout/Sidebar/Bar.tsx
+++ b/packages/core-components/src/layout/Sidebar/Bar.tsx
@@ -189,7 +189,7 @@ const DesktopSidebar = (props: DesktopSidebarProps) => {
};
return (
-
-
+
);
};
diff --git a/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx b/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx
index aefc58bc45..111bf38314 100644
--- a/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx
+++ b/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx
@@ -140,7 +140,7 @@ const OverlayMenu = ({
- {children}
+ {children}
);
};
@@ -226,6 +226,7 @@ export const MobileSidebar = (props: MobileSidebarProps) => {
{sidebarGroups}
diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md
index d4ad5dc787..6e8f7840e7 100644
--- a/packages/core-plugin-api/CHANGELOG.md
+++ b/packages/core-plugin-api/CHANGELOG.md
@@ -1,5 +1,11 @@
# @backstage/core-plugin-api
+## 1.0.2-next.0
+
+### Patch Changes
+
+- b653a5595c: The authentication APIs are no longer `@alpha`. Since the `@backstage/core-plugin-api` has no `/alpha` entrypoint, the only effect of marking the APIs as `@alpha` was to hide them in documentation. They are still expected to be widely used and there will be a migration path if they are changed in the future.
+
## 1.0.1
### Patch Changes
diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json
index c3c5a9685d..03ecdfab74 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.0.1",
+ "version": "1.0.2-next.0",
"private": false,
"publishConfig": {
"access": "public",
@@ -46,9 +46,9 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md
index 34780069e9..17cf75b922 100644
--- a/packages/create-app/CHANGELOG.md
+++ b/packages/create-app/CHANGELOG.md
@@ -1,5 +1,47 @@
# @backstage/create-app
+## 0.4.27-next.1
+
+### Patch Changes
+
+- 7b253072c6: Tweaked template to provide an example and guidance for how to configure sign-in in `packages/backend/src/plugins/auth.ts`. There is no need to add this to existing apps, but for more information about sign-in configuration, see https://backstage.io/docs/auth/identity-resolver.
+- 00fa0dada0: Removed the database choice from the `create-app` command.
+
+ This reduces the step from development to production by always installing the dependencies and templating the production configuration in `app-config.production.yaml`.
+
+ Added `app-config.local.yaml` to allow for local configuration overrides.
+ To replicate this behavior in an existing installation simply `touch app-config.local.yaml` in the project root and apply your local configuration.
+
+ `better-sqlite3` has been moved to devDependencies, for existing installations using postgres in production and SQLite in development it's recommended to move SQLite into the devDependencies section to avoid unnecessary dependencies during builds.
+
+ in `packages/backend/package.json`
+
+ ```diff
+ "dependencies": {
+ ...
+ "pg": "^8.3.0",
+ - "better-sqlite3": "^7.5.0",
+ "winston": "^3.2.1"
+ },
+ "devDependencies": {
+ ...
+ "@types/luxon": "^2.0.4",
+ + "better-sqlite3": "^7.5.0"
+ }
+ ```
+
+- d41f19ca2a: Bumped the `typescript` version in the template to `~4.6.4`.
+
+ To apply this change to an existing app, make the following change to the root `package.json`:
+
+ ```diff
+ dependencies: {
+ ...
+ - "typescript": "~4.5.4"
+ + "typescript": "~4.6.4"
+ },
+ ```
+
## 0.4.27-next.0
### Patch Changes
diff --git a/packages/create-app/package.json b/packages/create-app/package.json
index 94641115fe..b2b42128d0 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.27-next.0",
+ "version": "0.4.27-next.1",
"private": false,
"publishConfig": {
"access": "public"
diff --git a/packages/create-app/src/createApp.ts b/packages/create-app/src/createApp.ts
index 83584445b0..824d1d967e 100644
--- a/packages/create-app/src/createApp.ts
+++ b/packages/create-app/src/createApp.ts
@@ -50,15 +50,7 @@ export default async (opts: OptionValues): Promise => {
return true;
},
},
- {
- type: 'list',
- name: 'dbType',
- message: chalk.blue('Select database for the backend [required]'),
- choices: ['SQLite', 'PostgreSQL'],
- },
]);
- answers.dbTypePG = answers.dbType === 'PostgreSQL';
- answers.dbTypeSqlite = answers.dbType === 'SQLite';
const templateDir = paths.resolveOwn('templates/default-app');
const tempDir = resolvePath(os.tmpdir(), answers.name);
diff --git a/packages/create-app/templates/default-app/.dockerignore b/packages/create-app/templates/default-app/.dockerignore
index 5c3b1360e0..505a7b54fa 100644
--- a/packages/create-app/templates/default-app/.dockerignore
+++ b/packages/create-app/templates/default-app/.dockerignore
@@ -1,6 +1,6 @@
.git
node_modules
-packages
-!packages/backend/dist
+packages/*/src
+packages/*/node_modules
plugins
*.local.yaml
diff --git a/packages/create-app/templates/default-app/app-config.local.yaml b/packages/create-app/templates/default-app/app-config.local.yaml
new file mode 100644
index 0000000000..976293b546
--- /dev/null
+++ b/packages/create-app/templates/default-app/app-config.local.yaml
@@ -0,0 +1 @@
+# Backstage override configuration for your local development environment
diff --git a/packages/create-app/templates/default-app/app-config.production.yaml b/packages/create-app/templates/default-app/app-config.production.yaml
index c180bbfdec..b9dd00bb01 100644
--- a/packages/create-app/templates/default-app/app-config.production.yaml
+++ b/packages/create-app/templates/default-app/app-config.production.yaml
@@ -17,3 +17,18 @@ backend:
# backend will bind on the interface that corresponds to the backend.baseUrl
# hostname.
host: 0.0.0.0
+
+ # config options: https://node-postgres.com/api/client
+ database:
+ client: pg
+ connection:
+ host: ${POSTGRES_HOST}
+ port: ${POSTGRES_PORT}
+ user: ${POSTGRES_USER}
+ password: ${POSTGRES_PASSWORD}
+ # https://node-postgres.com/features/ssl
+ # you can set the sslmode configuration option via the `PGSSLMODE` environment variable
+ # see https://www.postgresql.org/docs/current/libpq-ssl.html Table 33.1. SSL Mode Descriptions (e.g. require)
+ # ssl:
+ # ca: # if you have a CA file and want to verify it you can uncomment this section
+ # $file: /ca/server.crt
diff --git a/packages/create-app/templates/default-app/app-config.yaml.hbs b/packages/create-app/templates/default-app/app-config.yaml.hbs
index e274ffeaf2..2bf366d756 100644
--- a/packages/create-app/templates/default-app/app-config.yaml.hbs
+++ b/packages/create-app/templates/default-app/app-config.yaml.hbs
@@ -26,27 +26,11 @@ backend:
origin: http://localhost:3000
methods: [GET, POST, PUT, DELETE]
credentials: true
- {{#if dbTypeSqlite}}
+ # This is for local developement only, it is not recommended to use this in production
+ # The production database configuration is stored in app-config.production.yaml
database:
client: better-sqlite3
connection: ':memory:'
- {{/if}}
- {{#if dbTypePG}}
- # config options: https://node-postgres.com/api/client
- database:
- client: pg
- connection:
- host: ${POSTGRES_HOST}
- port: ${POSTGRES_PORT}
- user: ${POSTGRES_USER}
- password: ${POSTGRES_PASSWORD}
- # https://node-postgres.com/features/ssl
- # you can set the sslmode configuration option via the `PGSSLMODE` environment variable
- # see https://www.postgresql.org/docs/current/libpq-ssl.html Table 33.1. SSL Mode Descriptions (e.g. require)
- # ssl:
- # ca: # if you have a CA file and want to verify it you can uncomment this section
- # $file: /ca/server.crt
- {{/if}}
cache:
store: memory
# workingDirectory: /tmp # Use this to configure a working directory for the scaffolder, defaults to the OS temp-dir
diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs
index 5bdbec7971..d4cf4fb5fe 100644
--- a/packages/create-app/templates/default-app/package.json.hbs
+++ b/packages/create-app/templates/default-app/package.json.hbs
@@ -35,7 +35,7 @@
"concurrently": "^6.0.0",
"lerna": "^4.0.0",
"prettier": "^2.3.2",
- "typescript": "~4.5.4"
+ "typescript": "~4.6.4"
},
"resolutions": {
"@types/react": "^17",
diff --git a/packages/create-app/templates/default-app/packages/backend/package.json.hbs b/packages/create-app/templates/default-app/packages/backend/package.json.hbs
index 939b13bf86..3bd070ee9b 100644
--- a/packages/create-app/templates/default-app/packages/backend/package.json.hbs
+++ b/packages/create-app/templates/default-app/packages/backend/package.json.hbs
@@ -30,29 +30,22 @@
"@backstage/plugin-proxy-backend": "^{{version '@backstage/plugin-proxy-backend'}}",
"@backstage/plugin-scaffolder-backend": "^{{version '@backstage/plugin-scaffolder-backend'}}",
"@backstage/plugin-search-backend": "^{{version '@backstage/plugin-search-backend'}}",
- {{#if dbTypePG}}
"@backstage/plugin-search-backend-module-pg": "^{{version '@backstage/plugin-search-backend-module-pg'}}",
- {{/if}}
"@backstage/plugin-search-backend-node": "^{{version '@backstage/plugin-search-backend-node'}}",
"@backstage/plugin-techdocs-backend": "^{{version '@backstage/plugin-techdocs-backend'}}",
"dockerode": "^3.3.1",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
- "luxon": "^2.0.2",
- {{#if dbTypePG}}
"pg": "^8.3.0",
- {{/if}}
- {{#if dbTypeSqlite}}
- "better-sqlite3": "^7.5.0",
- {{/if}}
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^{{version '@backstage/cli'}}",
"@types/dockerode": "^3.3.0",
- "@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5",
- "@types/luxon": "^2.0.4"
+ "@types/express": "^4.17.6",
+ "@types/luxon": "^2.0.4",
+ "better-sqlite3": "^7.5.0"
},
"files": [
"dist"
diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts
index 1476e66150..13f18c55e9 100644
--- a/packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts
+++ b/packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts
@@ -1,4 +1,8 @@
-import { createRouter } from '@backstage/plugin-auth-backend';
+import {
+ createRouter,
+ providers,
+ defaultAuthProviderFactories,
+} from '@backstage/plugin-auth-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
@@ -11,5 +15,22 @@ export default async function createPlugin(
database: env.database,
discovery: env.discovery,
tokenManager: env.tokenManager,
+ providerFactories: {
+ ...defaultAuthProviderFactories,
+
+ // This overrides the default GitHub auth provider with a custom one.
+ // Since the options are empty it will behave just like the default
+ // provider, but if you uncomment the `signIn` section you will enable
+ // sign-in via GitHub. This particular configuration uses a resolver
+ // that matches the username to the user entity name. See the auth
+ // documentation for more details on how to enable and customize sign-in:
+ //
+ // https://backstage.io/docs/auth/identity-resolver
+ github: providers.github.create({
+ // signIn: {
+ // resolver: providers.github.resolvers.usernameMatchingUserEntityName(),
+ // },
+ }),
+ },
});
}
diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts.hbs b/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts.hbs
index 62bc3056cc..e9469dcc1f 100644
--- a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts.hbs
+++ b/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts.hbs
@@ -4,40 +4,29 @@ import {
IndexBuilder,
LunrSearchEngine,
} from '@backstage/plugin-search-backend-node';
-{{#if dbTypePG}}
-import { PgSearchEngine } from '@backstage/plugin-search-backend-module-pg';
-{{/if}}
import { PluginEnvironment } from '../types';
import { DefaultCatalogCollatorFactory } from '@backstage/plugin-catalog-backend';
import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-techdocs-backend';
import { Router } from 'express';
-import { Duration } from 'luxon';
export default async function createPlugin(
env: PluginEnvironment,
): Promise {
// Initialize a connection to a search engine.
- {{#if dbTypeSqlite}}
const searchEngine = new LunrSearchEngine({
logger: env.logger,
});
- {{/if}}
- {{#if dbTypePG}}
- const searchEngine = (await PgSearchEngine.supported(env.database))
- ? await PgSearchEngine.from({ database: env.database })
- : new LunrSearchEngine({ logger: env.logger });
- {{/if}}
const indexBuilder = new IndexBuilder({
logger: env.logger,
searchEngine,
});
const schedule = env.scheduler.createScheduledTaskRunner({
- frequency: Duration.fromObject({ minutes: 10 }),
- timeout: Duration.fromObject({ minutes: 15 }),
+ frequency: { minutes: 10 },
+ timeout: { minutes: 15 },
// A 3 second delay gives the backend server a chance to initialize before
// any collators are executed, which may attempt requests against the API.
- initialDelay: Duration.fromObject({ seconds: 3 }),
+ initialDelay: { seconds: 3 },
});
// Collators are responsible for gathering documents known to plugins. This
diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md
index e0567953e0..c14cb2b35e 100644
--- a/packages/dev-utils/CHANGELOG.md
+++ b/packages/dev-utils/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/dev-utils
+## 1.0.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/test-utils@1.1.0-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/app-defaults@1.0.2-next.0
+ - @backstage/integration-react@1.1.0-next.1
+ - @backstage/core-app-api@1.0.2-next.0
+
## 1.0.2-next.0
### Patch Changes
diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json
index 88e8e94aa1..e70b3c2e4e 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.2-next.0",
+ "version": "1.0.2-next.1",
"private": false,
"publishConfig": {
"access": "public",
@@ -33,14 +33,14 @@
"start": "backstage-cli package start"
},
"dependencies": {
- "@backstage/app-defaults": "^1.0.1",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/app-defaults": "^1.0.2-next.0",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/catalog-model": "^1.0.1",
- "@backstage/integration-react": "^1.1.0-next.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/integration-react": "^1.1.0-next.1",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -59,7 +59,7 @@
"react-dom": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@types/jest": "^26.0.7",
"@types/node": "^14.14.32"
},
diff --git a/packages/e2e-test/src/commands/run.ts b/packages/e2e-test/src/commands/run.ts
index dc257c6f29..e1477d98d7 100644
--- a/packages/e2e-test/src/commands/run.ts
+++ b/packages/e2e-test/src/commands/run.ts
@@ -21,6 +21,7 @@ import handlebars from 'handlebars';
import killTree from 'tree-kill';
import { resolve as resolvePath, join as joinPath } from 'path';
import puppeteer from 'puppeteer';
+import path from 'path';
import {
spawnPiped,
@@ -49,9 +50,8 @@ export async function run() {
print('Building dist workspace');
const workspaceDir = await buildDistWorkspace('workspace', rootDir);
- const isPostgres = Boolean(process.env.POSTGRES_USER);
print('Creating a Backstage App');
- const appDir = await createApp('test-app', isPostgres, workspaceDir, rootDir);
+ const appDir = await createApp('test-app', workspaceDir, rootDir);
print('Creating a Backstage Plugin');
const pluginName = await createPlugin('test-plugin', appDir);
@@ -62,8 +62,21 @@ export async function run() {
print('Starting the app');
await testAppServe(pluginName, appDir);
- print('Testing the backend startup');
- await testBackendStart(appDir, isPostgres);
+ if (Boolean(process.env.POSTGRES_USER)) {
+ print('Testing the PostgreSQL backend startup');
+ await preCleanPostgres();
+ const appConfig = path.resolve(appDir, 'app-config.yaml');
+ const productionConfig = path.resolve(appDir, 'app-config.production.yaml');
+ await testBackendStart(
+ appDir,
+ '--config',
+ appConfig,
+ '--config',
+ productionConfig,
+ );
+ }
+ print('Testing the SQLite backend startup');
+ await testBackendStart(appDir);
if (process.env.CI) {
// Cleanup actually takes significant time, so skip it in CI since the
@@ -100,8 +113,8 @@ async function buildDistWorkspace(workspaceName: string, rootDir: string) {
}
for (const pkgJsonPath of templatePackagePaths) {
- const path = paths.resolveOwnRoot(pkgJsonPath);
- const pkgTemplate = await fs.readFile(path, 'utf8');
+ const jsonPath = paths.resolveOwnRoot(pkgJsonPath);
+ const pkgTemplate = await fs.readFile(jsonPath, 'utf8');
const pkg = JSON.parse(
handlebars.compile(pkgTemplate)(
{
@@ -191,7 +204,6 @@ async function pinYarnVersion(dir: string) {
*/
async function createApp(
appName: string,
- isPostgres: boolean,
workspaceDir: string,
rootDir: string,
) {
@@ -215,14 +227,6 @@ async function createApp(
await waitFor(() => stdout.includes('Enter a name for the app'));
child.stdin?.write(`${appName}\n`);
- await waitFor(() => stdout.includes('Select database for the backend'));
-
- if (isPostgres) {
- // Simulate down arrow press
- child.stdin?.write(`\u001B\u005B\u0042`);
- }
- child.stdin?.write(`\n`);
-
print('Waiting for app create script to be done');
await waitForExit(child);
@@ -404,33 +408,34 @@ async function dropDB(database: string) {
};
try {
- await pgtools.dropdb({ config }, database);
+ await pgtools.dropdb(config, database);
} catch (_) {
/* do nothing*/
}
}
+/** Clean remnants from prior e2e runs */
+async function preCleanPostgres() {
+ print('Dropping old DBs');
+ await Promise.all(
+ [
+ 'catalog',
+ 'scaffolder',
+ 'auth',
+ 'identity',
+ 'proxy',
+ 'techdocs',
+ 'search',
+ ].map(name => dropDB(`backstage_plugin_${name}`)),
+ );
+ print('Created DBs');
+}
+
/**
* Start serving the newly created backend and make sure that all db migrations works correctly
*/
-async function testBackendStart(appDir: string, isPostgres: boolean) {
- if (isPostgres) {
- print('Dropping old DBs');
- await Promise.all(
- [
- 'catalog',
- 'scaffolder',
- 'auth',
- 'identity',
- 'proxy',
- 'techdocs',
- 'search',
- ].map(name => dropDB(`backstage_plugin_${name}`)),
- );
- print('Created DBs');
- }
-
- const child = spawnPiped(['yarn', 'workspace', 'backend', 'start'], {
+async function testBackendStart(appDir: string, ...args: string[]) {
+ const child = spawnPiped(['yarn', 'workspace', 'backend', 'start', ...args], {
cwd: appDir,
env: {
...process.env,
diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md
index 06e985a149..7b3171f8d2 100644
--- a/packages/integration-react/CHANGELOG.md
+++ b/packages/integration-react/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/integration-react
+## 1.1.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 1.1.0-next.0
### Minor Changes
diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json
index 1c3ebbb31b..8b27eebab4 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.0-next.0",
+ "version": "1.1.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -25,8 +25,8 @@
},
"dependencies": {
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/integration": "^1.2.0-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
@@ -38,9 +38,9 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/packages/integration/package.json b/packages/integration/package.json
index 0e0e2bf18e..f0da96b54f 100644
--- a/packages/integration/package.json
+++ b/packages/integration/package.json
@@ -42,9 +42,9 @@
"lodash": "^4.17.21"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@backstage/config-loader": "^1.1.1-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@types/jest": "^26.0.7",
"@types/luxon": "^2.0.4",
"msw": "^0.35.0"
diff --git a/packages/release-manifests/package.json b/packages/release-manifests/package.json
index 4557532194..536b13c4c9 100644
--- a/packages/release-manifests/package.json
+++ b/packages/release-manifests/package.json
@@ -36,7 +36,7 @@
"cross-fetch": "^3.1.5"
},
"devDependencies": {
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/test-utils": "^1.1.0-next.1",
"msw": "^0.35.0",
"@types/jest": "^26.0.7",
"@types/node": "^14.14.32"
diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md
index 0fd55b8167..570aeb4b55 100644
--- a/packages/techdocs-cli-embedded-app/CHANGELOG.md
+++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md
@@ -1,5 +1,21 @@
# techdocs-cli-embedded-app
+## 0.2.70-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/test-utils@1.1.0-next.1
+ - @backstage/cli@0.17.1-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog@1.2.0-next.1
+ - @backstage/plugin-techdocs-react@0.1.1-next.1
+ - @backstage/plugin-techdocs@1.1.1-next.1
+ - @backstage/app-defaults@1.0.2-next.0
+ - @backstage/integration-react@1.1.0-next.1
+ - @backstage/core-app-api@1.0.2-next.0
+
## 0.2.70-next.0
### Patch Changes
diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json
index b356269248..697193607f 100644
--- a/packages/techdocs-cli-embedded-app/package.json
+++ b/packages/techdocs-cli-embedded-app/package.json
@@ -1,24 +1,24 @@
{
"name": "techdocs-cli-embedded-app",
- "version": "0.2.70-next.0",
+ "version": "0.2.70-next.1",
"private": true,
"backstage": {
"role": "frontend"
},
"bundled": true,
"dependencies": {
- "@backstage/app-defaults": "^1.0.1",
+ "@backstage/app-defaults": "^1.0.2-next.0",
"@backstage/catalog-model": "^1.0.1",
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@backstage/config": "^1.0.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/integration-react": "^1.1.0-next.0",
- "@backstage/plugin-catalog": "^1.2.0-next.0",
- "@backstage/plugin-techdocs": "^1.1.1-next.0",
- "@backstage/plugin-techdocs-react": "^0.1.1-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/integration-react": "^1.1.0-next.1",
+ "@backstage/plugin-catalog": "^1.2.0-next.1",
+ "@backstage/plugin-techdocs": "^1.1.1-next.1",
+ "@backstage/plugin-techdocs-react": "^0.1.1-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -30,7 +30,7 @@
"react-use": "^17.2.4"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/packages/techdocs-cli-embedded-app/src/apis.ts b/packages/techdocs-cli-embedded-app/src/apis.ts
index d230a9f83c..7156da902f 100644
--- a/packages/techdocs-cli-embedded-app/src/apis.ts
+++ b/packages/techdocs-cli-embedded-app/src/apis.ts
@@ -35,7 +35,7 @@ import {
techdocsApiRef,
TechDocsStorageApi,
techdocsStorageApiRef,
-} from '@backstage/plugin-techdocs';
+} from '@backstage/plugin-techdocs-react';
// TODO: Export type from plugin-techdocs and import this here
// import { ParsedEntityId } from '@backstage/plugin-techdocs'
diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md
index f7e3b9c006..500e8d9091 100644
--- a/packages/techdocs-cli/CHANGELOG.md
+++ b/packages/techdocs-cli/CHANGELOG.md
@@ -1,5 +1,13 @@
# @techdocs/cli
+## 1.1.1-next.1
+
+### Patch Changes
+
+- 52fddad92d: The TechDocs CLI's embedded app now imports all API refs from the `@backstage/plugin-techdocs-react` package.
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+
## 1.1.1-next.0
### Patch Changes
diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json
index be41a88c7e..73496350a2 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.1.1-next.0",
+ "version": "1.1.1-next.1",
"private": false,
"publishConfig": {
"access": "public"
@@ -37,7 +37,7 @@
"techdocs-cli": "bin/techdocs-cli"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@types/commander": "^2.12.2",
"@types/fs-extra": "^9.0.6",
"@types/http-proxy": "^1.17.4",
@@ -62,7 +62,7 @@
"ext": "ts"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-common": "^0.13.3-next.1",
"@backstage/catalog-model": "^1.0.1",
"@backstage/cli-common": "^0.1.8",
"@backstage/config": "^1.0.0",
diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md
index c7453f6dda..e81cf8679d 100644
--- a/packages/test-utils/CHANGELOG.md
+++ b/packages/test-utils/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/test-utils
+## 1.1.0-next.1
+
+### Minor Changes
+
+- 1da8b248c2: Added the options parameter to `renderWithEffects`, which if forwarded to the `render` function from `@testling-library/react`. Initially only the `wrapper` option is supported.
+- 1da8b248c2: Added `createTestAppWrapper`, which returns a component that can be used as the `wrapper` option for `render` or `renderWithEffects`.
+
+### Patch Changes
+
+- 1da8b248c2: Fixed `renderInTestApp` so that it is able to re-render the result without removing the app wrapping.
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/core-app-api@1.0.2-next.0
+ - @backstage/plugin-permission-react@0.4.1-next.0
+
## 1.0.2-next.0
### Patch Changes
diff --git a/packages/test-utils/api-report.md b/packages/test-utils/api-report.md
index 94ef7af51e..38d6a85f5f 100644
--- a/packages/test-utils/api-report.md
+++ b/packages/test-utils/api-report.md
@@ -27,6 +27,7 @@ import { Observable } from '@backstage/types';
import { PermissionApi } from '@backstage/plugin-permission-react';
import { ReactElement } from 'react';
import { ReactNode } from 'react';
+import { RenderOptions } from '@testing-library/react';
import { RenderResult } from '@testing-library/react';
import { RouteRef } from '@backstage/core-plugin-api';
import { StorageApi } from '@backstage/core-plugin-api';
@@ -40,6 +41,11 @@ export type CollectedLogs = {
[key in T]: string[];
};
+// @public
+export function createTestAppWrapper(
+ options?: TestAppOptions,
+): (props: { children: ReactNode }) => JSX.Element;
+
// @public
export type ErrorWithContext = {
error: ErrorApiError;
@@ -187,7 +193,10 @@ export function renderInTestApp(
): Promise;
// @public
-export function renderWithEffects(nodes: ReactElement): Promise;
+export function renderWithEffects(
+ nodes: ReactElement,
+ options?: Pick,
+): Promise;
// @public
export function setupRequestMockHandlers(worker: {
diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json
index a924d51541..14eed97a81 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.0.2-next.0",
+ "version": "1.1.0-next.1",
"private": false,
"publishConfig": {
"access": "public",
@@ -34,10 +34,10 @@
},
"dependencies": {
"@backstage/config": "^1.0.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/plugin-permission-common": "^0.6.0",
- "@backstage/plugin-permission-react": "^0.4.0",
+ "@backstage/plugin-permission-react": "^0.4.1-next.0",
"@backstage/theme": "^0.2.15",
"@backstage/types": "^1.0.0",
"@material-ui/core": "^4.12.2",
@@ -55,7 +55,7 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@types/jest": "^26.0.7",
"@types/node": "^16.11.26",
"msw": "^0.35.0"
diff --git a/packages/test-utils/src/testUtils/appWrappers.test.tsx b/packages/test-utils/src/testUtils/appWrappers.test.tsx
index c59f66aab5..1b0601d030 100644
--- a/packages/test-utils/src/testUtils/appWrappers.test.tsx
+++ b/packages/test-utils/src/testUtils/appWrappers.test.tsx
@@ -20,6 +20,7 @@ import {
createSubRouteRef,
errorApiRef,
useApi,
+ useApp,
useRouteRef,
} from '@backstage/core-plugin-api';
import { withLogCollector } from './logCollector';
@@ -172,4 +173,18 @@ describe('wrapInTestApp', () => {
expect(root.children.length).toBe(1);
expect(root.children[0].textContent).toBe('foo');
});
+
+ it('should support rerenders', async () => {
+ const MyComponent = () => {
+ const app = useApp();
+ const { Progress } = app.getComponents();
+ return ;
+ };
+
+ const rendered = await renderInTestApp( );
+ expect(rendered.getByTestId('progress')).toBeInTheDocument();
+
+ rendered.rerender( );
+ expect(rendered.getByTestId('progress')).toBeInTheDocument();
+ });
});
diff --git a/packages/test-utils/src/testUtils/appWrappers.tsx b/packages/test-utils/src/testUtils/appWrappers.tsx
index b12e8935b6..fd22c1a150 100644
--- a/packages/test-utils/src/testUtils/appWrappers.tsx
+++ b/packages/test-utils/src/testUtils/appWrappers.tsx
@@ -107,17 +107,15 @@ function isExternalRouteRef(
}
/**
- * Wraps a component inside a Backstage test app, providing a mocked theme
- * and app context, along with mocked APIs.
+ * Creates a Wrapper component that wraps a component inside a Backstage test app,
+ * providing a mocked theme and app context, along with mocked APIs.
*
- * @param Component - A component or react node to render inside the test app.
* @param options - Additional options for the rendering.
* @public
*/
-export function wrapInTestApp(
- Component: ComponentType | ReactNode,
+export function createTestAppWrapper(
options: TestAppOptions = {},
-): ReactElement {
+): (props: { children: ReactNode }) => JSX.Element {
const { routeEntries = ['/'] } = options;
const boundRoutes = new Map();
@@ -162,13 +160,6 @@ export function wrapInTestApp(
},
});
- let wrappedElement: React.ReactElement;
- if (Component instanceof Function) {
- wrappedElement = ;
- } else {
- wrappedElement = Component as React.ReactElement;
- }
-
const routeElements = Object.entries(options.mountedRoutes ?? {}).map(
([path, routeRef]) => {
const Page = () => Mounted at {path}
;
@@ -189,18 +180,44 @@ export function wrapInTestApp(
const AppProvider = app.getProvider();
const AppRouter = app.getRouter();
- return (
+ const TestAppWrapper = ({ children }: { children: ReactNode }) => (
{routeElements}
{/* The path of * here is needed to be set as a catch all, so it will render the wrapper element
* and work with nested routes if they exist too */}
-
+ {children}>} />
);
+
+ return TestAppWrapper;
+}
+
+/**
+ * Wraps a component inside a Backstage test app, providing a mocked theme
+ * and app context, along with mocked APIs.
+ *
+ * @param Component - A component or react node to render inside the test app.
+ * @param options - Additional options for the rendering.
+ * @public
+ */
+export function wrapInTestApp(
+ Component: ComponentType | ReactNode,
+ options: TestAppOptions = {},
+): ReactElement {
+ const TestAppWrapper = createTestAppWrapper(options);
+
+ let wrappedElement: React.ReactElement;
+ if (Component instanceof Function) {
+ wrappedElement = ;
+ } else {
+ wrappedElement = Component as React.ReactElement;
+ }
+
+ return {wrappedElement} ;
}
/**
@@ -218,5 +235,14 @@ export async function renderInTestApp(
Component: ComponentType | ReactNode,
options: TestAppOptions = {},
): Promise {
- return renderWithEffects(wrapInTestApp(Component, options));
+ let wrappedElement: React.ReactElement;
+ if (Component instanceof Function) {
+ wrappedElement = ;
+ } else {
+ wrappedElement = Component as React.ReactElement;
+ }
+
+ return renderWithEffects(wrappedElement, {
+ wrapper: createTestAppWrapper(options),
+ });
}
diff --git a/packages/test-utils/src/testUtils/index.tsx b/packages/test-utils/src/testUtils/index.tsx
index a7850fc158..bfd870e2ad 100644
--- a/packages/test-utils/src/testUtils/index.tsx
+++ b/packages/test-utils/src/testUtils/index.tsx
@@ -16,7 +16,11 @@
export * from './apis';
export { default as mockBreakpoint } from './mockBreakpoint';
-export { wrapInTestApp, renderInTestApp } from './appWrappers';
+export {
+ wrapInTestApp,
+ renderInTestApp,
+ createTestAppWrapper,
+} from './appWrappers';
export type { TestAppOptions } from './appWrappers';
export * from './msw';
export * from './logCollector';
diff --git a/packages/test-utils/src/testUtils/testingLibrary.ts b/packages/test-utils/src/testUtils/testingLibrary.ts
index bfe617a436..adb9867de8 100644
--- a/packages/test-utils/src/testUtils/testingLibrary.ts
+++ b/packages/test-utils/src/testUtils/testingLibrary.ts
@@ -15,7 +15,12 @@
*/
import { ReactElement } from 'react';
-import { act, render, RenderResult } from '@testing-library/react';
+import {
+ act,
+ render,
+ RenderOptions,
+ RenderResult,
+} from '@testing-library/react';
/**
* @public
@@ -31,10 +36,11 @@ import { act, render, RenderResult } from '@testing-library/react';
*/
export async function renderWithEffects(
nodes: ReactElement,
+ options?: Pick,
): Promise {
let value: RenderResult;
await act(async () => {
- value = render(nodes);
+ value = render(nodes, options);
});
return value!;
}
diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md
new file mode 100644
index 0000000000..e1ba8ca9ee
--- /dev/null
+++ b/plugins/adr-backend/CHANGELOG.md
@@ -0,0 +1,13 @@
+# @backstage/plugin-adr-backend
+
+## 0.1.0-next.0
+
+### Minor Changes
+
+- e73075a301: Implement ADR plugin
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-adr-common@0.1.0-next.0
+ - @backstage/backend-common@0.13.3-next.1
diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json
index e26d27ccee..17ae8aedb5 100644
--- a/plugins/adr-backend/package.json
+++ b/plugins/adr-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr-backend",
- "version": "0.0.0",
+ "version": "0.1.0-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,13 +29,13 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-common": "^0.13.3-next.1",
"@backstage/catalog-client": "^1.0.1",
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
"@backstage/errors": "^1.0.0",
"@backstage/integration": "^1.2.0-next.0",
- "@backstage/plugin-adr-common": "^0.0.0",
+ "@backstage/plugin-adr-common": "^0.1.0-next.0",
"@backstage/plugin-search-common": "^0.3.3",
"luxon": "^2.0.2",
"marked": "^4.0.14",
@@ -44,7 +44,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@types/marked": "^4.0.0",
"@types/supertest": "^2.0.8",
"supertest": "^6.1.3",
diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md
new file mode 100644
index 0000000000..2d191396b8
--- /dev/null
+++ b/plugins/adr-common/CHANGELOG.md
@@ -0,0 +1,7 @@
+# @backstage/plugin-adr-common
+
+## 0.1.0-next.0
+
+### Minor Changes
+
+- e73075a301: Implement ADR plugin
diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json
index 41e28423dc..50190fb74d 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.0.0",
+ "version": "0.1.0-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,7 +35,7 @@
"@backstage/plugin-search-common": "^0.3.3"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0"
+ "@backstage/cli": "^0.17.1-next.1"
},
"files": [
"dist"
diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md
new file mode 100644
index 0000000000..08f53893f6
--- /dev/null
+++ b/plugins/adr/CHANGELOG.md
@@ -0,0 +1,16 @@
+# @backstage/plugin-adr
+
+## 0.1.0-next.0
+
+### Minor Changes
+
+- e73075a301: Implement ADR plugin
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/plugin-adr-common@0.1.0-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/integration-react@1.1.0-next.1
diff --git a/plugins/adr/package.json b/plugins/adr/package.json
index 0f3b220ce5..08818f5b56 100644
--- a/plugins/adr/package.json
+++ b/plugins/adr/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr",
- "version": "0.0.0",
+ "version": "0.1.0-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -22,11 +22,11 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/integration-react": "^1.1.0-next.0",
- "@backstage/plugin-adr-common": "^0.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/integration-react": "^1.1.0-next.1",
+ "@backstage/plugin-adr-common": "^0.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -43,10 +43,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md
index dcd549b93a..361f6fe162 100644
--- a/plugins/airbrake/CHANGELOG.md
+++ b/plugins/airbrake/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-airbrake
+## 0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/test-utils@1.1.0-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/dev-utils@1.0.2-next.1
+
## 0.3.5-next.0
### Patch Changes
diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json
index 87e42a5b85..50ae9cb128 100644
--- a/plugins/airbrake/package.json
+++ b/plugins/airbrake/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake",
- "version": "0.3.5-next.0",
+ "version": "0.3.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,11 +24,11 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -40,10 +40,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/app-defaults": "^1.0.1",
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/app-defaults": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md
index ad74422791..35328f7b75 100644
--- a/plugins/allure/CHANGELOG.md
+++ b/plugins/allure/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-allure
+## 0.1.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.21-next.0
### Patch Changes
diff --git a/plugins/allure/package.json b/plugins/allure/package.json
index 242d0ddd2d..610f01cdc4 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.21-next.0",
+ "version": "0.1.21-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -26,9 +26,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -40,10 +40,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md
index 75c54bccf8..b43e4759ed 100644
--- a/plugins/analytics-module-ga/CHANGELOG.md
+++ b/plugins/analytics-module-ga/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-analytics-module-ga
+## 0.1.16-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.1.15
### Patch Changes
diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json
index f8c91e340e..7ffe683955 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.15",
+ "version": "0.1.16-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -25,8 +25,8 @@
},
"dependencies": {
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -38,10 +38,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md
index b324e3e4f9..9ab858e5e6 100644
--- a/plugins/apache-airflow/CHANGELOG.md
+++ b/plugins/apache-airflow/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-apache-airflow
+## 0.1.13-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.1.12
### Patch Changes
diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json
index b4ed8c94da..adc4f7c46a 100644
--- a/plugins/apache-airflow/package.json
+++ b/plugins/apache-airflow/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-apache-airflow",
- "version": "0.1.12",
+ "version": "0.1.13-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -23,8 +23,8 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
@@ -36,10 +36,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md
index 11a9c99e74..e9d356d758 100644
--- a/plugins/api-docs/CHANGELOG.md
+++ b/plugins/api-docs/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-api-docs
+## 0.8.5-next.1
+
+### Patch Changes
+
+- 2c279df4eb: Updated dependency `graphiql` to `^1.8.8`.
+- 165790975d: Updated dependency `@asyncapi/react-component` to `1.0.0-next.37`.
+- 7f6f97d151: Updated dependency `@asyncapi/react-component` to `1.0.0-next.38`.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog@1.2.0-next.1
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.8.5-next.0
### Patch Changes
diff --git a/plugins/api-docs/README.md b/plugins/api-docs/README.md
index 51588aacf4..bea820cb61 100644
--- a/plugins/api-docs/README.md
+++ b/plugins/api-docs/README.md
@@ -156,7 +156,7 @@ The Swagger UI package by expects to have a route to `/oauth2-redirect.html` whi
the redirect callback for the OAuth2 Authorization Code flow, however, this file is not installed
by this plugin.
-Grab a copy of [oauth2-redirect.html](https://github.com/swagger-api/swagger-ui/blob/master/dist/oauth2-redirect.html)
+Grab a copy of [`oauth2-redirect.html`](https://github.com/swagger-api/swagger-ui/blob/master/dist/oauth2-redirect.html)
and put it in the `app/public/` directory in order to enable Swagger UI to complete this redirection.
This also may require you to adjust `Content Security Policy` header settings of your Backstage application, so that the script in `oauth2-redirect.html` can be executed. Since the script is static we can add the hash of it directly to our CSP policy, which we do by adding the following to the `csp` section of the app configuration:
diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json
index 98ad0e4820..90416e4f4d 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.5-next.0",
+ "version": "0.8.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -33,17 +33,17 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@asyncapi/react-component": "1.0.0-next.36",
+ "@asyncapi/react-component": "1.0.0-next.38",
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog": "^1.2.0-next.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog": "^1.2.0-next.1",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
- "graphiql": "^1.5.12",
+ "graphiql": "^1.8.8",
"graphql": "^16.0.0",
"isomorphic-form-data": "^2.0.0",
"react-router": "6.0.0-beta.0",
@@ -56,10 +56,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md
index 218671f378..c80961d5e2 100644
--- a/plugins/auth-backend/CHANGELOG.md
+++ b/plugins/auth-backend/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-auth-backend
+## 0.13.1-next.1
+
+### Patch Changes
+
+- cac3ba68a2: Fixed a bug that was introduced in `0.13.1-next.0` which caused the `ent` claim of issued tokens to be dropped.
+- 5d268623dd: Updates the OAuth2 Proxy provider to require less infrastructure configuration.
+
+ The auth result object of the OAuth2 Proxy now provides access to the request headers, both through the `headers` object as well as `getHeader` method. The existing logic that parses and extracts the user information from ID tokens is deprecated and will be removed in a future release. See the OAuth2 Proxy provider documentation for more details.
+
+ The OAuth2 Proxy provider now also has a default `authHandler` implementation that reads the display name and email from the incoming request headers.
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+
## 0.13.1-next.0
### Patch Changes
diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md
index 18924f7c23..a38197668e 100644
--- a/plugins/auth-backend/api-report.md
+++ b/plugins/auth-backend/api-report.md
@@ -12,6 +12,7 @@ import { Config } from '@backstage/config';
import { Entity } from '@backstage/catalog-model';
import express from 'express';
import { GetEntitiesRequest } from '@backstage/catalog-client';
+import { IncomingHttpHeaders } from 'http';
import { JsonValue } from '@backstage/types';
import { Logger } from 'winston';
import { PluginDatabaseManager } from '@backstage/backend-common';
@@ -376,7 +377,7 @@ export const createOAuth2Provider: (
// @public @deprecated (undocumented)
export const createOauth2ProxyProvider: (options: {
- authHandler: AuthHandler>;
+ authHandler?: AuthHandler> | undefined;
signIn: {
resolver: SignInResolver>;
};
@@ -563,9 +564,11 @@ export type Oauth2ProxyProviderOptions = {
};
// @public
-export type OAuth2ProxyResult = {
+export type OAuth2ProxyResult = {
fullProfile: JWTPayload;
accessToken: string;
+ headers: IncomingHttpHeaders;
+ getHeader(name: string): string | undefined;
};
// Warning: (ae-missing-release-tag) "OAuthAdapter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
@@ -912,7 +915,7 @@ export const providers: Readonly<{
}>;
oauth2Proxy: Readonly<{
create: (options: {
- authHandler: AuthHandler>;
+ authHandler?: AuthHandler> | undefined;
signIn: {
resolver: SignInResolver>;
};
diff --git a/plugins/auth-backend/examples/docker-compose.oauth2-proxy.yaml b/plugins/auth-backend/examples/docker-compose.oauth2-proxy.yaml
new file mode 100755
index 0000000000..f00e2e0987
--- /dev/null
+++ b/plugins/auth-backend/examples/docker-compose.oauth2-proxy.yaml
@@ -0,0 +1,44 @@
+#!/usr/bin/env docker-compose -f
+
+# This docker compose file can be used to try out the oauth2-proxy auth provider.
+# You'll need to provide your own GitHub client ID and secret through
+# GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET.
+#
+# The only modifications you need to make to run this example is to switch the
+# SignInPage to the following:
+#
+#
+#
+# You also need to switch out the baseUrl and listen port of both the frontend and
+# backend, but we can do that through env vars when running `yarn dev`:
+#
+# APP_CONFIG_app_baseUrl=http://localhost APP_CONFIG_app_listen_port=3000 \
+# APP_CONFIG_backend_baseUrl=http://localhost APP_CONFIG_backend_listen_port=7007 yarn dev
+#
+# Once done, you can run the following from the root and then navigate to http://localhost
+#
+# ./plugins/auth-backend/examples/docker-compose.oauth2-proxy.yaml up
+
+version: '3'
+services:
+ proxy:
+ container_name: oauth2-proxy
+ image: quay.io/oauth2-proxy/oauth2-proxy:v7.2.1
+
+ # The below config assumes that you are running the frontend and backend
+ # in development mode, and that `host.docker.internal` resolves to the host machine.
+ command: >-
+ --cookie-secret=super-super-secret-cookie-secret
+ --cookie-secure=false
+ --http-address=0.0.0.0:80
+ --email-domain=*
+
+ --provider=github
+ --client-id=${GITHUB_CLIENT_ID}
+ --client-secret=${GITHUB_CLIENT_SECRET}
+
+ --redirect-url=http://localhost/oauth2/callback
+ --upstream=http://host.docker.internal:7007/api/,http://host.docker.internal:3000
+
+ ports:
+ - 80:80
diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json
index 834802379b..29c146963b 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.13.1-next.0",
+ "version": "0.13.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,7 +34,7 @@
},
"dependencies": {
"@backstage/plugin-auth-node": "^0.2.1-next.0",
- "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-common": "^0.13.3-next.1",
"@backstage/catalog-client": "^1.0.1",
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
@@ -77,7 +77,7 @@
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.24-next.0",
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@types/body-parser": "^1.19.0",
"@types/cookie-parser": "^1.4.2",
"@types/express-session": "^1.17.2",
diff --git a/plugins/auth-backend/src/identity/TokenFactory.test.ts b/plugins/auth-backend/src/identity/TokenFactory.test.ts
index 14b3a00a7f..3ae6b895bc 100644
--- a/plugins/auth-backend/src/identity/TokenFactory.test.ts
+++ b/plugins/auth-backend/src/identity/TokenFactory.test.ts
@@ -47,7 +47,9 @@ describe('TokenFactory', () => {
});
await expect(factory.listPublicKeys()).resolves.toEqual({ keys: [] });
- const token = await factory.issueToken({ claims: { sub: entityRef } });
+ const token = await factory.issueToken({
+ claims: { sub: entityRef, ent: [entityRef] },
+ });
const { keys } = await factory.listPublicKeys();
const keyStore = createLocalJWKSet({ keys: keys });
@@ -57,6 +59,7 @@ describe('TokenFactory', () => {
iss: 'my-issuer',
aud: 'backstage',
sub: entityRef,
+ ent: [entityRef],
iat: expect.any(Number),
exp: expect.any(Number),
});
diff --git a/plugins/auth-backend/src/identity/TokenFactory.ts b/plugins/auth-backend/src/identity/TokenFactory.ts
index b72c3ef06d..cb24d7ccd1 100644
--- a/plugins/auth-backend/src/identity/TokenFactory.ts
+++ b/plugins/auth-backend/src/identity/TokenFactory.ts
@@ -89,7 +89,7 @@ export class TokenFactory implements TokenIssuer {
throw new AuthenticationError('No algorithm was provided in the key');
}
- return new SignJWT({ iss, sub, aud, iat, exp })
+ return new SignJWT({ iss, sub, ent, aud, iat, exp })
.setProtectedHeader({ alg: key.alg, kid: key.kid })
.setIssuer(iss)
.setAudience(aud)
diff --git a/plugins/auth-backend/src/providers/auth0/provider.ts b/plugins/auth-backend/src/providers/auth0/provider.ts
index b4446caa95..3181314540 100644
--- a/plugins/auth-backend/src/providers/auth0/provider.ts
+++ b/plugins/auth-backend/src/providers/auth0/provider.ts
@@ -71,6 +71,8 @@ export class Auth0AuthProvider implements OAuthHandlers {
clientSecret: options.clientSecret,
callbackURL: options.callbackUrl,
domain: options.domain,
+ // We need passReqToCallback set to false to get params, but there's
+ // no matching type signature for that, so instead behold this beauty
passReqToCallback: false as true,
},
(
diff --git a/plugins/auth-backend/src/providers/bitbucket/provider.ts b/plugins/auth-backend/src/providers/bitbucket/provider.ts
index b149aa6d28..905181333a 100644
--- a/plugins/auth-backend/src/providers/bitbucket/provider.ts
+++ b/plugins/auth-backend/src/providers/bitbucket/provider.ts
@@ -94,9 +94,7 @@ export class BitbucketAuthProvider implements OAuthHandlers {
clientID: options.clientId,
clientSecret: options.clientSecret,
callbackURL: options.callbackUrl,
- // We need passReqToCallback set to false to get params, but there's
- // no matching type signature for that, so instead behold this beauty
- passReqToCallback: false as true,
+ passReqToCallback: false,
},
(
accessToken: any,
diff --git a/plugins/auth-backend/src/providers/google/provider.ts b/plugins/auth-backend/src/providers/google/provider.ts
index 66749c1177..233e28f750 100644
--- a/plugins/auth-backend/src/providers/google/provider.ts
+++ b/plugins/auth-backend/src/providers/google/provider.ts
@@ -73,9 +73,7 @@ export class GoogleAuthProvider implements OAuthHandlers {
clientID: options.clientId,
clientSecret: options.clientSecret,
callbackURL: options.callbackUrl,
- // We need passReqToCallback set to false to get params, but there's
- // no matching type signature for that, so instead behold this beauty
- passReqToCallback: false as true,
+ passReqToCallback: false,
},
(
accessToken: any,
diff --git a/plugins/auth-backend/src/providers/microsoft/provider.ts b/plugins/auth-backend/src/providers/microsoft/provider.ts
index 3c1110ab5e..0a4b67d667 100644
--- a/plugins/auth-backend/src/providers/microsoft/provider.ts
+++ b/plugins/auth-backend/src/providers/microsoft/provider.ts
@@ -83,7 +83,7 @@ export class MicrosoftAuthProvider implements OAuthHandlers {
callbackURL: options.callbackUrl,
authorizationURL: options.authorizationUrl,
tokenURL: options.tokenUrl,
- passReqToCallback: false as true,
+ passReqToCallback: false,
},
(
accessToken: any,
diff --git a/plugins/auth-backend/src/providers/oauth2-proxy/provider.test.ts b/plugins/auth-backend/src/providers/oauth2-proxy/provider.test.ts
index d258c17e61..f10a81c76b 100644
--- a/plugins/auth-backend/src/providers/oauth2-proxy/provider.test.ts
+++ b/plugins/auth-backend/src/providers/oauth2-proxy/provider.test.ts
@@ -25,7 +25,7 @@ import * as jose from 'jose';
import { Logger } from 'winston';
import { AuthHandler, AuthResolverContext, SignInResolver } from '../types';
import {
- createOauth2ProxyProvider,
+ oauth2Proxy,
Oauth2ProxyAuthProvider,
OAuth2ProxyResult,
OAUTH2_PROXY_JWT_HEADER,
@@ -64,6 +64,9 @@ describe('Oauth2ProxyAuthProvider', () => {
mockRequest = {
body: {},
header: jest.fn(),
+ headers: {
+ 'x-mock': 'mock',
+ },
} as unknown as jest.Mocked;
provider = new Oauth2ProxyAuthProvider({
@@ -146,6 +149,10 @@ describe('Oauth2ProxyAuthProvider', () => {
result: {
accessToken: 'token',
fullProfile: decodedToken,
+ getHeader: expect.any(Function),
+ headers: {
+ 'x-mock': 'mock',
+ },
},
},
{ _: 'resolver-context' },
@@ -167,7 +174,7 @@ describe('Oauth2ProxyAuthProvider', () => {
});
});
- describe('createOauth2ProxyProvider()', () => {
+ describe('oauth2Proxy.create()', () => {
beforeEach(() => {
mockRequest.header.mockReturnValue(`Bearer token`);
authHandler.mockResolvedValue({
@@ -179,7 +186,7 @@ describe('Oauth2ProxyAuthProvider', () => {
});
it('should create a valid provider', async () => {
- const factory = createOauth2ProxyProvider({
+ const factory = oauth2Proxy.create({
authHandler,
signIn: { resolver: signInResolver },
});
diff --git a/plugins/auth-backend/src/providers/oauth2-proxy/provider.ts b/plugins/auth-backend/src/providers/oauth2-proxy/provider.ts
index acef4a74ef..625c9e3d62 100644
--- a/plugins/auth-backend/src/providers/oauth2-proxy/provider.ts
+++ b/plugins/auth-backend/src/providers/oauth2-proxy/provider.ts
@@ -23,10 +23,17 @@ import {
AuthProviderRouteHandlers,
AuthResponse,
AuthResolverContext,
+ AuthHandlerResult,
} from '../types';
import { decodeJwt } from 'jose';
import { prepareBackstageIdentityResponse } from '../prepareBackstageIdentityResponse';
import { createAuthProviderIntegration } from '../createAuthProviderIntegration';
+import { IncomingHttpHeaders } from 'http';
+
+// NOTE: This may come in handy if you're doing work on this provider:
+//
+// plugins/auth-backend/examples/docker-compose.oauth2-proxy.yaml
+//
export const OAUTH2_PROXY_JWT_HEADER = 'X-OAUTH2-PROXY-ID-TOKEN';
@@ -36,16 +43,41 @@ export const OAUTH2_PROXY_JWT_HEADER = 'X-OAUTH2-PROXY-ID-TOKEN';
*
* @public
*/
-export type OAuth2ProxyResult = {
+export type OAuth2ProxyResult = {
/**
- * Parsed and decoded JWT payload.
+ * The parsed payload of the `accessToken`. The token is only parsed, not verified.
+ *
+ * @deprecated Access through the `headers` instead. This will be removed in a future release.
*/
fullProfile: JWTPayload;
/**
- * Raw JWT token
+ * The token received via the X-OAUTH2-PROXY-ID-TOKEN header. Will be an empty string
+ * if the header is not set. Note the this is typically an OpenID Connect token.
+ *
+ * @deprecated Access through the `headers` instead. This will be removed in a future release.
*/
accessToken: string;
+
+ /**
+ * The headers of the incoming request from the OAuth2 proxy. This will include
+ * both the headers set by the client as well as the ones added by the OAuth2 proxy.
+ * You should only trust the headers that are injected by the OAuth2 proxy.
+ *
+ * Useful headers to use to complete the sign-in are for example `x-forwarded-user`
+ * and `x-forwarded-email`. See the OAuth2 proxy documentation for more information
+ * about the available headers and how to enable them. In particular it is possible
+ * to forward access and identity tokens, which can be user for additional verification
+ * and lookups.
+ */
+ headers: IncomingHttpHeaders;
+
+ /**
+ * Provides convenient access to the request headers.
+ *
+ * This call is simply forwarded to `req.get(name)`.
+ */
+ getHeader(name: string): string | undefined;
};
/**
@@ -96,7 +128,23 @@ export class Oauth2ProxyAuthProvider
async refresh(req: express.Request, res: express.Response): Promise {
try {
- const result = this.getResult(req);
+ // TODO(Rugvip): This parsing was deprecated in 1.2 and should be removed in a future release.
+ const authHeader = req.header(OAUTH2_PROXY_JWT_HEADER);
+ const jwt = getBearerTokenFromAuthorizationHeader(authHeader);
+ const decodedJWT = jwt && (decodeJwt(jwt) as unknown as JWTPayload);
+
+ const result = {
+ fullProfile: decodedJWT || ({} as JWTPayload),
+ accessToken: jwt || '',
+ headers: req.headers,
+ getHeader(name: string) {
+ if (name.toLocaleLowerCase('en-US') === 'set-cookie') {
+ throw new Error('Access Set-Cookie via the headers object instead');
+ }
+ return req.get(name);
+ },
+ };
+
const response = await this.handleResult(result);
res.json(response);
} catch (e) {
@@ -131,24 +179,19 @@ export class Oauth2ProxyAuthProvider
profile,
};
}
+}
- private getResult(req: express.Request): OAuth2ProxyResult {
- const authHeader = req.header(OAUTH2_PROXY_JWT_HEADER);
- const jwt = getBearerTokenFromAuthorizationHeader(authHeader);
-
- if (!jwt) {
- throw new AuthenticationError(
- `Missing or in incorrect format - Oauth2Proxy OIDC header: ${OAUTH2_PROXY_JWT_HEADER}`,
- );
- }
-
- const decodedJWT = decodeJwt(jwt) as unknown as JWTPayload;
-
- return {
- fullProfile: decodedJWT,
- accessToken: jwt,
- };
- }
+async function defaultAuthHandler(
+ result: OAuth2ProxyResult,
+): Promise {
+ return {
+ profile: {
+ email: result.getHeader('x-forwarded-email'),
+ displayName:
+ result.getHeader('x-forwarded-preferred-username') ||
+ result.getHeader('x-forwarded-user'),
+ },
+ };
}
/**
@@ -160,8 +203,12 @@ export const oauth2Proxy = createAuthProviderIntegration({
create(options: {
/**
* Configure an auth handler to generate a profile for the user.
+ *
+ * The default implementation uses the value of the `X-Forwarded-Preferred-Username`
+ * header as the display name, falling back to `X-Forwarded-User`, and the value of
+ * the `X-Forwarded-Email` header as the email address.
*/
- authHandler: AuthHandler>;
+ authHandler?: AuthHandler>;
/**
* Configure sign-in for this provider, without it the provider can not be used to sign users in.
@@ -179,7 +226,7 @@ export const oauth2Proxy = createAuthProviderIntegration({
return new Oauth2ProxyAuthProvider({
resolverContext,
signInResolver,
- authHandler,
+ authHandler: authHandler ?? defaultAuthHandler,
});
};
},
diff --git a/plugins/auth-backend/src/providers/oauth2/provider.ts b/plugins/auth-backend/src/providers/oauth2/provider.ts
index 8b0eac948a..8e0250cf2f 100644
--- a/plugins/auth-backend/src/providers/oauth2/provider.ts
+++ b/plugins/auth-backend/src/providers/oauth2/provider.ts
@@ -76,7 +76,7 @@ export class OAuth2AuthProvider implements OAuthHandlers {
callbackURL: options.callbackUrl,
authorizationURL: options.authorizationUrl,
tokenURL: options.tokenUrl,
- passReqToCallback: false as true,
+ passReqToCallback: false,
scope: options.scope,
customHeaders: options.includeBasicAuth
? {
diff --git a/plugins/auth-backend/src/providers/oidc/provider.ts b/plugins/auth-backend/src/providers/oidc/provider.ts
index ed6bdf8c34..aba9048cc7 100644
--- a/plugins/auth-backend/src/providers/oidc/provider.ts
+++ b/plugins/auth-backend/src/providers/oidc/provider.ts
@@ -146,7 +146,7 @@ export class OidcAuthProvider implements OAuthHandlers {
const strategy = new OidcStrategy(
{
client,
- passReqToCallback: false as true,
+ passReqToCallback: false,
},
(
tokenset: TokenSet,
diff --git a/plugins/auth-backend/src/providers/okta/provider.ts b/plugins/auth-backend/src/providers/okta/provider.ts
index f208564cb6..4e05ff4487 100644
--- a/plugins/auth-backend/src/providers/okta/provider.ts
+++ b/plugins/auth-backend/src/providers/okta/provider.ts
@@ -94,7 +94,7 @@ export class OktaAuthProvider implements OAuthHandlers {
clientSecret: options.clientSecret,
callbackURL: options.callbackUrl,
audience: options.audience,
- passReqToCallback: false as true,
+ passReqToCallback: false,
store: this.store,
response_type: 'code',
},
diff --git a/plugins/auth-backend/src/providers/onelogin/provider.ts b/plugins/auth-backend/src/providers/onelogin/provider.ts
index 06a57e4560..7dcc6455ac 100644
--- a/plugins/auth-backend/src/providers/onelogin/provider.ts
+++ b/plugins/auth-backend/src/providers/onelogin/provider.ts
@@ -71,7 +71,7 @@ export class OneLoginProvider implements OAuthHandlers {
clientID: options.clientId,
clientSecret: options.clientSecret,
callbackURL: options.callbackUrl,
- passReqToCallback: false as true,
+ passReqToCallback: false,
},
(
accessToken: any,
diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md
index 8dcb89bb4b..2b055926ed 100644
--- a/plugins/azure-devops/CHANGELOG.md
+++ b/plugins/azure-devops/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-azure-devops
+## 0.1.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.21-next.0
### Patch Changes
diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json
index 534dff7267..5e5f8b38c3 100644
--- a/plugins/azure-devops/package.json
+++ b/plugins/azure-devops/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-devops",
- "version": "0.1.21-next.0",
+ "version": "0.1.21-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -31,11 +31,11 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
"@backstage/plugin-azure-devops-common": "^0.2.2",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -49,10 +49,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md
index 0b6017431f..77ae443daa 100644
--- a/plugins/badges/CHANGELOG.md
+++ b/plugins/badges/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-badges
+## 0.2.29-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.2.29-next.0
### Patch Changes
diff --git a/plugins/badges/package.json b/plugins/badges/package.json
index 80e457626d..52dd8651e5 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.29-next.0",
+ "version": "0.2.29-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -31,10 +31,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -46,10 +46,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md
index 910b5a1c4d..cacbc6a18b 100644
--- a/plugins/bazaar/CHANGELOG.md
+++ b/plugins/bazaar/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-bazaar
+## 0.1.20-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/cli@0.17.1-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog@1.2.0-next.1
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.20-next.0
### Patch Changes
diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json
index 4146fe51c5..47a4251fcc 100644
--- a/plugins/bazaar/package.json
+++ b/plugins/bazaar/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar",
- "version": "0.1.20-next.0",
+ "version": "0.1.20-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -26,11 +26,11 @@
"dependencies": {
"@backstage/catalog-client": "^1.0.1",
"@backstage/catalog-model": "^1.0.1",
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog": "^1.2.0-next.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog": "^1.2.0-next.1",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@date-io/luxon": "1.x",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -47,8 +47,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/dev-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/dev-utils": "^1.0.2-next.1",
"@testing-library/jest-dom": "^5.10.1",
"cross-fetch": "^3.1.5"
},
diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md
index 88c9159f06..89abda6363 100644
--- a/plugins/bitrise/CHANGELOG.md
+++ b/plugins/bitrise/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-bitrise
+## 0.1.32-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.32-next.0
### Patch Changes
diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json
index 7f330e9afb..c9c95e48b7 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.32-next.0",
+ "version": "0.1.32-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -25,9 +25,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -43,10 +43,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md
index e226a5e65a..b13c5336da 100644
--- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md
+++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-catalog-backend-module-gerrit
+## 0.1.0-next.1
+
+### Patch Changes
+
+- 57f684f59c: Fix incorrect main path in `publishConfig`
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+ - @backstage/plugin-catalog-backend@1.1.2-next.1
+
## 0.1.0-next.0
### Minor Changes
diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json
index 75a7a17aa2..96aa8c0849 100644
--- a/plugins/catalog-backend-module-gerrit/package.json
+++ b/plugins/catalog-backend-module-gerrit/package.json
@@ -1,12 +1,12 @@
{
"name": "@backstage/plugin-catalog-backend-module-gerrit",
- "version": "0.1.0-next.0",
+ "version": "0.1.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
"publishConfig": {
"access": "public",
- "main": "dist/index.esm.js",
+ "main": "dist/index.cjs.js",
"types": "dist/index.d.ts"
},
"backstage": {
@@ -28,13 +28,13 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-common": "^0.13.3-next.1",
"@backstage/backend-tasks": "^0.3.1-next.0",
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
"@backstage/errors": "^1.0.0",
"@backstage/integration": "^1.2.0-next.0",
- "@backstage/plugin-catalog-backend": "^1.1.2-next.0",
+ "@backstage/plugin-catalog-backend": "^1.1.2-next.1",
"fs-extra": "10.1.0",
"msw": "^0.35.0",
"node-fetch": "^2.6.7",
@@ -43,7 +43,7 @@
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.24-next.0",
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@types/fs-extra": "^9.0.1"
},
"files": [
diff --git a/plugins/catalog-backend-module-github/api-report.md b/plugins/catalog-backend-module-github/api-report.md
index a1b3d34058..e5fa2ea46a 100644
--- a/plugins/catalog-backend-module-github/api-report.md
+++ b/plugins/catalog-backend-module-github/api-report.md
@@ -13,6 +13,7 @@ import { GitHubIntegrationConfig } from '@backstage/integration';
import { LocationSpec } from '@backstage/plugin-catalog-backend';
import { Logger } from 'winston';
import { ScmIntegrationRegistry } from '@backstage/integration';
+import { TaskRunner } from '@backstage/backend-tasks';
// @public
export class GithubDiscoveryProcessor implements CatalogProcessor {
@@ -72,7 +73,7 @@ export class GithubMultiOrgReaderProcessor implements CatalogProcessor {
): Promise;
}
-// @public (undocumented)
+// @public
export class GitHubOrgEntityProvider implements EntityProvider {
constructor(options: {
id: string;
@@ -86,17 +87,20 @@ export class GitHubOrgEntityProvider implements EntityProvider {
// (undocumented)
static fromConfig(
config: Config,
- options: {
- id: string;
- orgUrl: string;
- logger: Logger;
- githubCredentialsProvider?: GithubCredentialsProvider;
- },
+ options: GitHubOrgEntityProviderOptions,
): GitHubOrgEntityProvider;
// (undocumented)
getProviderName(): string;
- // (undocumented)
- read(): Promise;
+ read(options?: { logger?: Logger }): Promise;
+}
+
+// @public
+export interface GitHubOrgEntityProviderOptions {
+ githubCredentialsProvider?: GithubCredentialsProvider;
+ id: string;
+ logger: Logger;
+ orgUrl: string;
+ schedule?: 'manual' | TaskRunner;
}
// @public
diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json
index 6069834cbc..0d143f755b 100644
--- a/plugins/catalog-backend-module-github/package.json
+++ b/plugins/catalog-backend-module-github/package.json
@@ -34,6 +34,7 @@
},
"dependencies": {
"@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-tasks": "^0.3.1-next.0",
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
"@backstage/errors": "^1.0.0",
@@ -44,6 +45,7 @@
"lodash": "^4.17.21",
"msw": "^0.35.0",
"node-fetch": "^2.6.7",
+ "uuid": "^8.0.0",
"winston": "^3.2.1"
},
"devDependencies": {
diff --git a/plugins/catalog-backend-module-github/src/GitHubOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/GitHubOrgEntityProvider.ts
index 5bf501aff0..e6cb413a6f 100644
--- a/plugins/catalog-backend-module-github/src/GitHubOrgEntityProvider.ts
+++ b/plugins/catalog-backend-module-github/src/GitHubOrgEntityProvider.ts
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+import { TaskRunner } from '@backstage/backend-tasks';
import {
ANNOTATION_LOCATION,
ANNOTATION_ORIGIN_LOCATION,
@@ -33,6 +34,7 @@ import {
} from '@backstage/plugin-catalog-backend';
import { graphql } from '@octokit/graphql';
import { merge } from 'lodash';
+import * as uuid from 'uuid';
import { Logger } from 'winston';
import {
assignGroupsToUsers,
@@ -42,21 +44,64 @@ import {
parseGitHubOrgUrl,
} from './lib';
-// TODO: Consider supporting an (optional) webhook that reacts on org changes
-/** @public */
-export class GitHubOrgEntityProvider implements EntityProvider {
- private connection?: EntityProviderConnection;
- private githubCredentialsProvider: GithubCredentialsProvider;
+/**
+ * Options for {@link GitHubOrgEntityProvider}.
+ *
+ * @public
+ */
+export interface GitHubOrgEntityProviderOptions {
+ /**
+ * A unique, stable identifier for this provider.
+ *
+ * @example "production"
+ */
+ id: string;
- static fromConfig(
- config: Config,
- options: {
- id: string;
- orgUrl: string;
- logger: Logger;
- githubCredentialsProvider?: GithubCredentialsProvider;
- },
- ) {
+ /**
+ * The target that this provider should consume.
+ *
+ * @example "https://github.com/backstage"
+ */
+ orgUrl: string;
+
+ /**
+ * The refresh schedule to use.
+ *
+ * @defaultValue "manual"
+ * @remarks
+ *
+ * If you pass in 'manual', you are responsible for calling the `read` method
+ * manually at some interval.
+ *
+ * But more commonly you will pass in the result of
+ * {@link @backstage/backend-tasks#PluginTaskScheduler.createScheduledTaskRunner}
+ * to enable automatic scheduling of tasks.
+ */
+ schedule?: 'manual' | TaskRunner;
+
+ /**
+ * The logger to use.
+ */
+ logger: Logger;
+
+ /**
+ * Optionally supply a custom credentials provider, replacing the default one.
+ */
+ githubCredentialsProvider?: GithubCredentialsProvider;
+}
+
+// TODO: Consider supporting an (optional) webhook that reacts on org changes
+/**
+ * Ingests org data (users and groups) from GitHub.
+ *
+ * @public
+ */
+export class GitHubOrgEntityProvider implements EntityProvider {
+ private readonly credentialsProvider: GithubCredentialsProvider;
+ private connection?: EntityProviderConnection;
+ private scheduleFn?: () => Promise;
+
+ static fromConfig(config: Config, options: GitHubOrgEntityProviderOptions) {
const integrations = ScmIntegrations.fromConfig(config);
const gitHubConfig = integrations.github.byUrl(options.orgUrl)?.config;
@@ -70,7 +115,7 @@ export class GitHubOrgEntityProvider implements EntityProvider {
target: options.orgUrl,
});
- return new GitHubOrgEntityProvider({
+ const provider = new GitHubOrgEntityProvider({
id: options.id,
orgUrl: options.orgUrl,
logger,
@@ -79,6 +124,10 @@ export class GitHubOrgEntityProvider implements EntityProvider {
options.githubCredentialsProvider ||
DefaultGithubCredentialsProvider.fromIntegrations(integrations),
});
+
+ provider.schedule(options.schedule);
+
+ return provider;
}
constructor(
@@ -90,28 +139,36 @@ export class GitHubOrgEntityProvider implements EntityProvider {
githubCredentialsProvider?: GithubCredentialsProvider;
},
) {
- this.githubCredentialsProvider =
+ this.credentialsProvider =
options.githubCredentialsProvider ||
- SingleInstanceGithubCredentialsProvider.create(options.gitHubConfig);
+ SingleInstanceGithubCredentialsProvider.create(this.options.gitHubConfig);
}
+ /** {@inheritdoc @backstage/plugin-catalog-backend#EntityProvider.getProviderName} */
getProviderName() {
return `GitHubOrgEntityProvider:${this.options.id}`;
}
+ /** {@inheritdoc @backstage/plugin-catalog-backend#EntityProvider.connect} */
async connect(connection: EntityProviderConnection) {
this.connection = connection;
+ await this.scheduleFn?.();
}
- async read() {
+ /**
+ * Runs one single complete ingestion. This is only necessary if you use
+ * manual scheduling.
+ */
+ async read(options?: { logger?: Logger }) {
if (!this.connection) {
throw new Error('Not initialized');
}
- const { markReadComplete } = trackProgress(this.options.logger);
+ const logger = options?.logger ?? this.options.logger;
+ const { markReadComplete } = trackProgress(logger);
const { headers, type: tokenType } =
- await this.githubCredentialsProvider.getCredentials({
+ await this.credentialsProvider.getCredentials({
url: this.options.orgUrl,
});
const client = graphql.defaults({
@@ -144,6 +201,32 @@ export class GitHubOrgEntityProvider implements EntityProvider {
markCommitComplete();
}
+
+ private schedule(schedule: GitHubOrgEntityProviderOptions['schedule']) {
+ if (!schedule || schedule === 'manual') {
+ return;
+ }
+
+ this.scheduleFn = async () => {
+ const id = `${this.getProviderName()}:refresh`;
+ await schedule.run({
+ id,
+ fn: async () => {
+ const logger = this.options.logger.child({
+ class: GitHubOrgEntityProvider.prototype.constructor.name,
+ taskId: id,
+ taskInstanceId: uuid.v4(),
+ });
+
+ try {
+ await this.read({ logger });
+ } catch (error) {
+ logger.error(error);
+ }
+ },
+ });
+ };
+ }
}
// Helps wrap the timing and logging behaviors
diff --git a/plugins/catalog-backend-module-github/src/GithubOrgReaderProcessor.ts b/plugins/catalog-backend-module-github/src/GithubOrgReaderProcessor.ts
index 84c12e82ba..ca1dd96b3c 100644
--- a/plugins/catalog-backend-module-github/src/GithubOrgReaderProcessor.ts
+++ b/plugins/catalog-backend-module-github/src/GithubOrgReaderProcessor.ts
@@ -42,6 +42,11 @@ type GraphQL = typeof graphql;
/**
* Extracts teams and users out of a GitHub org.
+ *
+ * @remarks
+ *
+ * Consider using {@link GitHubOrgEntityProvider} instead.
+ *
* @public
*/
export class GithubOrgReaderProcessor implements CatalogProcessor {
diff --git a/plugins/catalog-backend-module-github/src/index.ts b/plugins/catalog-backend-module-github/src/index.ts
index 1394fcd21b..2f666e6547 100644
--- a/plugins/catalog-backend-module-github/src/index.ts
+++ b/plugins/catalog-backend-module-github/src/index.ts
@@ -23,5 +23,6 @@
export { GithubDiscoveryProcessor } from './GithubDiscoveryProcessor';
export { GithubMultiOrgReaderProcessor } from './GithubMultiOrgReaderProcessor';
export { GitHubOrgEntityProvider } from './GitHubOrgEntityProvider';
+export type { GitHubOrgEntityProviderOptions } from './GitHubOrgEntityProvider';
export { GithubOrgReaderProcessor } from './GithubOrgReaderProcessor';
export type { GithubMultiOrgConfig } from './lib';
diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md
index ebec4cac05..fe0fffb59d 100644
--- a/plugins/catalog-backend/CHANGELOG.md
+++ b/plugins/catalog-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-catalog-backend
+## 1.1.2-next.1
+
+### Patch Changes
+
+- 1ccbe081cc: Minor internal tweak to support TypeScript 4.6
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+
## 1.1.2-next.0
### Patch Changes
diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json
index c0c74677c6..e22a5a85ed 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.1.2-next.0",
+ "version": "1.1.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,7 +34,7 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-common": "^0.13.3-next.1",
"@backstage/catalog-client": "^1.0.1",
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
@@ -69,7 +69,7 @@
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.24-next.0",
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@backstage/plugin-permission-common": "^0.6.0",
"@backstage/plugin-search-backend-node": "0.6.1-next.0",
"@types/core-js": "^2.5.4",
diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts
index eaa0ce0189..fa11903447 100644
--- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts
+++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts
@@ -163,14 +163,14 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog {
async entities(request?: EntitiesRequest): Promise {
const db = this.database;
- let entitiesQuery = db('final_entities');
+ let entitiesQuery =
+ db('final_entities').select('final_entities.*');
if (request?.filter) {
entitiesQuery = parseFilter(request.filter, entitiesQuery, db);
}
// TODO: move final_entities to use entity_ref
entitiesQuery = entitiesQuery
- .select('final_entities.*')
.whereNotNull('final_entities.final_entity')
.orderBy('entity_id', 'asc');
diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md
index c44db1691b..ace5bc9cbe 100644
--- a/plugins/catalog-graph/CHANGELOG.md
+++ b/plugins/catalog-graph/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-catalog-graph
+## 0.2.17-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.2.17-next.0
### Patch Changes
diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json
index 9a9a31c5da..8b58b60225 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.17-next.0",
+ "version": "0.2.17-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -26,9 +26,9 @@
"dependencies": {
"@backstage/catalog-client": "^1.0.1",
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -45,11 +45,11 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/plugin-catalog": "^1.2.0-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/plugin-catalog": "^1.2.0-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json
index b475d3426a..ea14466192 100644
--- a/plugins/catalog-graphql/package.json
+++ b/plugins/catalog-graphql/package.json
@@ -37,23 +37,22 @@
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
"@backstage/types": "^1.0.0",
- "graphql-modules": "^2.0.0",
"apollo-server": "^3.0.0",
"graphql": "^16.0.0",
+ "graphql-modules": "^2.0.0",
"graphql-tag": "^2.11.0",
"graphql-type-json": "^0.3.2",
"node-fetch": "^2.6.7",
"winston": "^3.2.1"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@graphql-codegen/cli": "^2.3.1",
+ "@graphql-codegen/graphql-modules-preset": "^2.3.2",
"@graphql-codegen/typescript": "^2.4.2",
"@graphql-codegen/typescript-resolvers": "^2.4.3",
- "@graphql-codegen/graphql-modules-preset": "^2.3.2",
"@graphql-tools/schema": "^8.3.1",
- "eslint-plugin-graphql": "^4.0.0",
"msw": "^0.35.0"
},
"files": [
diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md
index b6a6e3ec73..0f6bcf96e5 100644
--- a/plugins/catalog-import/CHANGELOG.md
+++ b/plugins/catalog-import/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-catalog-import
+## 0.8.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/integration-react@1.1.0-next.1
+
## 0.8.8-next.0
### Patch Changes
diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json
index 3d66e2e5b5..871893f106 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.8.8-next.0",
+ "version": "0.8.8-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -37,12 +37,12 @@
"@backstage/catalog-client": "^1.0.1",
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
"@backstage/integration": "^1.2.0-next.0",
- "@backstage/integration-react": "^1.1.0-next.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/integration-react": "^1.1.0-next.1",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
@@ -60,10 +60,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md
index 1d63bdc1c2..8945566002 100644
--- a/plugins/catalog-react/CHANGELOG.md
+++ b/plugins/catalog-react/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-catalog-react
+## 1.1.0-next.1
+
+### Patch Changes
+
+- 0418447669: Added menu parent role for menu items accessibility
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-permission-react@0.4.1-next.0
+
## 1.1.0-next.0
### Minor Changes
diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json
index 7b0f2105fa..7f84b21235 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.1.0-next.0",
+ "version": "1.1.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -36,13 +36,13 @@
"dependencies": {
"@backstage/catalog-client": "^1.0.1",
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
"@backstage/integration": "^1.2.0-next.0",
"@backstage/plugin-catalog-common": "^1.0.1",
"@backstage/plugin-permission-common": "^0.6.0",
- "@backstage/plugin-permission-react": "^0.4.0",
+ "@backstage/plugin-permission-react": "^0.4.1-next.0",
"@backstage/theme": "^0.2.15",
"@backstage/types": "^1.0.0",
"@backstage/version-bridge": "^1.0.1",
@@ -63,11 +63,11 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
"@backstage/plugin-catalog-common": "^1.0.1",
"@backstage/plugin-scaffolder-common": "^1.0.1",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/plugins/catalog-react/src/components/UserListPicker/UserListPicker.tsx b/plugins/catalog-react/src/components/UserListPicker/UserListPicker.tsx
index 843852085b..51359ab80e 100644
--- a/plugins/catalog-react/src/components/UserListPicker/UserListPicker.tsx
+++ b/plugins/catalog-react/src/components/UserListPicker/UserListPicker.tsx
@@ -242,7 +242,7 @@ export const UserListPicker = (props: UserListPickerProps) => {
{group.name}
-
+
{group.items.map(item => (
{
className={classes.menuItem}
disabled={filterCounts[item.id] === 0}
data-testid={`user-picker-${item.id}`}
+ tabIndex={0}
>
{item.icon && (
diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md
index 2a54a03025..960ebb9b16 100644
--- a/plugins/catalog/CHANGELOG.md
+++ b/plugins/catalog/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-catalog
+## 1.2.0-next.1
+
+### Patch Changes
+
+- 051fc60258: Lighthouse was reporting this button as having invalid aria- values, as the popover doesn't exist until clicked. This adds additional labels to the button to make it valid aria
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/integration-react@1.1.0-next.1
+
## 1.2.0-next.0
### Minor Changes
diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json
index 87ee486960..6d58e0fb4a 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.2.0-next.0",
+ "version": "1.2.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -36,12 +36,12 @@
"dependencies": {
"@backstage/catalog-client": "^1.0.1",
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/integration-react": "^1.1.0-next.0",
+ "@backstage/integration-react": "^1.1.0-next.1",
"@backstage/plugin-catalog-common": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/plugin-search-common": "^0.3.3",
"@backstage/theme": "^0.2.15",
"@backstage/types": "^1.0.0",
@@ -60,11 +60,11 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/plugin-permission-react": "^0.4.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/plugin-permission-react": "^0.4.1-next.0",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx
index ee677c5238..5664186ab1 100644
--- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx
+++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx
@@ -109,9 +109,12 @@ export function EntityContextMenu(props: EntityContextMenuProps) {
aria-label="more"
aria-controls="long-menu"
aria-haspopup="true"
+ aria-expanded={!!anchorEl}
+ role="button"
onClick={onOpen}
data-testid="menu-button"
className={classes.button}
+ id="long-menu"
>
@@ -121,6 +124,7 @@ export function EntityContextMenu(props: EntityContextMenuProps) {
anchorEl={anchorEl}
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
transformOrigin={{ vertical: 'top', horizontal: 'right' }}
+ aria-labelledby="long-menu"
>
{extraItems}
diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md
index 2cc84be0eb..1e227b30af 100644
--- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md
+++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-cicd-statistics-module-gitlab
+## 0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-cicd-statistics@0.1.7-next.1
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json
index b083359a55..beb0e61545 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.1-next.0",
+ "version": "0.1.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,16 +29,16 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
- "@backstage/plugin-cicd-statistics": "^0.1.7-next.0",
+ "@backstage/plugin-cicd-statistics": "^0.1.7-next.1",
"@gitbeaker/browser": "^35.6.0",
"@gitbeaker/core": "^35.6.0",
"luxon": "^2.0.2",
"p-limit": "^4.0.0",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/catalog-model": "^1.0.1"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0"
+ "@backstage/cli": "^0.17.1-next.1"
},
"files": [
"dist"
diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md
index 2447704019..5646c0ad5c 100644
--- a/plugins/cicd-statistics/CHANGELOG.md
+++ b/plugins/cicd-statistics/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-cicd-statistics
+## 0.1.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.7-next.0
### Patch Changes
diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json
index ceceb1e60c..a62941123a 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.7-next.0",
+ "version": "0.1.7-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -38,8 +38,8 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@date-io/luxon": "^1.3.13",
"@material-ui/core": "^4.9.13",
"@material-ui/icons": "^4.11.2",
diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md
index ae34fa0fac..197935126d 100644
--- a/plugins/circleci/CHANGELOG.md
+++ b/plugins/circleci/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-circleci
+## 0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.3.5-next.0
### Patch Changes
diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json
index 380759ed4d..f296fa22f2 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.5-next.0",
+ "version": "0.3.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -36,9 +36,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -55,10 +55,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md
index a002dae9d2..7d1e777dfc 100644
--- a/plugins/cloudbuild/CHANGELOG.md
+++ b/plugins/cloudbuild/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-cloudbuild
+## 0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.3.5-next.0
### Patch Changes
diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json
index 25d63b28c1..7fa4117fd6 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.5-next.0",
+ "version": "0.3.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,9 +35,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -52,10 +52,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md
index a53376e1e9..6e0f408913 100644
--- a/plugins/code-climate/CHANGELOG.md
+++ b/plugins/code-climate/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-code-climate
+## 0.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.5-next.0
### Patch Changes
diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json
index 61cc5f2b3d..ae7611d765 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.5-next.0",
+ "version": "0.1.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,9 +24,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -40,9 +40,9 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md
index a6d96bfbd8..012f602a89 100644
--- a/plugins/code-coverage/CHANGELOG.md
+++ b/plugins/code-coverage/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-code-coverage
+## 0.1.32-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.32-next.0
### Patch Changes
diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json
index a9c86e2cb2..2da750a86c 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.1.32-next.0",
+ "version": "0.1.32-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -26,10 +26,10 @@
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -46,10 +46,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md
index 2bee04cb31..a12bc24c8b 100644
--- a/plugins/config-schema/CHANGELOG.md
+++ b/plugins/config-schema/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-config-schema
+## 0.1.28-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.1.27
### Patch Changes
diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json
index 64e1a140fa..d66abe1f58 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.27",
+ "version": "0.1.28-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -25,8 +25,8 @@
},
"dependencies": {
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
"@backstage/theme": "^0.2.15",
"@backstage/types": "^1.0.0",
@@ -41,10 +41,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md
index 1c654e62b7..baf6da53ed 100644
--- a/plugins/cost-insights/CHANGELOG.md
+++ b/plugins/cost-insights/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-cost-insights
+## 0.11.27-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.11.26
### Patch Changes
diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json
index 474b58e1ab..ef1b9e2c63 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.11.26",
+ "version": "0.11.27-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -36,8 +36,8 @@
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -60,10 +60,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/cost-insights/src/alerts/README.md b/plugins/cost-insights/src/alerts/README.md
index 4b24e4005f..31efe57797 100644
--- a/plugins/cost-insights/src/alerts/README.md
+++ b/plugins/cost-insights/src/alerts/README.md
@@ -35,7 +35,7 @@ export class CostInsightsClient extends CostInsightsApi {
### Custom Setup
-Default properties such as the title, subtitle and instructions page url can be overridden - even default UI such as chart itself. Additionally, alerts can be extended to support actions such as snoozing or dismissing.
+Default properties such as the title, subtitle and instructions page URL can be overridden - even default UI such as chart itself. Additionally, alerts can be extended to support actions such as snoozing or dismissing.

diff --git a/plugins/example-todo-list-backend/.eslintrc.js b/plugins/example-todo-list-backend/.eslintrc.js
new file mode 100644
index 0000000000..16a033dbc6
--- /dev/null
+++ b/plugins/example-todo-list-backend/.eslintrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: [require.resolve('@backstage/cli/config/eslint.backend')],
+};
diff --git a/plugins/example-todo-list-backend/README.md b/plugins/example-todo-list-backend/README.md
new file mode 100644
index 0000000000..d5c51b2b57
--- /dev/null
+++ b/plugins/example-todo-list-backend/README.md
@@ -0,0 +1,3 @@
+# todo-list-backend
+
+This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the [documentation](https://backstage.io/docs/permission/plugin-authors/01-setup) to get started.
diff --git a/plugins/example-todo-list-backend/api-report.md b/plugins/example-todo-list-backend/api-report.md
new file mode 100644
index 0000000000..fa62ada8e7
--- /dev/null
+++ b/plugins/example-todo-list-backend/api-report.md
@@ -0,0 +1,22 @@
+## API Report File for "@internal/plugin-todo-list-backend"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+import express from 'express';
+import { IdentityClient } from '@backstage/plugin-auth-node';
+import { Logger } from 'winston';
+
+// @public
+export function createRouter(options: RouterOptions): Promise;
+
+// @public
+export interface RouterOptions {
+ // (undocumented)
+ identity: IdentityClient;
+ // (undocumented)
+ logger: Logger;
+}
+
+// (No @packageDocumentation comment for this package)
+```
diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json
new file mode 100644
index 0000000000..471a496fd8
--- /dev/null
+++ b/plugins/example-todo-list-backend/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "@internal/plugin-todo-list-backend",
+ "version": "1.0.0",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "license": "Apache-2.0",
+ "private": true,
+ "publishConfig": {
+ "access": "public",
+ "main": "dist/index.cjs.js",
+ "types": "dist/index.d.ts"
+ },
+ "scripts": {
+ "start": "backstage-cli package start",
+ "build": "backstage-cli package build",
+ "lint": "backstage-cli package lint",
+ "test": "backstage-cli package test",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack",
+ "clean": "backstage-cli package clean"
+ },
+ "dependencies": {
+ "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/config": "^1.0.0",
+ "@backstage/errors": "^1.0.0",
+ "@backstage/plugin-auth-node": "^0.2.1-next.0",
+ "@types/express": "^4.17.6",
+ "cross-fetch": "^3.1.5",
+ "express": "^4.17.1",
+ "express-promise-router": "^4.1.0",
+ "uuid": "^8.3.2",
+ "winston": "^3.2.1",
+ "yn": "^4.0.0"
+ },
+ "devDependencies": {
+ "@backstage/cli": "^0.17.1-next.0",
+ "@types/supertest": "^2.0.8",
+ "@types/uuid": "^8.0.0",
+ "msw": "^0.35.0",
+ "supertest": "^6.1.6"
+ },
+ "files": [
+ "dist"
+ ]
+}
diff --git a/plugins/example-todo-list-backend/src/index.ts b/plugins/example-todo-list-backend/src/index.ts
new file mode 100644
index 0000000000..ca73cb27ba
--- /dev/null
+++ b/plugins/example-todo-list-backend/src/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2020 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export * from './service/router';
diff --git a/plugins/example-todo-list-backend/src/run.ts b/plugins/example-todo-list-backend/src/run.ts
new file mode 100644
index 0000000000..0a3ed2b7f0
--- /dev/null
+++ b/plugins/example-todo-list-backend/src/run.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { 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/example-todo-list-backend/src/service/router.test.ts b/plugins/example-todo-list-backend/src/service/router.test.ts
new file mode 100644
index 0000000000..e381aad143
--- /dev/null
+++ b/plugins/example-todo-list-backend/src/service/router.test.ts
@@ -0,0 +1,47 @@
+/*
+ * 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 { getVoidLogger } from '@backstage/backend-common';
+import { IdentityClient } from '@backstage/plugin-auth-node';
+import express from 'express';
+import request from 'supertest';
+
+import { createRouter } from './router';
+
+describe('createRouter', () => {
+ let app: express.Express;
+
+ beforeAll(async () => {
+ const router = await createRouter({
+ logger: getVoidLogger(),
+ identity: {} as IdentityClient,
+ });
+ app = express().use(router);
+ });
+
+ beforeEach(() => {
+ jest.resetAllMocks();
+ });
+
+ describe('GET /health', () => {
+ it('returns ok', async () => {
+ const response = await request(app).get('/health');
+
+ expect(response.status).toEqual(200);
+ expect(response.body).toEqual({ status: 'ok' });
+ });
+ });
+});
diff --git a/plugins/example-todo-list-backend/src/service/router.ts b/plugins/example-todo-list-backend/src/service/router.ts
new file mode 100644
index 0000000000..cdaf1f82b4
--- /dev/null
+++ b/plugins/example-todo-list-backend/src/service/router.ts
@@ -0,0 +1,100 @@
+/*
+ * 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 { errorHandler } from '@backstage/backend-common';
+import express from 'express';
+import Router from 'express-promise-router';
+import { Logger } from 'winston';
+import {
+ IdentityClient,
+ getBearerTokenFromAuthorizationHeader,
+} from '@backstage/plugin-auth-node';
+import { add, getAll, update } from './todos';
+import { InputError } from '@backstage/errors';
+
+/**
+ * Dependencies of the todo-list router
+ *
+ * @public
+ */
+export interface RouterOptions {
+ logger: Logger;
+ identity: IdentityClient;
+}
+
+/**
+ * Creates an express.Router with some endpoints
+ * for creating, editing and deleting todo items.
+ *
+ * @public
+ * @param options - the dependencies of the router
+ * @returns an express.Router
+ *
+ */
+export async function createRouter(
+ options: RouterOptions,
+): Promise {
+ const { logger, identity } = options;
+
+ const router = Router();
+ router.use(express.json());
+
+ router.get('/health', (_, response) => {
+ logger.info('PONG!');
+ response.send({ status: 'ok' });
+ });
+
+ router.get('/todos', async (_req, res) => {
+ res.json(getAll());
+ });
+
+ router.post('/todos', async (req, res) => {
+ const token = getBearerTokenFromAuthorizationHeader(
+ req.header('authorization'),
+ );
+ let author: string | undefined = undefined;
+
+ const user = token ? await identity.authenticate(token) : undefined;
+ author = user?.identity.userEntityRef;
+
+ if (!isTodoCreateRequest(req.body)) {
+ throw new InputError('Invalid payload');
+ }
+
+ const todo = add({ title: req.body.title, author });
+ res.json(todo);
+ });
+
+ router.put('/todos', async (req, res) => {
+ if (!isTodoUpdateRequest(req.body)) {
+ throw new InputError('Invalid payload');
+ }
+ res.json(update(req.body));
+ });
+
+ router.use(errorHandler());
+ return router;
+}
+
+function isTodoCreateRequest(request: any): request is { title: string } {
+ return typeof request?.title === 'string';
+}
+
+function isTodoUpdateRequest(
+ request: any,
+): request is { title: string; id: string } {
+ return typeof request?.id === 'string' && isTodoCreateRequest(request);
+}
diff --git a/plugins/example-todo-list-backend/src/service/standaloneServer.ts b/plugins/example-todo-list-backend/src/service/standaloneServer.ts
new file mode 100644
index 0000000000..b0332e0931
--- /dev/null
+++ b/plugins/example-todo-list-backend/src/service/standaloneServer.ts
@@ -0,0 +1,61 @@
+/*
+ * 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 {
+ createServiceBuilder,
+ loadBackendConfig,
+ SingleHostDiscovery,
+} from '@backstage/backend-common';
+import { IdentityClient } from '@backstage/plugin-auth-node';
+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: 'todo-list-backend' });
+ logger.debug('Starting application server...');
+ const config = await loadBackendConfig({ logger, argv: process.argv });
+ const discovery = SingleHostDiscovery.fromConfig(config);
+ const router = await createRouter({
+ logger,
+ identity: IdentityClient.create({
+ discovery,
+ issuer: await discovery.getExternalBaseUrl('auth'),
+ }),
+ });
+
+ let service = createServiceBuilder(module)
+ .setPort(options.port)
+ .addRouter('/todo-list', 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/example-todo-list-backend/src/service/todos.ts b/plugins/example-todo-list-backend/src/service/todos.ts
new file mode 100644
index 0000000000..b87ab7557e
--- /dev/null
+++ b/plugins/example-todo-list-backend/src/service/todos.ts
@@ -0,0 +1,92 @@
+/*
+ * 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 { v4 as uuid } from 'uuid';
+import { NotFoundError } from '@backstage/errors';
+
+export type Todo = {
+ title: string;
+ author?: string;
+ id: string;
+ timestamp: number;
+};
+
+export type TodoFilter = {
+ property: Exclude;
+ values: Array;
+};
+
+export type TodoFilters =
+ | {
+ anyOf: TodoFilters[];
+ }
+ | { allOf: TodoFilters[] }
+ | { not: TodoFilters }
+ | TodoFilter;
+
+const todos: { [key: string]: Todo } = {};
+
+const matches = (todo: Todo, filters?: TodoFilters): boolean => {
+ if (!filters) {
+ return true;
+ }
+
+ if ('allOf' in filters) {
+ return filters.allOf.every(filter => matches(todo, filter));
+ }
+
+ if ('anyOf' in filters) {
+ return filters.anyOf.some(filter => matches(todo, filter));
+ }
+
+ if ('not' in filters) {
+ return !matches(todo, filters.not);
+ }
+
+ return filters.values.includes(todo[filters.property]);
+};
+
+export function add(todo: Omit) {
+ const id = uuid();
+
+ const obj: Todo = { ...todo, id, timestamp: Date.now() };
+ todos[id] = obj;
+ return obj;
+}
+
+export function getTodo(id: string) {
+ return todos[id];
+}
+
+export function update({ id, title }: { id: string; title: string }) {
+ let todo = todos[id];
+ if (!todo) {
+ throw new NotFoundError('Item not found');
+ }
+
+ todo = { ...todo, title, timestamp: Date.now() };
+ todos[id] = todo;
+ return todo;
+}
+
+export function getAll(filter?: TodoFilters) {
+ return Object.values(todos)
+ .filter(value => matches(value, filter))
+ .sort((a, b) => b.timestamp - a.timestamp);
+}
+
+// prepopulate the db
+add({ title: 'just a note' });
+add({ title: 'another note' });
diff --git a/plugins/example-todo-list-backend/src/setupTests.ts b/plugins/example-todo-list-backend/src/setupTests.ts
new file mode 100644
index 0000000000..d3232290a7
--- /dev/null
+++ b/plugins/example-todo-list-backend/src/setupTests.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2020 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export {};
diff --git a/plugins/example-todo-list-common/.eslintrc.js b/plugins/example-todo-list-common/.eslintrc.js
new file mode 100644
index 0000000000..e2a53a6ad2
--- /dev/null
+++ b/plugins/example-todo-list-common/.eslintrc.js
@@ -0,0 +1 @@
+module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
diff --git a/plugins/example-todo-list-common/README.md b/plugins/example-todo-list-common/README.md
new file mode 100644
index 0000000000..021eca1033
--- /dev/null
+++ b/plugins/example-todo-list-common/README.md
@@ -0,0 +1,3 @@
+# todo-list-common
+
+This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the [documentation](https://backstage.io/docs/permission/plugin-authors/01-setup) to get started.
diff --git a/plugins/example-todo-list-common/api-report.md b/plugins/example-todo-list-common/api-report.md
new file mode 100644
index 0000000000..15ffb7b139
--- /dev/null
+++ b/plugins/example-todo-list-common/api-report.md
@@ -0,0 +1,12 @@
+## API Report File for "@internal/plugin-todo-list-common"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+import { BasicPermission } from '@backstage/plugin-permission-common';
+
+// @public
+export const tempExamplePermission: BasicPermission;
+
+// (No @packageDocumentation comment for this package)
+```
diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json
new file mode 100644
index 0000000000..48619d7de5
--- /dev/null
+++ b/plugins/example-todo-list-common/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "@internal/plugin-todo-list-common",
+ "version": "1.0.0",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "license": "Apache-2.0",
+ "private": true,
+ "publishConfig": {
+ "access": "public",
+ "main": "dist/index.esm.js",
+ "types": "dist/index.d.ts"
+ },
+ "backstage": {
+ "role": "frontend-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/plugin-permission-common": "^0.6.0"
+ },
+ "devDependencies": {
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
+ "@types/node": "^16.11.26",
+ "msw": "^0.35.0",
+ "cross-fetch": "^3.1.5"
+ },
+ "files": [
+ "dist"
+ ]
+}
diff --git a/plugins/example-todo-list-common/src/index.ts b/plugins/example-todo-list-common/src/index.ts
new file mode 100644
index 0000000000..aff3b136bd
--- /dev/null
+++ b/plugins/example-todo-list-common/src/index.ts
@@ -0,0 +1,16 @@
+/*
+ * 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 './permissions';
diff --git a/plugins/example-todo-list-common/src/permissions.ts b/plugins/example-todo-list-common/src/permissions.ts
new file mode 100644
index 0000000000..439bf5e8b9
--- /dev/null
+++ b/plugins/example-todo-list-common/src/permissions.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.
+ */
+
+import { createPermission } from '@backstage/plugin-permission-common';
+
+/**
+ * An example of a permission.
+ *
+ * @public
+ */
+export const tempExamplePermission = createPermission({
+ name: 'temp.example.noop',
+ attributes: {},
+});
diff --git a/plugins/example-todo-list/.eslintrc.js b/plugins/example-todo-list/.eslintrc.js
new file mode 100644
index 0000000000..8c18e76229
--- /dev/null
+++ b/plugins/example-todo-list/.eslintrc.js
@@ -0,0 +1,14 @@
+module.exports = {
+ extends: [require.resolve('@backstage/cli/config/eslint')],
+ rules: {
+ 'import/no-extraneous-dependencies': [
+ 'error',
+ {
+ devDependencies: true,
+ optionalDependencies: true,
+ peerDependencies: true,
+ bundledDependencies: true,
+ },
+ ],
+ },
+};
diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md
new file mode 100644
index 0000000000..f117593158
--- /dev/null
+++ b/plugins/example-todo-list/CHANGELOG.md
@@ -0,0 +1,9 @@
+# @internal/plugin-todo-list
+
+## 1.0.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
diff --git a/plugins/example-todo-list/README.md b/plugins/example-todo-list/README.md
new file mode 100644
index 0000000000..bd77af87e8
--- /dev/null
+++ b/plugins/example-todo-list/README.md
@@ -0,0 +1,3 @@
+# todo-list
+
+This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the [documentation](https://backstage.io/docs/permission/plugin-authors/01-setup) to get started.
diff --git a/plugins/example-todo-list/api-report.md b/plugins/example-todo-list/api-report.md
new file mode 100644
index 0000000000..534c33200e
--- /dev/null
+++ b/plugins/example-todo-list/api-report.md
@@ -0,0 +1,23 @@
+## API Report File for "@internal/plugin-todo-list"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+///
+
+import { BackstagePlugin } from '@backstage/core-plugin-api';
+import { RouteRef } from '@backstage/core-plugin-api';
+
+// @public
+export const TodoListPage: () => JSX.Element;
+
+// @public
+export const todoListPlugin: BackstagePlugin<
+ {
+ root: RouteRef;
+ },
+ {}
+>;
+
+// (No @packageDocumentation comment for this package)
+```
diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json
new file mode 100644
index 0000000000..93c0ef7c17
--- /dev/null
+++ b/plugins/example-todo-list/package.json
@@ -0,0 +1,50 @@
+{
+ "name": "@internal/plugin-todo-list",
+ "version": "1.0.1-next.0",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "license": "Apache-2.0",
+ "private": true,
+ "publishConfig": {
+ "access": "public",
+ "main": "dist/index.esm.js",
+ "types": "dist/index.d.ts"
+ },
+ "scripts": {
+ "build": "backstage-cli package build",
+ "start": "backstage-cli package start",
+ "lint": "backstage-cli package lint",
+ "test": "backstage-cli package test",
+ "diff": "backstage-cli plugin:diff",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack",
+ "clean": "backstage-cli package clean"
+ },
+ "dependencies": {
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/theme": "^0.2.15",
+ "@material-ui/core": "^4.12.2",
+ "@material-ui/icons": "^4.9.1",
+ "@material-ui/lab": "4.0.0-alpha.57",
+ "react-use": "^17.2.4"
+ },
+ "peerDependencies": {
+ "react": "^16.13.1 || ^17.0.0"
+ },
+ "devDependencies": {
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
+ "@testing-library/jest-dom": "^5.10.1",
+ "@testing-library/react": "^12.1.3",
+ "@testing-library/user-event": "^14.0.0",
+ "@types/jest": "^26.0.7",
+ "@types/node": "^16.11.26",
+ "msw": "^0.35.0"
+ },
+ "files": [
+ "dist"
+ ]
+}
diff --git a/plugins/example-todo-list/src/components/TodoList/TodoList.tsx b/plugins/example-todo-list/src/components/TodoList/TodoList.tsx
new file mode 100644
index 0000000000..7bda8df5b4
--- /dev/null
+++ b/plugins/example-todo-list/src/components/TodoList/TodoList.tsx
@@ -0,0 +1,88 @@
+/*
+ * 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 from 'react';
+import { Table, TableColumn, Progress } from '@backstage/core-components';
+import Alert from '@material-ui/lab/Alert';
+import useAsync from 'react-use/lib/useAsync';
+import {
+ discoveryApiRef,
+ fetchApiRef,
+ useApi,
+} from '@backstage/core-plugin-api';
+import { Button } from '@material-ui/core';
+
+export type Todo = {
+ title: string;
+ id: string;
+ author?: string;
+ timestamp: number;
+};
+
+type TodosTableProps = {
+ todos: Todo[];
+ onEdit(todo: Todo): any;
+};
+
+export const TodoList = ({ onEdit }: { onEdit(todo: Todo): any }) => {
+ const discoveryApi = useApi(discoveryApiRef);
+ const { fetch } = useApi(fetchApiRef);
+
+ const { value, loading, error } = useAsync(async (): Promise => {
+ const response = await fetch(
+ `${await discoveryApi.getBaseUrl('todolist')}/todos`,
+ );
+ return response.json();
+ }, []);
+
+ if (loading) {
+ return ;
+ } else if (error) {
+ return {error.message} ;
+ }
+
+ return ;
+};
+
+export function TodosTable({ todos, onEdit }: TodosTableProps) {
+ const columns: TableColumn[] = [
+ { title: 'Title', field: 'title' },
+ { title: 'Author', field: 'author' },
+ {
+ title: 'Last edit',
+ field: 'timestamp',
+ render: e => new Date(e.timestamp).toLocaleString(),
+ },
+ {
+ title: 'Action',
+ render: todo => {
+ return (
+ onEdit(todo)}>
+ Edit
+
+ );
+ },
+ },
+ ];
+
+ return (
+
+ );
+}
diff --git a/plugins/example-todo-list/src/components/TodoList/index.ts b/plugins/example-todo-list/src/components/TodoList/index.ts
new file mode 100644
index 0000000000..df49717d83
--- /dev/null
+++ b/plugins/example-todo-list/src/components/TodoList/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 { TodoList } from './TodoList';
+export type { Todo } from './TodoList';
diff --git a/plugins/example-todo-list/src/components/TodoListPage/TodoListPage.tsx b/plugins/example-todo-list/src/components/TodoListPage/TodoListPage.tsx
new file mode 100644
index 0000000000..7ebb517532
--- /dev/null
+++ b/plugins/example-todo-list/src/components/TodoListPage/TodoListPage.tsx
@@ -0,0 +1,187 @@
+/*
+ * 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, { useReducer, useRef, useState } from 'react';
+import {
+ Typography,
+ Grid,
+ TextField,
+ Button,
+ Dialog,
+ Box,
+ DialogTitle,
+ DialogContent,
+ DialogActions,
+} from '@material-ui/core';
+import {
+ Header,
+ Page,
+ Content,
+ ContentHeader,
+ HeaderLabel,
+ SupportButton,
+} from '@backstage/core-components';
+import { Todo, TodoList } from '../TodoList';
+import {
+ alertApiRef,
+ discoveryApiRef,
+ fetchApiRef,
+ useApi,
+} from '@backstage/core-plugin-api';
+
+export const TodoListPage = () => {
+ const discoveryApi = useApi(discoveryApiRef);
+ const { fetch } = useApi(fetchApiRef);
+ const alertApi = useApi(alertApiRef);
+ const title = useRef('');
+ const [key, refetchTodos] = useReducer(i => i + 1, 0);
+ const [editElement, setEdit] = useState();
+
+ const handleAdd = async () => {
+ try {
+ const response = await fetch(
+ `${await discoveryApi.getBaseUrl('todolist')}/todos`,
+ {
+ method: 'POST',
+ body: JSON.stringify({ title: title.current }),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ },
+ );
+ if (!response.ok) {
+ const { error } = await response.json();
+ alertApi.post({
+ message: error.message,
+ severity: 'error',
+ });
+ return;
+ }
+ refetchTodos();
+ } catch (e: any) {
+ alertApi.post({ message: e.message, severity: 'error' });
+ }
+ };
+
+ const handleEdit = async (todo: Todo) => {
+ setEdit(undefined);
+ try {
+ const response = await fetch(
+ `${await discoveryApi.getBaseUrl('todolist')}/todos`,
+ {
+ method: 'PUT',
+ body: JSON.stringify({ title: todo.title, id: todo.id }),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ },
+ );
+ if (!response.ok) {
+ const { error } = await response.json();
+ alertApi.post({
+ message: error.message,
+ severity: 'error',
+ });
+ return;
+ }
+ refetchTodos();
+ } catch (e: any) {
+ alertApi.post({ message: e.message, severity: 'error' });
+ }
+ };
+
+ return (
+
+
+
+
+ A description of your plugin goes here.
+
+
+
+ Add todo
+
+ (title.current = e.target.value)}
+ />
+
+ Add
+
+
+
+
+
+
+
+
+ {!!editElement && (
+ setEdit(undefined)}
+ />
+ )}
+
+ );
+};
+
+function EditModal({
+ todo,
+ onCancel,
+ onSubmit,
+}: {
+ todo?: Todo;
+ onSubmit(todo: Todo): any;
+ onCancel(): any;
+}) {
+ const title = useRef('');
+ return (
+
+ Edit item
+
+ (title.current = e.target.value)}
+ margin="dense"
+ fullWidth
+ />
+
+
+
+ Cancel
+
+ onSubmit({ ...todo!, title: title.current })}
+ color="primary"
+ >
+ Save
+
+
+
+ );
+}
diff --git a/plugins/example-todo-list/src/components/TodoListPage/index.ts b/plugins/example-todo-list/src/components/TodoListPage/index.ts
new file mode 100644
index 0000000000..061450605a
--- /dev/null
+++ b/plugins/example-todo-list/src/components/TodoListPage/index.ts
@@ -0,0 +1,16 @@
+/*
+ * 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 { TodoListPage } from './TodoListPage';
diff --git a/plugins/example-todo-list/src/index.ts b/plugins/example-todo-list/src/index.ts
new file mode 100644
index 0000000000..3fc36a39c9
--- /dev/null
+++ b/plugins/example-todo-list/src/index.ts
@@ -0,0 +1,16 @@
+/*
+ * 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 { todoListPlugin, TodoListPage } from './plugin';
diff --git a/plugins/example-todo-list/src/plugin.test.ts b/plugins/example-todo-list/src/plugin.test.ts
new file mode 100644
index 0000000000..cd37abda72
--- /dev/null
+++ b/plugins/example-todo-list/src/plugin.test.ts
@@ -0,0 +1,22 @@
+/*
+ * 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 { todoListPlugin } from './plugin';
+
+describe('todo-list', () => {
+ it('should export plugin', () => {
+ expect(todoListPlugin).toBeDefined();
+ });
+});
diff --git a/plugins/example-todo-list/src/plugin.ts b/plugins/example-todo-list/src/plugin.ts
new file mode 100644
index 0000000000..0a6cf70476
--- /dev/null
+++ b/plugins/example-todo-list/src/plugin.ts
@@ -0,0 +1,47 @@
+/*
+ * 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 {
+ createPlugin,
+ createRoutableExtension,
+} from '@backstage/core-plugin-api';
+
+import { rootRouteRef } from './routes';
+
+/**
+ * The todo-list plugin instance
+ *
+ * @public
+ */
+export const todoListPlugin = createPlugin({
+ id: 'todolist',
+ routes: {
+ root: rootRouteRef,
+ },
+});
+
+/**
+ * The Router and main entrypoint to the todo-list plugin.
+ *
+ * @public
+ */
+export const TodoListPage = todoListPlugin.provide(
+ createRoutableExtension({
+ name: 'TodoListPage',
+ component: () =>
+ import('./components/TodoListPage').then(m => m.TodoListPage),
+ mountPoint: rootRouteRef,
+ }),
+);
diff --git a/plugins/example-todo-list/src/routes.ts b/plugins/example-todo-list/src/routes.ts
new file mode 100644
index 0000000000..1d7c51b016
--- /dev/null
+++ b/plugins/example-todo-list/src/routes.ts
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { createRouteRef } from '@backstage/core-plugin-api';
+
+export const rootRouteRef = createRouteRef({
+ id: 'todo-list',
+});
diff --git a/plugins/example-todo-list/src/setupTests.ts b/plugins/example-todo-list/src/setupTests.ts
new file mode 100644
index 0000000000..326d2ed212
--- /dev/null
+++ b/plugins/example-todo-list/src/setupTests.ts
@@ -0,0 +1,16 @@
+/*
+ * 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 '@testing-library/jest-dom';
diff --git a/plugins/explore-react/CHANGELOG.md b/plugins/explore-react/CHANGELOG.md
index 9e033f4fcb..7b894faa30 100644
--- a/plugins/explore-react/CHANGELOG.md
+++ b/plugins/explore-react/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-explore-react
+## 0.0.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.0.16
### Patch Changes
diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json
index 3bd5947163..68b569ccda 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.16",
+ "version": "0.0.17-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -33,12 +33,12 @@
"start": "backstage-cli package start"
},
"dependencies": {
- "@backstage/core-plugin-api": "^1.0.1"
+ "@backstage/core-plugin-api": "^1.0.2-next.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md
index c173f9eab2..c21c6f838d 100644
--- a/plugins/explore/CHANGELOG.md
+++ b/plugins/explore/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-explore
+## 0.3.36-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/plugin-explore-react@0.0.17-next.0
+
## 0.3.36-next.0
### Patch Changes
diff --git a/plugins/explore/package.json b/plugins/explore/package.json
index f590d72190..d1dc142ef0 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.36-next.0",
+ "version": "0.3.36-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,10 +35,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
- "@backstage/plugin-explore-react": "^0.0.16",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
+ "@backstage/plugin-explore-react": "^0.0.17-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -53,10 +53,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md
index 95587bff6b..a37bac8cf8 100644
--- a/plugins/firehydrant/CHANGELOG.md
+++ b/plugins/firehydrant/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-firehydrant
+## 0.1.22-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.22-next.0
### Patch Changes
diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json
index b0b022ffbd..0e02fc7556 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.22-next.0",
+ "version": "0.1.22-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -25,9 +25,9 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -39,10 +39,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md
index cbc337ab64..1d3beb2aba 100644
--- a/plugins/fossa/CHANGELOG.md
+++ b/plugins/fossa/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-fossa
+## 0.2.37-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.2.37-next.0
### Patch Changes
diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json
index af76c0b952..6b31188a1d 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.37-next.0",
+ "version": "0.2.37-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -36,10 +36,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -53,10 +53,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md
index 351d12c451..5f682d35e3 100644
--- a/plugins/gcalendar/CHANGELOG.md
+++ b/plugins/gcalendar/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-gcalendar
+## 0.3.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.3.1-next.0
### Patch Changes
diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json
index b7aa5c7674..480e6e05ce 100644
--- a/plugins/gcalendar/package.json
+++ b/plugins/gcalendar/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-gcalendar",
- "version": "0.3.1-next.0",
+ "version": "0.3.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -22,8 +22,8 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
@@ -43,10 +43,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md
index 3b91446e54..4f4adb4049 100644
--- a/plugins/gcp-projects/CHANGELOG.md
+++ b/plugins/gcp-projects/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-gcp-projects
+## 0.3.24-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.3.23
### Patch Changes
diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json
index 2f6800083a..a51066b7da 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.23",
+ "version": "0.3.24-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,8 +34,8 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -47,10 +47,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md
index eb8b19a96a..11c8317799 100644
--- a/plugins/git-release-manager/CHANGELOG.md
+++ b/plugins/git-release-manager/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-git-release-manager
+## 0.3.18-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.3.18-next.0
### Patch Changes
diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json
index a1948a66fc..1e2ccc7213 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.18-next.0",
+ "version": "0.3.18-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,8 +24,8 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/integration": "^1.2.0-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
@@ -43,10 +43,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/plugins/git-release-manager/src/features/Features.test.tsx b/plugins/git-release-manager/src/features/Features.test.tsx
index 8f9e3544f2..110c3e2351 100644
--- a/plugins/git-release-manager/src/features/Features.test.tsx
+++ b/plugins/git-release-manager/src/features/Features.test.tsx
@@ -79,6 +79,11 @@ describe('Features', () => {
to="https://docs.github.com/en/github/administering-a-repository/managing-releases-in-a-repository"
>
Git releases
+
+ , Opens in a new window
+
.
diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md
index 3a64b5e519..c1542585e5 100644
--- a/plugins/github-actions/CHANGELOG.md
+++ b/plugins/github-actions/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-github-actions
+## 0.5.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.5.5-next.0
### Patch Changes
diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json
index da0bacebd5..69aca919ba 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.5-next.0",
+ "version": "0.5.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -37,10 +37,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/integration": "^1.2.0-next.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -55,10 +55,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md
index 8456d274d6..855f57e6eb 100644
--- a/plugins/github-deployments/CHANGELOG.md
+++ b/plugins/github-deployments/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-github-deployments
+## 0.1.36-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/integration-react@1.1.0-next.1
+
## 0.1.36-next.0
### Patch Changes
diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json
index 7ce8422b0a..fa38477979 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.36-next.0",
+ "version": "0.1.36-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -25,12 +25,12 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
"@backstage/integration": "^1.2.0-next.0",
- "@backstage/integration-react": "^1.1.0-next.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/integration-react": "^1.1.0-next.1",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -43,10 +43,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md
index 051a15e183..e26876a94a 100644
--- a/plugins/gitops-profiles/CHANGELOG.md
+++ b/plugins/gitops-profiles/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-gitops-profiles
+## 0.3.23-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.3.22
### Patch Changes
diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json
index f5d8020d84..16f079aaab 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.22",
+ "version": "0.3.23-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,8 +35,8 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -48,10 +48,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md
index 45c6f2fb60..82749a211e 100644
--- a/plugins/gocd/CHANGELOG.md
+++ b/plugins/gocd/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-gocd
+## 0.1.11-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.11-next.0
### Patch Changes
diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json
index fff85992f3..16894fd78d 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.11-next.0",
+ "version": "0.1.11-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -32,10 +32,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -49,10 +49,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md
index fd3b55766a..2dafc7ef99 100644
--- a/plugins/graphiql/CHANGELOG.md
+++ b/plugins/graphiql/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-graphiql
+## 0.2.37-next.0
+
+### Patch Changes
+
+- 8d4ecc30f1: Updated dependency `@types/codemirror` to `^0.0.109`.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.2.36
### Patch Changes
diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json
index 2c6a1f883d..9abdf8fbd7 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.36",
+ "version": "0.2.37-next.0",
"private": false,
"publishConfig": {
"access": "public",
@@ -34,8 +34,8 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -48,14 +48,14 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
- "@types/codemirror": "^0.0.108",
+ "@types/codemirror": "^0.0.109",
"@types/jest": "^26.0.7",
"@types/node": "^16.11.26",
"cross-fetch": "^3.1.5",
diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json
index 5e932892ca..3abf17b87a 100644
--- a/plugins/graphql-backend/package.json
+++ b/plugins/graphql-backend/package.json
@@ -38,13 +38,13 @@
"@backstage/config": "^1.0.0",
"@backstage/plugin-catalog-graphql": "^0.3.8",
"@graphql-tools/schema": "^8.3.1",
- "graphql-modules": "^2.0.0",
"@types/express": "^4.17.6",
"apollo-server": "^3.0.0",
"apollo-server-express": "^3.0.0",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
"graphql": "^16.0.0",
+ "graphql-modules": "^2.0.0",
"helmet": "^5.0.2",
"reflect-metadata": "^0.1.13",
"winston": "^3.2.1",
@@ -53,7 +53,6 @@
"devDependencies": {
"@backstage/cli": "^0.17.1-next.0",
"@types/supertest": "^2.0.8",
- "eslint-plugin-graphql": "^4.0.0",
"msw": "^0.35.0",
"supertest": "^6.1.3"
},
diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md
index 125c427aee..b4989a2af6 100644
--- a/plugins/home/CHANGELOG.md
+++ b/plugins/home/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-home
+## 0.4.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/plugin-stack-overflow@0.1.1-next.1
+
## 0.4.21-next.0
### Patch Changes
diff --git a/plugins/home/package.json b/plugins/home/package.json
index ce21cb36cb..a59aa2b744 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.21-next.0",
+ "version": "0.4.21-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,10 +35,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
- "@backstage/plugin-stack-overflow": "^0.1.1-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
+ "@backstage/plugin-stack-overflow": "^0.1.1-next.1",
"@backstage/theme": "^0.2.15",
"@backstage/config": "^1.0.0",
"@material-ui/core": "^4.12.2",
@@ -53,10 +53,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md
index 4b99a56a87..c2d5675ff5 100644
--- a/plugins/ilert/CHANGELOG.md
+++ b/plugins/ilert/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-ilert
+## 0.1.31-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.31-next.0
### Patch Changes
diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json
index f410123a86..149b135463 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.1.31-next.0",
+ "version": "0.1.31-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -25,10 +25,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@date-io/luxon": "1.x",
"@material-ui/core": "^4.12.2",
@@ -43,10 +43,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md
index 62b27ecb2d..f84dbdabcc 100644
--- a/plugins/jenkins/CHANGELOG.md
+++ b/plugins/jenkins/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-jenkins
+## 0.7.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.7.4-next.0
### Patch Changes
diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json
index 1cbe6dd327..9b9be06bf8 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.4-next.0",
+ "version": "0.7.4-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -36,10 +36,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/plugin-jenkins-common": "^0.1.3",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
@@ -54,10 +54,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md
index 67f8e97b7c..393b162761 100644
--- a/plugins/kafka/CHANGELOG.md
+++ b/plugins/kafka/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-kafka
+## 0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.3.5-next.0
### Patch Changes
diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json
index edd2549567..73db72cbb3 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.5-next.0",
+ "version": "0.3.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -25,9 +25,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -39,10 +39,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/plugins/kubernetes-backend/examples/dice-roller/README.md b/plugins/kubernetes-backend/examples/dice-roller/README.md
index d4725e38c0..f7bcdd3973 100644
--- a/plugins/kubernetes-backend/examples/dice-roller/README.md
+++ b/plugins/kubernetes-backend/examples/dice-roller/README.md
@@ -16,7 +16,7 @@ This can be used to run the kubernetes plugin locally against a mock service.
## Steps
1. Start minikube
-2. Get the Kubernetes master base url `kubectl cluster-info`
+2. Get the Kubernetes master base URL `kubectl cluster-info`
3. Apply manifests `kubectl apply -f dice-roller-manifests.yaml`
4. Get service account token (see below)
5. Start Backstage UI and backend
diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md
index dbf11048c7..628036cf01 100644
--- a/plugins/kubernetes/CHANGELOG.md
+++ b/plugins/kubernetes/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-kubernetes
+## 0.6.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.6.5-next.0
### Patch Changes
diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json
index fa89134fc2..5309aefe49 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.6.5-next.0",
+ "version": "0.6.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -36,9 +36,9 @@
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/plugin-kubernetes-common": "^0.2.9",
"@backstage/theme": "^0.2.15",
"@kubernetes/client-node": "^0.16.0",
@@ -57,10 +57,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md
index 4a836ad7b9..ce6a6b092d 100644
--- a/plugins/lighthouse/CHANGELOG.md
+++ b/plugins/lighthouse/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-lighthouse
+## 0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.3.5-next.0
### Patch Changes
diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json
index 5b905609c9..7df7f321ad 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.5-next.0",
+ "version": "0.3.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -37,9 +37,9 @@
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -51,10 +51,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md
index ce74e8345d..f099f3a762 100644
--- a/plugins/newrelic-dashboard/CHANGELOG.md
+++ b/plugins/newrelic-dashboard/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-newrelic-dashboard
+## 0.1.13-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.13-next.0
### Patch Changes
diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json
index 0400befd42..be2d59a8d0 100644
--- a/plugins/newrelic-dashboard/package.json
+++ b/plugins/newrelic-dashboard/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-newrelic-dashboard",
- "version": "0.1.13-next.0",
+ "version": "0.1.13-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,18 +24,18 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
"react-use": "^17.2.4"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/dev-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/dev-utils": "^1.0.2-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@types/react": "^16.13.1 || ^17.0.0",
"cross-fetch": "^3.1.5"
diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md
index 4c301dbd27..3a6424ae61 100644
--- a/plugins/newrelic/CHANGELOG.md
+++ b/plugins/newrelic/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-newrelic
+## 0.3.23-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.3.22
### Patch Changes
diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json
index 3b2d0fdf20..94970c0b41 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.22",
+ "version": "0.3.23-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,8 +35,8 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -47,10 +47,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md
index 69ba25ee8e..81b9b6be6c 100644
--- a/plugins/org/CHANGELOG.md
+++ b/plugins/org/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-org
+## 0.5.5-next.1
+
+### Patch Changes
+
+- cb0db62344: Fix linking ownership card to catalog owner filter when namespaces are used
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.5.5-next.0
### Patch Changes
diff --git a/plugins/org/package.json b/plugins/org/package.json
index de8a699f48..612410dc7a 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.5.5-next.0",
+ "version": "0.5.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,9 +30,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -49,10 +49,10 @@
},
"devDependencies": {
"@backstage/catalog-client": "^1.0.1",
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.test.tsx b/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.test.tsx
index b6e3982d51..16a8898f0a 100644
--- a/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.test.tsx
+++ b/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.test.tsx
@@ -265,6 +265,10 @@ describe('OwnershipCard', () => {
type: 'memberOf',
targetRef: 'group:default/my-team',
},
+ {
+ type: 'memberOf',
+ targetRef: 'group:custom/some-team',
+ },
],
};
const catalogApi: jest.Mocked = {
@@ -288,7 +292,7 @@ describe('OwnershipCard', () => {
expect(getByText('OPENAPI').closest('a')).toHaveAttribute(
'href',
- '/create/?filters%5Bkind%5D=API&filters%5Btype%5D=openapi&filters%5Bowners%5D=the-user&filters%5Bowners%5D=my-team&filters%5Buser%5D=all',
+ '/create/?filters%5Bkind%5D=API&filters%5Btype%5D=openapi&filters%5Bowners%5D=user%3Athe-user&filters%5Bowners%5D=my-team&filters%5Bowners%5D=custom%2Fsome-team&filters%5Buser%5D=all',
);
});
diff --git a/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts b/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts
index 6a4aaa1399..7c0bb76e2e 100644
--- a/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts
+++ b/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts
@@ -18,12 +18,14 @@ import {
Entity,
RELATION_MEMBER_OF,
RELATION_PARENT_OF,
+ parseEntityRef,
stringifyEntityRef,
} from '@backstage/catalog-model';
import {
CatalogApi,
catalogApiRef,
getEntityRelations,
+ humanizeEntityRef,
} from '@backstage/plugin-catalog-react';
import limiterFactory from 'p-limit';
import { useApi } from '@backstage/core-plugin-api';
@@ -43,7 +45,9 @@ const getQueryParams = (
selectedEntity: EntityTypeProps,
): string => {
const { kind, type } = selectedEntity;
- const owners = ownersEntityRef.map(owner => owner.split('/')[1]);
+ const owners = ownersEntityRef.map(owner =>
+ humanizeEntityRef(parseEntityRef(owner), { defaultKind: 'group' }),
+ );
const filters = {
kind,
type,
diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md
index 83a69ade78..cb178cfa3d 100644
--- a/plugins/pagerduty/CHANGELOG.md
+++ b/plugins/pagerduty/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-pagerduty
+## 0.3.32-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.3.32-next.0
### Patch Changes
diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json
index f9b70fb4b9..522147ab4f 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.3.32-next.0",
+ "version": "0.3.32-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,9 +35,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -52,10 +52,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md
index 10d18c3444..60a49881c5 100644
--- a/plugins/periskop/CHANGELOG.md
+++ b/plugins/periskop/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-periskop
+## 0.1.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.1.3-next.0
### Patch Changes
diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json
index 985bcff656..177e53b4bf 100644
--- a/plugins/periskop/package.json
+++ b/plugins/periskop/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-periskop",
- "version": "0.1.3-next.0",
+ "version": "0.1.3-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -26,10 +26,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -42,10 +42,10 @@
"react-dom": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md
index ce2f425a0b..fdcdbb8f69 100644
--- a/plugins/permission-react/CHANGELOG.md
+++ b/plugins/permission-react/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-permission-react
+## 0.4.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.4.0
### Minor Changes
diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json
index 6c8f75fb98..de9709835e 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.0",
+ "version": "0.4.1-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -32,7 +32,7 @@
},
"dependencies": {
"@backstage/config": "^1.0.0",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/plugin-permission-common": "^0.6.0",
"cross-fetch": "^3.1.5",
"react-router": "6.0.0-beta.0",
@@ -44,8 +44,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@types/jest": "^26.0.7"
diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md
index a44cf6e1a6..bd4dfd9bef 100644
--- a/plugins/rollbar-backend/CHANGELOG.md
+++ b/plugins/rollbar-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-rollbar-backend
+## 0.1.29-next.1
+
+### Patch Changes
+
+- ab1435dcc9: Updated README to include clearer installation instructions on how to install and configure.
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+
## 0.1.29-next.0
### Patch Changes
diff --git a/plugins/rollbar-backend/README.md b/plugins/rollbar-backend/README.md
index 2dcf6495dd..d28ee60181 100644
--- a/plugins/rollbar-backend/README.md
+++ b/plugins/rollbar-backend/README.md
@@ -4,6 +4,58 @@ Simple plugin that proxies requests to the [Rollbar](https://rollbar.com) API.
## Setup
+1. Install the plugin using:
+
+```bash
+# From your Backstage root directory
+yarn add --cwd packages/backend @backstage/plugin-rollbar-backend
+```
+
+2. Create a `rollbar.ts` file inside `packages/backend/src/plugins/`:
+
+```typescript
+import { createRouter } from '@backstage/plugin-rollbar-backend';
+import { Router } from 'express';
+import { PluginEnvironment } from '../types';
+
+export default async function createPlugin(
+ env: PluginEnvironment,
+): Promise {
+ return await createRouter({
+ logger: env.logger,
+ config: env.config,
+ });
+}
+```
+
+3. Modify your `packages/backend/src/index.ts` to include:
+
+```diff
+ ...
+
+ import { Config } from '@backstage/config';
+ import app from './plugins/app';
++import rollbar from './plugins/rollbar';
+ import scaffolder from './plugins/scaffolder';
+
+ ...
+
+ async function main() {
+
+ ...
+
+ const authEnv = useHotMemoize(module, () => createEnv('auth'));
++ const rollbarEnv = useHotMemoize(module, () => createEnv('rollbar'));
+ const proxyEnv = useHotMemoize(module, () => createEnv('proxy'));
+
+ ...
+
+ const apiRouter = Router();
+ apiRouter.use('/catalog', await catalog(catalogEnv));
++ apiRouter.use('/rollbar', await rollbar(rollbarEnv));
+ apiRouter.use('/scaffolder', await scaffolder(scaffolderEnv));
+```
+
The following values are read from the configuration file.
```yaml
diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json
index b93723a286..120a3ab3db 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.29-next.0",
+ "version": "0.1.29-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,7 +34,7 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-common": "^0.13.3-next.1",
"@backstage/config": "^1.0.0",
"@types/express": "^4.17.6",
"camelcase-keys": "^7.0.1",
@@ -51,7 +51,7 @@
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.24-next.0",
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@types/supertest": "^2.0.8",
"msw": "^0.36.3",
"supertest": "^6.1.3"
diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md
index c1d7776dd5..b10f6f7a46 100644
--- a/plugins/rollbar/CHANGELOG.md
+++ b/plugins/rollbar/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-rollbar
+## 0.4.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.4.5-next.0
### Patch Changes
diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json
index 217e2d4041..4d68bd1e35 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.5-next.0",
+ "version": "0.4.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -36,9 +36,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -53,10 +53,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/plugins/scaffolder-backend-module-rails/README.md b/plugins/scaffolder-backend-module-rails/README.md
index 182f741845..9d1316473d 100644
--- a/plugins/scaffolder-backend-module-rails/README.md
+++ b/plugins/scaffolder-backend-module-rails/README.md
@@ -246,3 +246,16 @@ steps:
system: ${{ parameters.system }}
railsArguments: ${{ parameters.railsArguments }}
```
+
+You also need to configure the list of allowed images as part of the creating the action for the scaffolder backend:
+
+```typescript
+const actions = [
+ createFetchRailsAction({
+ integrations,
+ reader: env.reader,
+ containerRunner,
+ allowedImageNames: ['repository/rails:tag'],
+ }),
+];
+```
diff --git a/plugins/scaffolder-backend-module-rails/api-report.md b/plugins/scaffolder-backend-module-rails/api-report.md
index aa631c5333..551da91314 100644
--- a/plugins/scaffolder-backend-module-rails/api-report.md
+++ b/plugins/scaffolder-backend-module-rails/api-report.md
@@ -14,6 +14,7 @@ export function createFetchRailsAction(options: {
reader: UrlReader;
integrations: ScmIntegrations;
containerRunner: ContainerRunner;
+ allowedImageNames?: string[];
}): TemplateAction<{
url: string;
targetPath?: string | undefined;
diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts
index 0a6a996aa8..597847130a 100644
--- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts
+++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts
@@ -86,6 +86,7 @@ describe('fetch:rails', () => {
integrations,
reader: mockReader,
containerRunner,
+ allowedImageNames: ['foo/rails-custom-image'],
});
beforeEach(() => {
@@ -138,6 +139,35 @@ describe('fetch:rails', () => {
});
});
+ it('should not allow unknown images', async () => {
+ await expect(
+ action.handler({
+ ...mockContext,
+ input: {
+ ...mockContext.input,
+ imageName: 'foo/bar',
+ },
+ }),
+ ).rejects.toThrow('Image foo/bar is not allowed');
+ });
+
+ it('should not allow any images', async () => {
+ const action2 = createFetchRailsAction({
+ integrations,
+ reader: mockReader,
+ containerRunner,
+ });
+ await expect(
+ action2.handler({
+ ...mockContext,
+ input: {
+ ...mockContext.input,
+ imageName: 'foo/rails-custom-image',
+ },
+ }),
+ ).rejects.toThrow('Image foo/rails-custom-image is not allowed');
+ });
+
it('should throw if the target directory is outside of the workspace path', async () => {
await expect(
action.handler({
diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts
index 132929ee1c..d1a9ed7650 100644
--- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts
+++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts
@@ -41,6 +41,8 @@ export function createFetchRailsAction(options: {
reader: UrlReader;
integrations: ScmIntegrations;
containerRunner: ContainerRunner;
+ /** A list of image names that are allowed to be passed as imageName input */
+ allowedImageNames?: string[];
}) {
const { reader, integrations, containerRunner } = options;
@@ -177,16 +179,16 @@ export function createFetchRailsAction(options: {
const templateRunner = new RailsNewRunner({ containerRunner });
- const values = {
- ...ctx.input.values,
- imageName: ctx.input.imageName,
- };
+ const { imageName } = ctx.input;
+ if (imageName && !options.allowedImageNames?.includes(imageName)) {
+ throw new Error(`Image ${imageName} is not allowed`);
+ }
// Will execute the template in ./template and put the result in ./result
await templateRunner.run({
workspacePath: workDir,
logStream: ctx.logStream,
- values,
+ values: { ...ctx.input.values, imageName },
});
// Finally move the template result into the task workspace
diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts
index 4a4672795a..0ed02e293c 100644
--- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts
+++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts
@@ -74,6 +74,9 @@ export class RailsNewRunner {
logStream,
});
} else {
+ if (!imageName) {
+ throw new Error('No imageName provided');
+ }
const arrayExtraArguments = railsArgumentResolver(
'/input',
railsArguments as RailsRunOptions,
diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md
index fd22cdf2b5..c2f287de82 100644
--- a/plugins/scaffolder/CHANGELOG.md
+++ b/plugins/scaffolder/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-scaffolder
+## 1.2.0-next.1
+
+### Patch Changes
+
+- 8dce7d5244: Allow validation for custom field extension with type object
+- ace230b599: Updated dependency `@codemirror/legacy-modes` to `^0.20.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/integration-react@1.1.0-next.1
+ - @backstage/plugin-permission-react@0.4.1-next.0
+
## 1.2.0-next.0
### Minor Changes
diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json
index aa203f132c..4f8b2ba53d 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.2.0-next.0",
+ "version": "1.2.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -38,27 +38,27 @@
"@backstage/catalog-client": "^1.0.1",
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
"@backstage/integration": "^1.2.0-next.0",
- "@backstage/integration-react": "^1.1.0-next.0",
+ "@backstage/integration-react": "^1.1.0-next.1",
"@backstage/plugin-catalog-common": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
- "@backstage/plugin-permission-react": "^0.4.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
+ "@backstage/plugin-permission-react": "^0.4.1-next.0",
"@backstage/plugin-scaffolder-common": "^1.0.1",
"@backstage/theme": "^0.2.15",
"@backstage/types": "^1.0.0",
- "@codemirror/legacy-modes": "^0.19.0",
- "@codemirror/panel": "^0.19.1",
- "@codemirror/stream-parser": "^0.19.6",
+ "@codemirror/legacy-modes": "^0.20.0",
+ "@codemirror/language": "^0.20.0",
+ "@codemirror/view": "^0.20.2",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
"@rjsf/core": "^3.2.1",
"@rjsf/material-ui": "^3.2.1",
"@types/json-schema": "^7.0.9",
- "@uiw/react-codemirror": "^4.5.1",
+ "@uiw/react-codemirror": "^4.7.0",
"classnames": "^2.2.6",
"git-url-parse": "^11.6.0",
"humanize-duration": "^3.25.1",
@@ -70,7 +70,7 @@
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^17.2.4",
- "use-immer": "^0.6.0",
+ "use-immer": "^0.7.0",
"yaml": "^1.9.2",
"zen-observable": "^0.8.15"
},
@@ -79,11 +79,11 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/plugin-catalog": "^1.2.0-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/plugin-catalog": "^1.2.0-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
@@ -92,7 +92,7 @@
"@types/jest": "^26.0.7",
"@types/node": "^16.11.26",
"cross-fetch": "^3.1.5",
- "event-source-polyfill": "1.0.25",
+ "event-source-polyfill": "1.0.26",
"msw": "^0.35.0"
},
"files": [
diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx
index aa04e8d1c6..71c64a9fa4 100644
--- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx
+++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx
@@ -25,8 +25,9 @@ import {
} from '@backstage/plugin-catalog-react';
import { JsonObject } from '@backstage/types';
import { yaml as yamlSupport } from '@codemirror/legacy-modes/mode/yaml';
-import { showPanel } from '@codemirror/panel';
-import { StreamLanguage } from '@codemirror/stream-parser';
+import { showPanel } from '@codemirror/view';
+import { StreamLanguage } from '@codemirror/language';
+
import {
FormControl,
Grid,
diff --git a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx
index fc1c4f222d..22f995eae4 100644
--- a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx
+++ b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx
@@ -13,23 +13,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { JsonObject, JsonValue } from '@backstage/types';
import { LinearProgress } from '@material-ui/core';
-import { FormValidation, IChangeEvent } from '@rjsf/core';
+import { IChangeEvent } from '@rjsf/core';
import qs from 'qs';
import React, { useCallback, useContext, useState } from 'react';
import { Navigate, useNavigate } from 'react-router';
import { useParams } from 'react-router-dom';
import useAsync from 'react-use/lib/useAsync';
import { scaffolderApiRef } from '../../api';
-import { CustomFieldValidator, FieldExtensionOptions } from '../../extensions';
+import { FieldExtensionOptions } from '../../extensions';
import { SecretsContext } from '../secrets/SecretsContext';
import { rootRouteRef, scaffolderTaskRouteRef } from '../../routes';
import { MultistepJsonForm } from '../MultistepJsonForm';
+import { createValidator } from './createValidator';
import { Content, Header, InfoCard, Page } from '@backstage/core-components';
import {
- ApiHolder,
errorApiRef,
useApi,
useApiHolder,
@@ -46,60 +45,6 @@ const useTemplateParameterSchema = (templateRef: string) => {
return { schema: value, loading, error };
};
-function isObject(obj: unknown): obj is JsonObject {
- return typeof obj === 'object' && obj !== null && !Array.isArray(obj);
-}
-
-export const createValidator = (
- rootSchema: JsonObject,
- validators: Record>,
- context: {
- apiHolder: ApiHolder;
- },
-) => {
- function validate(
- schema: JsonObject,
- formData: JsonObject,
- errors: FormValidation,
- ) {
- const schemaProps = schema.properties;
- if (!isObject(schemaProps)) {
- return;
- }
-
- for (const [key, propData] of Object.entries(formData)) {
- const propValidation = errors[key];
-
- if (isObject(propData)) {
- const propSchemaProps = schemaProps[key];
- if (isObject(propSchemaProps)) {
- validate(
- propSchemaProps,
- propData as JsonObject,
- propValidation as FormValidation,
- );
- }
- } else {
- const propSchema = schemaProps[key];
- const fieldName =
- isObject(propSchema) && (propSchema['ui:field'] as string);
- if (fieldName && typeof validators[fieldName] === 'function') {
- validators[fieldName]!(
- propData as JsonValue,
- propValidation,
- context,
- );
- }
- }
- }
- }
-
- return (formData: JsonObject, errors: FormValidation) => {
- validate(rootSchema, formData, errors);
- return errors;
- };
-};
-
export const TemplatePage = ({
customFieldExtensions = [],
}: {
diff --git a/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts b/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts
new file mode 100644
index 0000000000..047f22e44e
--- /dev/null
+++ b/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts
@@ -0,0 +1,74 @@
+/*
+ * 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 { createValidator } from './createValidator';
+import { CustomFieldValidator } from '../../extensions';
+import { ApiHolder } from '@backstage/core-plugin-api';
+import { FormValidation } from '@rjsf/core';
+
+describe('createValidator', () => {
+ const validators: Record> =
+ {
+ CustomPicker: (value, validation, _context) => {
+ // @ts-ignore
+ if (!value || !value.value) {
+ validation.addError('Error !');
+ }
+ },
+ };
+
+ const apiHolderMock: jest.Mocked = {
+ get: jest.fn().mockImplementation(() => {
+ return null;
+ }),
+ };
+
+ const context = {
+ apiHolder: apiHolderMock,
+ };
+
+ it('Should call validator for object property from a custom field extension', () => {
+ /* GIVEN */
+ const rootSchema = {
+ title: 'Title',
+ properties: {
+ p1: {
+ title: 'PropertyOn',
+ type: 'object',
+ 'ui:field': 'CustomPicker',
+ },
+ },
+ };
+ const validator = createValidator(rootSchema, validators, context);
+
+ const formData = {
+ p1: {},
+ };
+ const errors = {
+ addError: jest.fn(),
+ p1: {
+ addError: jest.fn(),
+ } as unknown as FormValidation,
+ } as unknown as FormValidation;
+
+ /* WHEN */
+ const result = validator(formData, errors);
+
+ /* THEN */
+ expect(result).not.toBeNull();
+ expect(result.p1.addError).toBeCalledTimes(1);
+ });
+});
diff --git a/plugins/scaffolder/src/components/TemplatePage/createValidator.ts b/plugins/scaffolder/src/components/TemplatePage/createValidator.ts
new file mode 100644
index 0000000000..9cd1489a02
--- /dev/null
+++ b/plugins/scaffolder/src/components/TemplatePage/createValidator.ts
@@ -0,0 +1,83 @@
+/*
+ * 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 { CustomFieldValidator } from '../../extensions';
+import { FormValidation } from '@rjsf/core';
+import { JsonObject, JsonValue } from '@backstage/types';
+import { ApiHolder } from '@backstage/core-plugin-api';
+
+function isObject(obj: unknown): obj is JsonObject {
+ return typeof obj === 'object' && obj !== null && !Array.isArray(obj);
+}
+
+export const createValidator = (
+ rootSchema: JsonObject,
+ validators: Record>,
+ context: {
+ apiHolder: ApiHolder;
+ },
+) => {
+ function validate(
+ schema: JsonObject,
+ formData: JsonObject,
+ errors: FormValidation,
+ ) {
+ const schemaProps = schema.properties;
+ const customObject = schema.type === 'object' && schemaProps === undefined;
+
+ if (!isObject(schemaProps) && !customObject) {
+ return;
+ }
+
+ if (schemaProps) {
+ for (const [key, propData] of Object.entries(formData)) {
+ const propValidation = errors[key];
+
+ if (isObject(propData)) {
+ const propSchemaProps = schemaProps[key];
+ if (isObject(propSchemaProps)) {
+ validate(
+ propSchemaProps,
+ propData as JsonObject,
+ propValidation as FormValidation,
+ );
+ }
+ } else {
+ const propSchema = schemaProps[key];
+ const fieldName =
+ isObject(propSchema) && (propSchema['ui:field'] as string);
+ if (fieldName && typeof validators[fieldName] === 'function') {
+ validators[fieldName]!(
+ propData as JsonValue,
+ propValidation,
+ context,
+ );
+ }
+ }
+ }
+ } else if (customObject) {
+ const fieldName = schema['ui:field'] as string;
+ if (fieldName && typeof validators[fieldName] === 'function') {
+ validators[fieldName]!(formData, errors, context);
+ }
+ }
+ }
+
+ return (formData: JsonObject, errors: FormValidation) => {
+ validate(rootSchema, formData, errors);
+ return errors;
+ };
+};
diff --git a/plugins/scaffolder/src/components/TemplatePage/index.ts b/plugins/scaffolder/src/components/TemplatePage/index.ts
index b01da032e5..d3ae24504b 100644
--- a/plugins/scaffolder/src/components/TemplatePage/index.ts
+++ b/plugins/scaffolder/src/components/TemplatePage/index.ts
@@ -13,4 +13,5 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-export { createValidator, TemplatePage } from './TemplatePage';
+export { TemplatePage } from './TemplatePage';
+export { createValidator } from './createValidator';
diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.ts
index bf07b8a36d..2a738e1506 100644
--- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.ts
+++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.ts
@@ -53,7 +53,7 @@ export class ElasticSearchSearchEngineIndexer extends BatchSearchEngineIndexer {
private bulkResult: Promise;
constructor(options: ElasticSearchSearchEngineIndexerOptions) {
- super({ batchSize: 100 });
+ super({ batchSize: 1000 });
this.logger = options.logger;
this.startTimestamp = process.hrtime();
this.type = options.type;
diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts
index 8618bed4c8..cc89f28c80 100644
--- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts
+++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts
@@ -136,7 +136,7 @@ describe('PgSearchEngine', () => {
// Indexer instantiated with expected args.
expect(PgSearchEngineIndexer).toHaveBeenCalledWith(
expect.objectContaining({
- batchSize: 100,
+ batchSize: 1000,
type: 'my-type',
databaseStore: database,
}),
diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts
index ea363d8ea1..445d1bb5c1 100644
--- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts
+++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts
@@ -78,7 +78,7 @@ export class PgSearchEngine implements SearchEngine {
async getIndexer(type: string) {
return new PgSearchEngineIndexer({
- batchSize: 100,
+ batchSize: 1000,
type,
databaseStore: this.databaseStore,
});
diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngineIndexer.ts b/plugins/search-backend-node/src/engines/LunrSearchEngineIndexer.ts
index 49afafea64..a798f7c81f 100644
--- a/plugins/search-backend-node/src/engines/LunrSearchEngineIndexer.ts
+++ b/plugins/search-backend-node/src/engines/LunrSearchEngineIndexer.ts
@@ -27,7 +27,7 @@ export class LunrSearchEngineIndexer extends BatchSearchEngineIndexer {
private docStore: Record = {};
constructor() {
- super({ batchSize: 100 });
+ super({ batchSize: 1000 });
this.builder = new lunr.Builder();
this.builder.pipeline.add(lunr.trimmer, lunr.stopWordFilter, lunr.stemmer);
diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md
index 4c3ddea146..9202d489ad 100644
--- a/plugins/search-react/CHANGELOG.md
+++ b/plugins/search-react/CHANGELOG.md
@@ -1,5 +1,31 @@
# @backstage/plugin-search-react
+## 0.2.0-next.1
+
+### Minor Changes
+
+- bdbe620797: **BREAKING**: `SearchContextProviderForStorybook` and `SearchApiProviderForStorybook` has been deleted. New mock implementation of the `SearchApi` introduced. If you need to mock the api we recommend you to do the following:
+
+ ```tsx
+ import {
+ searchApiRef,
+ MockSearchApi,
+ SearchContextProvider,
+ } from '@backstage/plugin-search-react';
+ import { TestApiProvider } from '@backstage/test-utils';
+
+
+
+
+
+ ;
+ ```
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/search-react/api-report.md b/plugins/search-react/api-report.md
index 969e4d8563..e8d3afff82 100644
--- a/plugins/search-react/api-report.md
+++ b/plugins/search-react/api-report.md
@@ -5,31 +5,27 @@
```ts
import { ApiRef } from '@backstage/core-plugin-api';
import { AsyncState } from 'react-use/lib/useAsync';
-import { ComponentProps } from 'react';
import { JsonObject } from '@backstage/types';
import { PropsWithChildren } from 'react';
import { default as React_2 } from 'react';
import { SearchQuery } from '@backstage/plugin-search-common';
import { SearchResultSet } from '@backstage/plugin-search-common';
+// @public
+export class MockSearchApi implements SearchApi {
+ constructor(mockedResults?: SearchResultSet | undefined);
+ // (undocumented)
+ mockedResults?: SearchResultSet | undefined;
+ // (undocumented)
+ query(): Promise;
+}
+
// @public (undocumented)
export interface SearchApi {
// (undocumented)
query(query: SearchQuery): Promise;
}
-// @public
-export function SearchApiProviderForStorybook(
- props: SearchApiProviderForStorybookProps,
-): JSX.Element;
-
-// @public
-export type SearchApiProviderForStorybookProps = ComponentProps<
- typeof SearchContextProvider
-> & {
- mockedResults?: SearchResultSet;
-};
-
// @public (undocumented)
export const searchApiRef: ApiRef;
@@ -38,16 +34,6 @@ export const SearchContextProvider: (
props: SearchContextProviderProps,
) => JSX.Element;
-// @public
-export const SearchContextProviderForStorybook: (
- props: SearchContextProviderForStorybookProps,
-) => JSX.Element;
-
-// @public
-export type SearchContextProviderForStorybookProps = PropsWithChildren<{
- mockedResults?: SearchResultSet;
-}>;
-
// @public
export type SearchContextProviderProps = PropsWithChildren<{
initialState?: SearchContextState;
diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json
index cc883fbda9..7579c3b9f8 100644
--- a/plugins/search-react/package.json
+++ b/plugins/search-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-react",
- "version": "0.1.1-next.0",
+ "version": "0.2.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -32,7 +32,7 @@
},
"dependencies": {
"@backstage/plugin-search-common": "^0.3.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/version-bridge": "^1.0.1",
"react-use": "^17.3.2",
"@backstage/types": "^1.0.0"
@@ -42,8 +42,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
"@testing-library/jest-dom": "^5.10.1"
diff --git a/plugins/search-react/src/api.ts b/plugins/search-react/src/api.ts
index eb8c9c23db..24a247a641 100644
--- a/plugins/search-react/src/api.ts
+++ b/plugins/search-react/src/api.ts
@@ -30,3 +30,16 @@ export const searchApiRef = createApiRef({
export interface SearchApi {
query(query: SearchQuery): Promise;
}
+
+/**
+ * @public
+ *
+ * Search Api Mock that can be used in tests and storybooks
+ */
+export class MockSearchApi implements SearchApi {
+ constructor(public mockedResults?: SearchResultSet) {}
+
+ query(): Promise {
+ return Promise.resolve(this.mockedResults || { results: [] });
+ }
+}
diff --git a/plugins/search-react/src/context/SearchContextForStorybook.stories.tsx b/plugins/search-react/src/context/SearchContextForStorybook.stories.tsx
deleted file mode 100644
index 603a89035f..0000000000
--- a/plugins/search-react/src/context/SearchContextForStorybook.stories.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2022 The Backstage Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { ApiProvider } from '@backstage/core-app-api';
-import { SearchResultSet } from '@backstage/plugin-search-common';
-import { TestApiRegistry } from '@backstage/test-utils';
-import React, { ComponentProps, PropsWithChildren } from 'react';
-import { searchApiRef } from '../api';
-import { SearchContextProvider } from './SearchContext';
-
-/**
- * Props for {@link SearchApiProviderForStorybook}
- * @public
- */
-export type SearchApiProviderForStorybookProps = ComponentProps<
- typeof SearchContextProvider
-> & {
- mockedResults?: SearchResultSet;
-};
-
-/**
- * Props for {@link SearchContextProviderForStorybook}
- * @public
- */
-export type SearchContextProviderForStorybookProps = PropsWithChildren<{
- mockedResults?: SearchResultSet;
-}>;
-
-/**
- * Utility api provider only for use in Storybook stories.
- *
- * @public
- */
-export function SearchApiProviderForStorybook(
- props: SearchApiProviderForStorybookProps,
-) {
- const { mockedResults, children } = props;
- const query: any = () => Promise.resolve(mockedResults || {});
- const apiRegistry = TestApiRegistry.from([searchApiRef, { query }]);
- return ;
-}
-
-/**
- * Utility context provider only for use in Storybook stories. You should use
- * the real `` exported by `@backstage/plugin-search-react` in
- * your app instead of this! In some cases (like the search page) it may
- * already be provided on your behalf.
- *
- * @public
- */
-export const SearchContextProviderForStorybook = (
- props: SearchContextProviderForStorybookProps,
-) => {
- return (
-
-
-
- );
-};
diff --git a/plugins/search-react/src/context/index.tsx b/plugins/search-react/src/context/index.tsx
index 76e1142bea..304f762943 100644
--- a/plugins/search-react/src/context/index.tsx
+++ b/plugins/search-react/src/context/index.tsx
@@ -24,11 +24,3 @@ export type {
SearchContextState,
SearchContextValue,
} from './SearchContext';
-export {
- SearchContextProviderForStorybook,
- SearchApiProviderForStorybook,
-} from './SearchContextForStorybook.stories';
-export type {
- SearchContextProviderForStorybookProps,
- SearchApiProviderForStorybookProps,
-} from './SearchContextForStorybook.stories';
diff --git a/plugins/search-react/src/index.ts b/plugins/search-react/src/index.ts
index 424c804472..d24bd097de 100644
--- a/plugins/search-react/src/index.ts
+++ b/plugins/search-react/src/index.ts
@@ -20,19 +20,15 @@
* @packageDocumentation
*/
-export { searchApiRef } from './api';
+export { searchApiRef, MockSearchApi } from './api';
export type { SearchApi } from './api';
export {
SearchContextProvider,
useSearch,
useSearchContextCheck,
- SearchContextProviderForStorybook,
- SearchApiProviderForStorybook,
} from './context';
export type {
SearchContextProviderProps,
SearchContextState,
SearchContextValue,
- SearchContextProviderForStorybookProps,
- SearchApiProviderForStorybookProps,
} from './context';
diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md
index bb68809574..397357326b 100644
--- a/plugins/search/CHANGELOG.md
+++ b/plugins/search/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-search
+## 0.8.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/plugin-search-react@0.2.0-next.1
+
## 0.8.1-next.0
### Patch Changes
diff --git a/plugins/search/package.json b/plugins/search/package.json
index e3ccd706c1..ee8c84fd58 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": "0.8.1-next.0",
+ "version": "0.8.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,11 +35,11 @@
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
- "@backstage/plugin-search-react": "^0.1.1-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
+ "@backstage/plugin-search-react": "^0.2.0-next.1",
"@backstage/plugin-search-common": "^0.3.3",
"@backstage/theme": "^0.2.15",
"@backstage/types": "^1.0.0",
@@ -57,10 +57,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/plugins/search/src/components/SearchBar/SearchBar.stories.tsx b/plugins/search/src/components/SearchBar/SearchBar.stories.tsx
index 72c7deb06b..9728101e97 100644
--- a/plugins/search/src/components/SearchBar/SearchBar.stories.tsx
+++ b/plugins/search/src/components/SearchBar/SearchBar.stories.tsx
@@ -16,7 +16,12 @@
import { Grid, makeStyles, Paper } from '@material-ui/core';
import React, { ComponentType } from 'react';
-import { SearchContextProviderForStorybook } from '@backstage/plugin-search-react';
+import {
+ searchApiRef,
+ MockSearchApi,
+ SearchContextProvider,
+} from '@backstage/plugin-search-react';
+import { TestApiProvider } from '@backstage/test-utils';
import { SearchBar } from './SearchBar';
export default {
@@ -24,13 +29,15 @@ export default {
component: SearchBar,
decorators: [
(Story: ComponentType<{}>) => (
-
-
-
-
+
+
+
+
+
+
-
-
+
+
),
],
};
diff --git a/plugins/search/src/components/SearchFilter/SearchFilter.stories.tsx b/plugins/search/src/components/SearchFilter/SearchFilter.stories.tsx
index 3c49b76699..7e8a7d585a 100644
--- a/plugins/search/src/components/SearchFilter/SearchFilter.stories.tsx
+++ b/plugins/search/src/components/SearchFilter/SearchFilter.stories.tsx
@@ -16,7 +16,12 @@
import { Grid, Paper } from '@material-ui/core';
import React, { ComponentType } from 'react';
-import { SearchContextProviderForStorybook } from '@backstage/plugin-search-react';
+import {
+ searchApiRef,
+ MockSearchApi,
+ SearchContextProvider,
+} from '@backstage/plugin-search-react';
+import { TestApiProvider } from '@backstage/test-utils';
import { SearchFilter } from './SearchFilter';
export default {
@@ -24,13 +29,15 @@ export default {
component: SearchFilter,
decorators: [
(Story: ComponentType<{}>) => (
-
-
-
-
+
+
+
+
+
+
-
-
+
+
),
],
};
diff --git a/plugins/search/src/components/SearchModal/SearchModal.stories.tsx b/plugins/search/src/components/SearchModal/SearchModal.stories.tsx
index e2e3db694b..a4e92f53ec 100644
--- a/plugins/search/src/components/SearchModal/SearchModal.stories.tsx
+++ b/plugins/search/src/components/SearchModal/SearchModal.stories.tsx
@@ -29,7 +29,12 @@ import React, { ComponentType } from 'react';
import { rootRouteRef } from '../../plugin';
import { DefaultResultListItem } from '../DefaultResultListItem';
import { SearchBar } from '../SearchBar';
-import { SearchApiProviderForStorybook } from '@backstage/plugin-search-react';
+import {
+ searchApiRef,
+ MockSearchApi,
+ SearchContextProvider,
+} from '@backstage/plugin-search-react';
+import { TestApiProvider } from '@backstage/test-utils';
import { SearchModal } from './SearchModal';
import { SearchResult } from '../SearchResult';
import { SearchResultPager } from '../SearchResultPager';
@@ -71,9 +76,14 @@ export default {
decorators: [
(Story: ComponentType<{}>) =>
wrapInTestApp(
-
-
- ,
+
+
+
+
+ ,
+
{ mountedRoutes: { '/search': rootRouteRef } },
),
],
diff --git a/plugins/search/src/components/SearchResult/SearchResult.stories.tsx b/plugins/search/src/components/SearchResult/SearchResult.stories.tsx
index 4a3d950164..207f1ae1d7 100644
--- a/plugins/search/src/components/SearchResult/SearchResult.stories.tsx
+++ b/plugins/search/src/components/SearchResult/SearchResult.stories.tsx
@@ -20,8 +20,13 @@ import React, { ComponentType } from 'react';
import { MemoryRouter } from 'react-router';
import { DefaultResultListItem } from '../DefaultResultListItem';
-import { SearchContextProviderForStorybook } from '@backstage/plugin-search-react';
+import {
+ searchApiRef,
+ MockSearchApi,
+ SearchContextProvider,
+} from '@backstage/plugin-search-react';
import { SearchResult } from './SearchResult';
+import { TestApiProvider } from '@backstage/test-utils';
const mockResults = {
results: [
@@ -58,9 +63,13 @@ export default {
decorators: [
(Story: ComponentType<{}>) => (
-
-
-
+
+
+
+
+
),
],
diff --git a/plugins/search/src/components/SearchType/SearchType.stories.tsx b/plugins/search/src/components/SearchType/SearchType.stories.tsx
index b56f4c089c..415eee19a6 100644
--- a/plugins/search/src/components/SearchType/SearchType.stories.tsx
+++ b/plugins/search/src/components/SearchType/SearchType.stories.tsx
@@ -19,21 +19,28 @@ import CatalogIcon from '@material-ui/icons/MenuBook';
import DocsIcon from '@material-ui/icons/Description';
import UsersGroupsIcon from '@material-ui/icons/Person';
import React, { ComponentType } from 'react';
-import { SearchContextProviderForStorybook } from '@backstage/plugin-search-react';
import { SearchType } from './SearchType';
+import { TestApiProvider } from '@backstage/test-utils';
+import {
+ searchApiRef,
+ MockSearchApi,
+ SearchContextProvider,
+} from '@backstage/plugin-search-react';
export default {
title: 'Plugins/Search/SearchType',
component: SearchType,
decorators: [
(Story: ComponentType<{}>) => (
-
-
-
-
+
+
+
+
+
+
-
-
+
+
),
],
};
diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md
index 6ccd6652bc..e07f0b44f1 100644
--- a/plugins/sentry/CHANGELOG.md
+++ b/plugins/sentry/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-sentry
+## 0.3.43-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.3.43-next.0
### Patch Changes
diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json
index c6ef1e974f..107425858e 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.3.43-next.0",
+ "version": "0.3.43-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -36,9 +36,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-table/core": "^3.1.0",
"@material-ui/core": "^4.12.2",
@@ -53,10 +53,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md
index 80f5007e59..f6f9845c97 100644
--- a/plugins/shortcuts/CHANGELOG.md
+++ b/plugins/shortcuts/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-shortcuts
+## 0.2.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.2.5
### Patch Changes
diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json
index adf2c26686..4613df7730 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.2.5",
+ "version": "0.2.6-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,8 +24,8 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/theme": "^0.2.15",
"@backstage/types": "^1.0.0",
"@material-ui/core": "^4.12.2",
@@ -42,10 +42,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/shortcuts/src/ShortcutItem.test.tsx b/plugins/shortcuts/src/ShortcutItem.test.tsx
index 528eb13efa..90b8ff06e5 100644
--- a/plugins/shortcuts/src/ShortcutItem.test.tsx
+++ b/plugins/shortcuts/src/ShortcutItem.test.tsx
@@ -19,11 +19,7 @@ import { screen, waitFor } from '@testing-library/react';
import { ShortcutItem } from './ShortcutItem';
import { Shortcut } from './types';
import { LocalStoredShortcuts } from './api';
-import {
- MockStorageApi,
- renderInTestApp,
- wrapInTestApp,
-} from '@backstage/test-utils';
+import { MockStorageApi, renderInTestApp } from '@backstage/test-utils';
import { SidebarContext } from '@backstage/core-components';
describe('ShortcutItem', () => {
@@ -66,12 +62,12 @@ describe('ShortcutItem', () => {
);
expect(screen.getByText('On')).toBeInTheDocument();
- rerender(wrapInTestApp( ));
+ rerender( );
await waitFor(() => {
expect(screen.getByText('TT')).toBeInTheDocument();
});
- rerender(wrapInTestApp( ));
+ rerender( );
await waitFor(() => {
expect(screen.getByText('MT')).toBeInTheDocument();
});
diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md
index 53d9d93d16..51ebbddc91 100644
--- a/plugins/sonarqube/CHANGELOG.md
+++ b/plugins/sonarqube/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-sonarqube
+## 0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.3.5-next.0
### Patch Changes
diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json
index 86684b08e3..3bb7cb848f 100644
--- a/plugins/sonarqube/package.json
+++ b/plugins/sonarqube/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-sonarqube",
"description": "",
- "version": "0.3.5-next.0",
+ "version": "0.3.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -37,9 +37,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -53,10 +53,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md
index 9d64906428..f29d621a80 100644
--- a/plugins/splunk-on-call/CHANGELOG.md
+++ b/plugins/splunk-on-call/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-splunk-on-call
+## 0.3.29-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.3.29-next.0
### Patch Changes
diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json
index b9db1a4f3b..c65d348567 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.3.29-next.0",
+ "version": "0.3.29-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,9 +35,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -51,10 +51,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md
index 4e1a3e957c..aa32b2eab6 100644
--- a/plugins/stack-overflow/CHANGELOG.md
+++ b/plugins/stack-overflow/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-stack-overflow
+## 0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-home@0.4.21-next.1
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json
index ba91b34818..cd72199203 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.1-next.0",
+ "version": "0.1.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,9 +24,9 @@
},
"dependencies": {
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
- "@backstage/plugin-home": "^0.4.21-next.0",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/plugin-home": "^0.4.21-next.1",
"@backstage/plugin-search-common": "^0.3.3",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
@@ -42,10 +42,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
"@types/jest": "^26.0.7",
diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md
index 298303dcf3..f9e8597d12 100644
--- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md
+++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-tech-insights-backend-module-jsonfc
+## 0.1.16-next.1
+
+### Patch Changes
+
+- 58e2c46151: Updated usages of `buildTechInsightsContext` in README.
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+ - @backstage/plugin-tech-insights-node@0.3.0-next.1
+
## 0.1.16-next.0
### Patch Changes
diff --git a/plugins/tech-insights-backend-module-jsonfc/README.md b/plugins/tech-insights-backend-module-jsonfc/README.md
index 70b2ef2c40..f61666d671 100644
--- a/plugins/tech-insights-backend-module-jsonfc/README.md
+++ b/plugins/tech-insights-backend-module-jsonfc/README.md
@@ -28,6 +28,7 @@ and modify the `techInsights.ts` file to contain a reference to the FactCheckers
config: env.config,
database: env.database,
discovery: env.discovery,
+ tokenManager: env.tokenManager,
factRetrievers: [myFactRetrieverRegistration],
+ factCheckerFactory: myFactCheckerFactory
});
diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json
index b03b8294b7..f8f028e796 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.16-next.0",
+ "version": "0.1.16-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,11 +34,11 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-common": "^0.13.3-next.1",
"@backstage/config": "^1.0.0",
"@backstage/errors": "^1.0.0",
"@backstage/plugin-tech-insights-common": "^0.2.4",
- "@backstage/plugin-tech-insights-node": "^0.2.10-next.0",
+ "@backstage/plugin-tech-insights-node": "^0.3.0-next.1",
"ajv": "^8.10.0",
"json-rules-engine": "^6.1.2",
"lodash": "^4.17.21",
@@ -46,7 +46,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0"
+ "@backstage/cli": "^0.17.1-next.1"
},
"files": [
"dist"
diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md
index 1f6828a777..e91f179d07 100644
--- a/plugins/tech-insights-backend/CHANGELOG.md
+++ b/plugins/tech-insights-backend/CHANGELOG.md
@@ -1,5 +1,32 @@
# @backstage/plugin-tech-insights-backend
+## 0.4.0-next.1
+
+### Minor Changes
+
+- 3333e20b27: **BREAKING**: The `buildTechInsightsContext` function now takes an additional
+ field in its options argument: `tokenManager`. This is an instance of
+ `TokenManager`, which can be found in your backend initialization code's
+ `env`.
+
+ ```diff
+ const builder = buildTechInsightsContext({
+ logger: env.logger,
+ config: env.config,
+ database: env.database,
+ discovery: env.discovery,
+ scheduler: env.scheduler,
+ + tokenManager: env.tokenManager,
+ factRetrievers: [ /* ... */ ],
+ });
+ ```
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+ - @backstage/plugin-tech-insights-node@0.3.0-next.1
+
## 0.3.1-next.0
### Patch Changes
diff --git a/plugins/tech-insights-backend/README.md b/plugins/tech-insights-backend/README.md
index ee6ef4c0cc..e88d150393 100644
--- a/plugins/tech-insights-backend/README.md
+++ b/plugins/tech-insights-backend/README.md
@@ -35,6 +35,7 @@ export default async function createPlugin(
database: env.database,
discovery: env.discovery,
scheduler: env.scheduler,
+ tokenManager: env.tokenManager,
factRetrievers: [], // Fact retrievers registrations you want tech insights to use
});
@@ -104,6 +105,7 @@ const builder = buildTechInsightsContext({
config: env.config,
database: env.database,
discovery: env.discovery,
+ tokenManager: env.tokenManager,
- factRetrievers: [],
+ factRetrievers: [myFactRetrieverRegistration],
});
@@ -119,6 +121,7 @@ const builder = buildTechInsightsContext({
config: env.config,
database: env.database,
discovery: env.discovery,
+ tokenManager: env.tokenManager,
- factRetrievers: [],
+ factRetrievers: process.env.MAIN_FACT_RETRIEVER_INSTANCE ? [myFactRetrieverRegistration] : [],
});
@@ -158,9 +161,12 @@ const myFactRetriever: FactRetriever = {
const catalogClient = new CatalogClient({
discoveryApi: discovery,
});
- const entities = await catalogClient.getEntities({
- filter: [{ kind: 'component' }],
- });
+ const entities = await catalogClient.getEntities(
+ {
+ filter: [{ kind: 'component' }],
+ },
+ { token },
+ );
/**
* snip: Do complex logic to retrieve facts from external system or calculate fact values
*/
@@ -214,6 +220,7 @@ and modify the `techInsights.ts` file to contain a reference to the FactChecker
config: env.config,
database: env.database,
discovery: env.discovery,
+ tokenManager: env.tokenManager,
factRetrievers: [myFactRetrieverRegistration],
+ factCheckerFactory: myFactCheckerFactory
});
@@ -273,6 +280,7 @@ export default async function createPlugin(
config: env.config,
database: env.database,
discovery: env.discovery,
+ tokenManager: env.tokenManager,
factRetrievers: [
createFactRetrieverRegistration({
cadence: '0 */6 * * *', // Run every 6 hours - https://crontab.guru/#0_*/6_*_*_*
diff --git a/plugins/tech-insights-backend/api-report.md b/plugins/tech-insights-backend/api-report.md
index 210aa50af9..9fee3be281 100644
--- a/plugins/tech-insights-backend/api-report.md
+++ b/plugins/tech-insights-backend/api-report.md
@@ -17,6 +17,7 @@ import { PluginEndpointDiscovery } from '@backstage/backend-common';
import { PluginTaskScheduler } from '@backstage/backend-tasks';
import { TechInsightCheck } from '@backstage/plugin-tech-insights-node';
import { TechInsightsStore } from '@backstage/plugin-tech-insights-node';
+import { TokenManager } from '@backstage/backend-common';
// @public
export const buildTechInsightsContext: <
@@ -95,6 +96,8 @@ export interface TechInsightsOptions<
logger: Logger;
// (undocumented)
scheduler: PluginTaskScheduler;
+ // (undocumented)
+ tokenManager: TokenManager;
}
// (No @packageDocumentation comment for this package)
diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json
index c3fccea8ad..e9ae330d21 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.3.1-next.0",
+ "version": "0.4.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,14 +34,14 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-common": "^0.13.3-next.1",
"@backstage/backend-tasks": "^0.3.1-next.0",
"@backstage/catalog-client": "^1.0.1",
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
"@backstage/errors": "^1.0.0",
"@backstage/plugin-tech-insights-common": "^0.2.4",
- "@backstage/plugin-tech-insights-node": "^0.2.10-next.0",
+ "@backstage/plugin-tech-insights-node": "^0.3.0-next.1",
"@types/express": "^4.17.6",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
@@ -55,7 +55,7 @@
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.24-next.0",
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
"@types/supertest": "^2.0.8",
"@types/semver": "^7.3.8",
"supertest": "^6.1.3",
diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts
index 0617c0aedd..454711171f 100644
--- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts
+++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts
@@ -22,7 +22,11 @@ import {
} from '@backstage/plugin-tech-insights-node';
import { FactRetrieverRegistry } from './FactRetrieverRegistry';
import { FactRetrieverEngine } from './FactRetrieverEngine';
-import { DatabaseManager, getVoidLogger } from '@backstage/backend-common';
+import {
+ DatabaseManager,
+ getVoidLogger,
+ ServerTokenManager,
+} from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';
import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils';
import { TaskScheduler } from '@backstage/backend-tasks';
@@ -129,6 +133,7 @@ describe('FactRetrieverEngine', () => {
factRetrieverContext: {
logger: getVoidLogger(),
config: ConfigReader.fromConfigs([]),
+ tokenManager: ServerTokenManager.noop(),
discovery: {
getBaseUrl: (_: string) => Promise.resolve('http://mock.url'),
getExternalBaseUrl: (_: string) => Promise.resolve('http://mock.url'),
diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.test.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.test.ts
index 9d5c57637d..31400788b5 100644
--- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.test.ts
+++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.test.ts
@@ -18,6 +18,7 @@ import { RELATION_OWNED_BY } from '@backstage/catalog-model';
import {
PluginEndpointDiscovery,
getVoidLogger,
+ ServerTokenManager,
} from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';
import { GetEntitiesResponse } from '@backstage/catalog-client';
@@ -104,6 +105,7 @@ const handlerContext = {
discovery,
logger: getVoidLogger(),
config: ConfigReader.fromConfigs([]),
+ tokenManager: ServerTokenManager.noop(),
};
const entityFactRetriever = entityMetadataFactRetriever;
diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.ts
index 26b1e4274b..caa19dbeaf 100644
--- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.ts
+++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.ts
@@ -44,11 +44,19 @@ export const entityMetadataFactRetriever: FactRetriever = {
description: 'The entity has tags in metadata',
},
},
- handler: async ({ discovery, entityFilter }: FactRetrieverContext) => {
+ handler: async ({
+ discovery,
+ entityFilter,
+ tokenManager,
+ }: FactRetrieverContext) => {
+ const { token } = await tokenManager.getToken();
const catalogClient = new CatalogClient({
discoveryApi: discovery,
});
- const entities = await catalogClient.getEntities({ filter: entityFilter });
+ const entities = await catalogClient.getEntities(
+ { filter: entityFilter },
+ { token },
+ );
return entities.items.map((entity: Entity) => {
return {
diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.test.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.test.ts
index 555f761ae8..7a77ef91c4 100644
--- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.test.ts
+++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.test.ts
@@ -19,6 +19,7 @@ import { RELATION_OWNED_BY } from '@backstage/catalog-model';
import {
PluginEndpointDiscovery,
getVoidLogger,
+ ServerTokenManager,
} from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';
import { GetEntitiesResponse } from '@backstage/catalog-client';
@@ -104,6 +105,7 @@ const handlerContext = {
discovery,
logger: getVoidLogger(),
config: ConfigReader.fromConfigs([]),
+ tokenManager: ServerTokenManager.noop(),
};
const entityFactRetriever = entityOwnershipFactRetriever;
diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.ts
index b9a91e67f7..c1e9b2710e 100644
--- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.ts
+++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.ts
@@ -42,11 +42,19 @@ export const entityOwnershipFactRetriever: FactRetriever = {
description: 'The spec.owner field is set and refers to a group',
},
},
- handler: async ({ discovery, entityFilter }: FactRetrieverContext) => {
+ handler: async ({
+ discovery,
+ entityFilter,
+ tokenManager,
+ }: FactRetrieverContext) => {
+ const { token } = await tokenManager.getToken();
const catalogClient = new CatalogClient({
discoveryApi: discovery,
});
- const entities = await catalogClient.getEntities({ filter: entityFilter });
+ const entities = await catalogClient.getEntities(
+ { filter: entityFilter },
+ { token },
+ );
return entities.items.map((entity: Entity) => {
return {
diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.test.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.test.ts
index be9397942d..0c70f6c9f1 100644
--- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.test.ts
+++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.test.ts
@@ -19,6 +19,7 @@ import { RELATION_OWNED_BY } from '@backstage/catalog-model';
import {
PluginEndpointDiscovery,
getVoidLogger,
+ ServerTokenManager,
} from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';
import { GetEntitiesResponse } from '@backstage/catalog-client';
@@ -104,6 +105,7 @@ const handlerContext = {
discovery,
logger: getVoidLogger(),
config: ConfigReader.fromConfigs([]),
+ tokenManager: ServerTokenManager.noop(),
};
const entityFactRetriever = techdocsFactRetriever;
diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.ts
index 2717f94475..6bc84f4aa9 100644
--- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.ts
+++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.ts
@@ -40,11 +40,19 @@ export const techdocsFactRetriever: FactRetriever = {
description: 'The entity has a title in metadata',
},
},
- handler: async ({ discovery, entityFilter }: FactRetrieverContext) => {
+ handler: async ({
+ discovery,
+ entityFilter,
+ tokenManager,
+ }: FactRetrieverContext) => {
+ const { token } = await tokenManager.getToken();
const catalogClient = new CatalogClient({
discoveryApi: discovery,
});
- const entities = await catalogClient.getEntities({ filter: entityFilter });
+ const entities = await catalogClient.getEntities(
+ { filter: entityFilter },
+ { token },
+ );
return entities.items.map((entity: Entity) => {
return {
diff --git a/plugins/tech-insights-backend/src/service/router.test.ts b/plugins/tech-insights-backend/src/service/router.test.ts
index df2d471516..8513973598 100644
--- a/plugins/tech-insights-backend/src/service/router.test.ts
+++ b/plugins/tech-insights-backend/src/service/router.test.ts
@@ -19,6 +19,7 @@ import {
DatabaseManager,
getVoidLogger,
PluginDatabaseManager,
+ ServerTokenManager,
} from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';
import request from 'supertest';
@@ -74,6 +75,7 @@ describe('Tech Insights router tests', () => {
getBaseUrl: (_: string) => Promise.resolve('http://mock.url'),
getExternalBaseUrl: (_: string) => Promise.resolve('http://mock.url'),
},
+ tokenManager: ServerTokenManager.noop(),
});
const router = await createRouter({
diff --git a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts
index 4f8f2ed928..e22bfbd253 100644
--- a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts
+++ b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts
@@ -21,6 +21,7 @@ import { Config } from '@backstage/config';
import {
PluginDatabaseManager,
PluginEndpointDiscovery,
+ TokenManager,
} from '@backstage/backend-common';
import {
FactChecker,
@@ -63,6 +64,7 @@ export interface TechInsightsOptions<
discovery: PluginEndpointDiscovery;
database: PluginDatabaseManager;
scheduler: PluginTaskScheduler;
+ tokenManager: TokenManager;
}
/**
@@ -104,6 +106,7 @@ export const buildTechInsightsContext = async <
database,
logger,
scheduler,
+ tokenManager,
} = options;
const factRetrieverRegistry = new FactRetrieverRegistry(factRetrievers);
@@ -121,6 +124,7 @@ export const buildTechInsightsContext = async <
config,
discovery,
logger,
+ tokenManager,
},
});
diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md
index 5f35343b9c..4f194c51eb 100644
--- a/plugins/tech-insights-node/CHANGELOG.md
+++ b/plugins/tech-insights-node/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-tech-insights-node
+## 0.3.0-next.1
+
+### Minor Changes
+
+- 58e2c46151: **BREAKING**: The `FactRetrieverContext` type now contains an additional
+ field: `tokenManager`.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.3-next.1
+
## 0.2.10-next.0
### Patch Changes
diff --git a/plugins/tech-insights-node/api-report.md b/plugins/tech-insights-node/api-report.md
index 7d9f2e00b7..bcccec65b5 100644
--- a/plugins/tech-insights-node/api-report.md
+++ b/plugins/tech-insights-node/api-report.md
@@ -10,6 +10,7 @@ import { Duration } from 'luxon';
import { DurationLike } from 'luxon';
import { Logger } from 'winston';
import { PluginEndpointDiscovery } from '@backstage/backend-common';
+import { TokenManager } from '@backstage/backend-common';
// @public
export type CheckValidationResponse = {
@@ -58,6 +59,7 @@ export type FactRetrieverContext = {
config: Config;
discovery: PluginEndpointDiscovery;
logger: Logger;
+ tokenManager: TokenManager;
entityFilter?:
| Record[]
| Record;
diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json
index a843351fd0..54e0634c20 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.2.10-next.0",
+ "version": "0.3.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -33,7 +33,7 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3-next.0",
+ "@backstage/backend-common": "^0.13.3-next.1",
"@backstage/config": "^1.0.0",
"@backstage/plugin-tech-insights-common": "^0.2.4",
"@types/luxon": "^2.0.5",
@@ -41,7 +41,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0"
+ "@backstage/cli": "^0.17.1-next.1"
},
"files": [
"dist"
diff --git a/plugins/tech-insights-node/src/facts.ts b/plugins/tech-insights-node/src/facts.ts
index a5df4bae85..ffd3549bd5 100644
--- a/plugins/tech-insights-node/src/facts.ts
+++ b/plugins/tech-insights-node/src/facts.ts
@@ -15,7 +15,10 @@
*/
import { DateTime, Duration, DurationLike } from 'luxon';
import { Config } from '@backstage/config';
-import { PluginEndpointDiscovery } from '@backstage/backend-common';
+import {
+ PluginEndpointDiscovery,
+ TokenManager,
+} from '@backstage/backend-common';
import { Logger } from 'winston';
/**
@@ -135,6 +138,7 @@ export type FactRetrieverContext = {
config: Config;
discovery: PluginEndpointDiscovery;
logger: Logger;
+ tokenManager: TokenManager;
entityFilter?:
| Record[]
| Record;
diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md
index 75e836f0dc..3f60530f37 100644
--- a/plugins/tech-insights/CHANGELOG.md
+++ b/plugins/tech-insights/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-tech-insights
+## 0.2.1-next.1
+
+### Patch Changes
+
+- aa8db01acb: Add new component `EntityTechInsightsScorecardCard`, which can be used in the overview of the `EntityPage` page or display multiple individual `EntityTechInsightsScorecardCard` in `EntityLayout.Route`.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.2.1-next.0
### Patch Changes
diff --git a/plugins/tech-insights/README.md b/plugins/tech-insights/README.md
index a305ef5dc7..6c13622e1f 100644
--- a/plugins/tech-insights/README.md
+++ b/plugins/tech-insights/README.md
@@ -38,10 +38,6 @@ const serviceEntityPage = (
title="Customized title for the scorecard"
description="Small description about scorecards"
/>
-
...
@@ -50,8 +46,45 @@ const serviceEntityPage = (
It is not obligatory to pass title and description props to `EntityTechInsightsScorecardContent`. If those are left out, default values from `defaultCheckResultRenderers` in `CheckResultRenderer` will be taken, hence `Boolean scorecard` and `This card represents an overview of default boolean Backstage checks`.
+If you like to display multiple cards in a `EntityLayout.Route` use `EntityTechInsightsScorecardCard`.
+
You can pass an array `checksId` as a prop with the [Fact Retrievers ids](../tech-insights-backend#creating-fact-retrievers) to limit which checks you want to show in this card, If you don't pass, the default value is show all checks.
+```tsx
+
+```
+
+If you want to show checks in the overview of an entity use `EntityTechInsightsScorecardCard`.
+
+```tsx
+// packages/app/src/components/catalog/EntityPage.tsx
+
+import { EntityTechInsightsScorecardCard } from '@backstage/plugin-tech-insights';
+
+const overviewContent = (
+
+ {entityWarningContent}
+
+
+
+
+
+
+ ...
+
+
+
+
+);
+```
+
## Boolean Scorecard Example
If you follow the [Backend Example](https://github.com/backstage/backstage/tree/master/plugins/tech-insights-backend#backend-example), once the needed facts have been generated the boolean scorecard will look like this:
diff --git a/plugins/tech-insights/api-report.md b/plugins/tech-insights/api-report.md
index 9574efca28..3e099493b6 100644
--- a/plugins/tech-insights/api-report.md
+++ b/plugins/tech-insights/api-report.md
@@ -30,6 +30,17 @@ export type CheckResultRenderer = {
component: React_2.ReactElement;
};
+// @public (undocumented)
+export const EntityTechInsightsScorecardCard: ({
+ title,
+ description,
+ checksId,
+}: {
+ title?: string | undefined;
+ description?: string | undefined;
+ checksId?: string[] | undefined;
+}) => JSX.Element;
+
// @public (undocumented)
export const EntityTechInsightsScorecardContent: ({
title,
diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json
index 21d80a7890..08796b52e1 100644
--- a/plugins/tech-insights/package.json
+++ b/plugins/tech-insights/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-tech-insights",
- "version": "0.2.1-next.0",
+ "version": "0.2.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,10 +29,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/plugin-tech-insights-common": "^0.2.4",
"@backstage/theme": "^0.2.15",
"@backstage/types": "^1.0.0",
@@ -47,10 +47,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/tech-insights/src/components/ScorecardsOverview/ScorecardsOverview.tsx b/plugins/tech-insights/src/components/ScorecardsCard/ScorecardsCard.tsx
similarity index 93%
rename from plugins/tech-insights/src/components/ScorecardsOverview/ScorecardsOverview.tsx
rename to plugins/tech-insights/src/components/ScorecardsCard/ScorecardsCard.tsx
index 53cf826e78..f6bc4b0cb5 100644
--- a/plugins/tech-insights/src/components/ScorecardsOverview/ScorecardsOverview.tsx
+++ b/plugins/tech-insights/src/components/ScorecardsCard/ScorecardsCard.tsx
@@ -19,11 +19,11 @@ import { useParams } from 'react-router-dom';
import useAsync from 'react-use/lib/useAsync';
import { Progress } from '@backstage/core-components';
import { useApi } from '@backstage/core-plugin-api';
-import { ChecksOverview } from './ChecksOverview';
+import { ScorecardInfo } from '../ScorecardsInfo';
import Alert from '@material-ui/lab/Alert';
import { techInsightsApiRef } from '../../api/TechInsightsApi';
-export const ScorecardsOverview = ({
+export const ScorecardsCard = ({
title,
description,
checksId,
@@ -45,7 +45,7 @@ export const ScorecardsOverview = ({
}
return (
- ({
+ contentScorecards: {
+ paddingLeft: 0,
+ paddingRight: 0,
+ },
+}));
+
+export const ScorecardsContent = ({
+ title,
+ description,
+ checksId,
+}: {
+ title?: string;
+ description?: string;
+ checksId?: string[];
+}) => {
+ const classes = useStyles();
+ const api = useApi(techInsightsApiRef);
+ const { namespace, kind, name } = useParams();
+ const { value, loading, error } = useAsync(
+ async () => await api.runChecks({ namespace, kind, name }, checksId),
+ );
+
+ if (loading) {
+ return ;
+ } else if (error) {
+ return {error.message} ;
+ }
+
+ return (
+
+
+
+
+
+ );
+};
diff --git a/plugins/tech-insights/src/components/ScorecardsContent/index.ts b/plugins/tech-insights/src/components/ScorecardsContent/index.ts
new file mode 100644
index 0000000000..fcdfb0b694
--- /dev/null
+++ b/plugins/tech-insights/src/components/ScorecardsContent/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2021 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { ScorecardsContent } from './ScorecardContent';
diff --git a/plugins/tech-insights/src/components/ScorecardsOverview/ChecksOverview.tsx b/plugins/tech-insights/src/components/ScorecardsInfo/ScorecardInfo.tsx
similarity index 64%
rename from plugins/tech-insights/src/components/ScorecardsOverview/ChecksOverview.tsx
rename to plugins/tech-insights/src/components/ScorecardsInfo/ScorecardInfo.tsx
index d153c690eb..2c5abb3596 100644
--- a/plugins/tech-insights/src/components/ScorecardsOverview/ChecksOverview.tsx
+++ b/plugins/tech-insights/src/components/ScorecardsInfo/ScorecardInfo.tsx
@@ -17,17 +17,13 @@
import React from 'react';
import { makeStyles, Grid, Typography } from '@material-ui/core';
import { useApi } from '@backstage/core-plugin-api';
-import { Content, Page, InfoCard } from '@backstage/core-components';
+import { InfoCard } from '@backstage/core-components';
import { CheckResult } from '@backstage/plugin-tech-insights-common';
import { techInsightsApiRef } from '../../api/TechInsightsApi';
import { BackstageTheme } from '@backstage/theme';
import { Alert } from '@material-ui/lab';
const useStyles = makeStyles((theme: BackstageTheme) => ({
- contentScorecards: {
- paddingLeft: 0,
- paddingRight: 0,
- },
subheader: {
fontWeight: 'bold',
paddingLeft: theme.spacing(0.5),
@@ -40,12 +36,37 @@ type Checks = {
description?: string;
};
-export const ChecksOverview = ({ checks, title, description }: Checks) => {
+const infoCard = (
+ title: Checks['title'],
+ description: Checks['description'],
+ className: string,
+ element: JSX.Element,
+) => (
+
+
+
+ {description}
+
+
+ {element}
+
+
+
+);
+
+export const ScorecardInfo = ({ checks, title, description }: Checks) => {
const classes = useStyles();
const api = useApi(techInsightsApiRef);
+
if (!checks.length) {
- return No checks have any data yet. ;
+ return infoCard(
+ title,
+ description,
+ classes.subheader,
+ No checks have any data yet. ,
+ );
}
+
const checkRenderType = api.getScorecardsDefinition(
checks[0].check.type,
checks,
@@ -54,21 +75,11 @@ export const ChecksOverview = ({ checks, title, description }: Checks) => {
);
if (checkRenderType) {
- return (
-
-
-
-
-
- {checkRenderType.description}
-
-
- {checkRenderType.component}
-
-
-
-
-
+ return infoCard(
+ checkRenderType.title,
+ checkRenderType.description,
+ classes.subheader,
+ checkRenderType.component,
);
}
diff --git a/plugins/tech-insights/src/components/ScorecardsInfo/index.ts b/plugins/tech-insights/src/components/ScorecardsInfo/index.ts
new file mode 100644
index 0000000000..21928465e0
--- /dev/null
+++ b/plugins/tech-insights/src/components/ScorecardsInfo/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2021 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { ScorecardInfo } from './ScorecardInfo';
diff --git a/plugins/tech-insights/src/index.ts b/plugins/tech-insights/src/index.ts
index b59ac453ce..bc7c2ce26c 100644
--- a/plugins/tech-insights/src/index.ts
+++ b/plugins/tech-insights/src/index.ts
@@ -16,6 +16,7 @@
export {
techInsightsPlugin,
EntityTechInsightsScorecardContent,
+ EntityTechInsightsScorecardCard,
} from './plugin';
export { techInsightsApiRef } from './api/TechInsightsApi';
diff --git a/plugins/tech-insights/src/plugin.ts b/plugins/tech-insights/src/plugin.ts
index 0c2da63670..961519cd97 100644
--- a/plugins/tech-insights/src/plugin.ts
+++ b/plugins/tech-insights/src/plugin.ts
@@ -49,7 +49,19 @@ export const EntityTechInsightsScorecardContent = techInsightsPlugin.provide(
createRoutableExtension({
name: 'EntityTechInsightsScorecardContent',
component: () =>
- import('./components/ScorecardsOverview').then(m => m.ScorecardsOverview),
+ import('./components/ScorecardsContent').then(m => m.ScorecardsContent),
+ mountPoint: rootRouteRef,
+ }),
+);
+
+/**
+ * @public
+ */
+export const EntityTechInsightsScorecardCard = techInsightsPlugin.provide(
+ createRoutableExtension({
+ name: 'EntityTechInsightsScorecardCard',
+ component: () =>
+ import('./components/ScorecardsCard').then(m => m.ScorecardsCard),
mountPoint: rootRouteRef,
}),
);
diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md
index 5241ae77bc..445a8fdb0f 100644
--- a/plugins/tech-radar/CHANGELOG.md
+++ b/plugins/tech-radar/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-tech-radar
+## 0.5.12-next.0
+
+### Patch Changes
+
+- 3588a77994: Rename `use` to `adopt`, to reflect Zalando Tech Radar regarding quadrants and add link to Zalando explanation.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.5.11
### Patch Changes
diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json
index 560484e3c0..27be1b33c4 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.11",
+ "version": "0.5.12-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,8 +34,8 @@
"start": "backstage-cli package start"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -49,10 +49,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/tech-radar/src/components/RadarPage.tsx b/plugins/tech-radar/src/components/RadarPage.tsx
index 89c5ad5e72..17e481fcc4 100644
--- a/plugins/tech-radar/src/components/RadarPage.tsx
+++ b/plugins/tech-radar/src/components/RadarPage.tsx
@@ -20,6 +20,7 @@ import {
Header,
Page,
SupportButton,
+ Link,
} from '@backstage/core-components';
import { Grid, Input, makeStyles } from '@material-ui/core';
import React from 'react';
@@ -74,9 +75,16 @@ export function RadarPage(props: TechRadarPageProps) {
onChange={e => setSearchText(e.target.value)}
/>
- This is used for visualizing the official guidelines of different
- areas of software development such as languages, frameworks,
- infrastructure and processes.
+
+ This is used for visualizing the official guidelines of different
+ areas of software development such as languages, frameworks,
+ infrastructure and processes. You can find an explanation for the
+ radar at{' '}
+
+ Zalando Tech Radar
+
+ .
+
diff --git a/plugins/tech-radar/src/sample.ts b/plugins/tech-radar/src/sample.ts
index fee5f8cdbf..174bd7750f 100644
--- a/plugins/tech-radar/src/sample.ts
+++ b/plugins/tech-radar/src/sample.ts
@@ -23,7 +23,7 @@ import {
} from './api';
const rings = new Array();
-rings.push({ id: 'use', name: 'USE', color: '#93c47d' });
+rings.push({ id: 'adopt', name: 'ADOPT', color: '#93c47d' });
rings.push({ id: 'trial', name: 'TRIAL', color: '#93d2c2' });
rings.push({ id: 'assess', name: 'ASSESS', color: '#fbdb84' });
rings.push({ id: 'hold', name: 'HOLD', color: '#efafa9' });
@@ -39,7 +39,7 @@ entries.push({
timeline: [
{
moved: 0,
- ringId: 'use',
+ ringId: 'adopt',
date: new Date('2020-08-06'),
description:
'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua',
@@ -57,7 +57,7 @@ entries.push({
timeline: [
{
moved: -1,
- ringId: 'use',
+ ringId: 'adopt',
date: new Date('2020-08-06'),
description:
'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat',
@@ -75,7 +75,7 @@ entries.push({
timeline: [
{
moved: 1,
- ringId: 'use',
+ ringId: 'adopt',
date: new Date('2020-08-06'),
description:
'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur',
@@ -91,7 +91,7 @@ entries.push({
timeline: [
{
moved: 0,
- ringId: 'use',
+ ringId: 'adopt',
date: new Date('2020-08-06'),
},
],
@@ -105,7 +105,7 @@ entries.push({
timeline: [
{
moved: 0,
- ringId: 'use',
+ ringId: 'adopt',
date: new Date('2020-08-06'),
},
],
@@ -133,7 +133,7 @@ entries.push({
timeline: [
{
moved: 0,
- ringId: 'use',
+ ringId: 'adopt',
date: new Date('2020-08-06'),
},
],
@@ -159,7 +159,7 @@ entries.push({
entries.push({
timeline: [
{
- ringId: 'use',
+ ringId: 'adopt',
date: new Date('2020-08-06'),
description: 'long description',
},
diff --git a/plugins/techdocs-addons-test-utils/.eslintrc.js b/plugins/techdocs-addons-test-utils/.eslintrc.js
new file mode 100644
index 0000000000..e2a53a6ad2
--- /dev/null
+++ b/plugins/techdocs-addons-test-utils/.eslintrc.js
@@ -0,0 +1 @@
+module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md
new file mode 100644
index 0000000000..57ca350fdd
--- /dev/null
+++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md
@@ -0,0 +1,20 @@
+# @backstage/plugin-techdocs-addons-test-utils
+
+## 0.1.0-next.0
+
+### Minor Changes
+
+- 52fddad92d: Introducing a package with utilities to help test TechDocs Addons.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/test-utils@1.1.0-next.1
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog@1.2.0-next.1
+ - @backstage/plugin-search-react@0.2.0-next.1
+ - @backstage/plugin-techdocs-react@0.1.1-next.1
+ - @backstage/plugin-techdocs@1.1.1-next.1
+ - @backstage/integration-react@1.1.0-next.1
+ - @backstage/core-app-api@1.0.2-next.0
diff --git a/plugins/techdocs-addons-test-utils/README.md b/plugins/techdocs-addons-test-utils/README.md
new file mode 100644
index 0000000000..a6ac2e3182
--- /dev/null
+++ b/plugins/techdocs-addons-test-utils/README.md
@@ -0,0 +1,3 @@
+# techdocs-addons-test-utils
+
+A package containing utilities for testing TechDocs Addons.
diff --git a/plugins/techdocs-addons-test-utils/api-report.md b/plugins/techdocs-addons-test-utils/api-report.md
new file mode 100644
index 0000000000..a32d2d4854
--- /dev/null
+++ b/plugins/techdocs-addons-test-utils/api-report.md
@@ -0,0 +1,39 @@
+## API Report File for "@backstage/plugin-techdocs-addons-test-utils"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+import { ApiRef } from '@backstage/core-plugin-api';
+import { default as React_2 } from 'react';
+import { ReactElement } from 'react';
+import { screen as screen_2 } from 'testing-library__dom';
+import { TechDocsEntityMetadata } from '@backstage/plugin-techdocs-react';
+import { TechDocsMetadata } from '@backstage/plugin-techdocs-react';
+
+// @public (undocumented)
+export class TechDocsAddonTester {
+ // (undocumented)
+ atPath(path: string): this;
+ // (undocumented)
+ build(): React_2.ReactElement<
+ any,
+ string | React_2.JSXElementConstructor
+ >;
+ // (undocumented)
+ static buildAddonsInTechDocs(addons: ReactElement[]): TechDocsAddonTester;
+ // (undocumented)
+ renderWithEffects(): Promise<
+ typeof screen_2 & {
+ shadowRoot: ShadowRoot | null;
+ }
+ >;
+ // (undocumented)
+ withApis(apis: TechdocsAddonTesterApis): this;
+ // (undocumented)
+ withDom(dom: ReactElement): this;
+ // (undocumented)
+ withEntity(entity: Partial): this;
+ // (undocumented)
+ withMetadata(metadata: Partial): this;
+}
+```
diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json
new file mode 100644
index 0000000000..ef4e01d304
--- /dev/null
+++ b/plugins/techdocs-addons-test-utils/package.json
@@ -0,0 +1,72 @@
+{
+ "name": "@backstage/plugin-techdocs-addons-test-utils",
+ "version": "0.1.0-next.0",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "license": "Apache-2.0",
+ "publishConfig": {
+ "access": "public",
+ "main": "dist/index.esm.js",
+ "types": "dist/index.d.ts"
+ },
+ "backstage": {
+ "role": "web-library"
+ },
+ "homepage": "https://backstage.io",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/backstage/backstage",
+ "directory": "plugins/techdocs-addons-test-utils"
+ },
+ "keywords": [
+ "backstage",
+ "techdocs"
+ ],
+ "scripts": {
+ "start": "backstage-cli package start",
+ "build": "backstage-cli package build",
+ "lint": "backstage-cli package lint",
+ "test": "backstage-cli package test",
+ "clean": "backstage-cli package clean",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack"
+ },
+ "dependencies": {
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
+ "@backstage/integration-react": "^1.1.0-next.1",
+ "@backstage/plugin-catalog": "^1.2.0-next.1",
+ "@backstage/plugin-search-react": "^0.2.0-next.1",
+ "@backstage/plugin-techdocs": "^1.1.1-next.1",
+ "@backstage/plugin-techdocs-react": "^0.1.1-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
+ "@backstage/theme": "^0.2.15",
+ "@material-ui/core": "^4.9.13",
+ "@material-ui/icons": "^4.9.1",
+ "@material-ui/lab": "4.0.0-alpha.57",
+ "react-use": "^17.2.4",
+ "react-router-dom": "6.0.0-beta.0",
+ "@testing-library/react": "^12.1.3",
+ "testing-library__dom": "^7.29.4-beta.1"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.13.1 || ^17.0.0",
+ "react": "^16.13.1 || ^17.0.0",
+ "react-dom": "^16.13.1 || ^17.0.0"
+ },
+ "devDependencies": {
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@testing-library/jest-dom": "^5.10.1",
+ "@testing-library/react": "^12.1.3",
+ "@testing-library/user-event": "^14.0.0",
+ "@types/jest": "^26.0.7",
+ "@types/node": "^16.11.26",
+ "msw": "^0.35.0",
+ "cross-fetch": "^3.1.5"
+ },
+ "files": [
+ "dist"
+ ]
+}
diff --git a/plugins/techdocs-addons-test-utils/src/index.ts b/plugins/techdocs-addons-test-utils/src/index.ts
new file mode 100644
index 0000000000..2e4348fe2a
--- /dev/null
+++ b/plugins/techdocs-addons-test-utils/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.
+ */
+
+/**
+ * A package containing test utilities for TechDocs Addons.
+ *
+ * @packageDocumentation
+ */
+
+export * from './test-utils';
diff --git a/plugins/techdocs-addons-test-utils/src/setupTests.ts b/plugins/techdocs-addons-test-utils/src/setupTests.ts
new file mode 100644
index 0000000000..9bb3e72355
--- /dev/null
+++ b/plugins/techdocs-addons-test-utils/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.
+ */
+import '@testing-library/jest-dom';
+import 'cross-fetch/polyfill';
diff --git a/plugins/techdocs-addons-test-utils/src/test-utils.tsx b/plugins/techdocs-addons-test-utils/src/test-utils.tsx
new file mode 100644
index 0000000000..7894b96154
--- /dev/null
+++ b/plugins/techdocs-addons-test-utils/src/test-utils.tsx
@@ -0,0 +1,239 @@
+/*
+ * 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, { ReactElement, Fragment } from 'react';
+
+// Shadow DOM support for the simple and complete DOM testing utilities
+// https://github.com/testing-library/dom-testing-library/issues/742#issuecomment-674987855
+import { screen } from 'testing-library__dom';
+import { renderToStaticMarkup } from 'react-dom/server';
+import { Route } from 'react-router-dom';
+import { act, render } from '@testing-library/react';
+
+import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils';
+import { FlatRoutes } from '@backstage/core-app-api';
+import { ApiRef } from '@backstage/core-plugin-api';
+
+import {
+ TechDocsAddons,
+ techdocsApiRef,
+ TechDocsEntityMetadata,
+ TechDocsMetadata,
+ techdocsStorageApiRef,
+} from '@backstage/plugin-techdocs-react';
+import { TechDocsReaderPage, techdocsPlugin } from '@backstage/plugin-techdocs';
+import { catalogPlugin } from '@backstage/plugin-catalog';
+import { searchApiRef } from '@backstage/plugin-search-react';
+import { scmIntegrationsApiRef } from '@backstage/integration-react';
+
+const techdocsApi = {
+ getTechDocsMetadata: jest.fn(),
+ getEntityMetadata: jest.fn(),
+};
+
+const techdocsStorageApi = {
+ getApiOrigin: jest.fn(),
+ getEntityDocs: jest.fn(),
+ syncEntityDocs: jest.fn(),
+};
+
+const searchApi = {
+ query: jest.fn().mockResolvedValue({ results: [] }),
+};
+
+const scmIntegrationsApi = {
+ fromConfig: jest.fn().mockReturnValue({}),
+};
+
+/** @ignore */
+type TechDocsAddonTesterTestApiPair = TApi extends infer TImpl
+ ? readonly [ApiRef, Partial]
+ : never;
+
+/** @ignore */
+type TechdocsAddonTesterApis = TechDocsAddonTesterTestApiPair[];
+
+type TechDocsAddonTesterOptions = {
+ dom: ReactElement;
+ entity: Partial;
+ metadata: Partial;
+ componentId: string;
+ apis: TechdocsAddonTesterApis;
+ path: string;
+};
+
+const defaultOptions: TechDocsAddonTesterOptions = {
+ dom: <>>,
+ entity: {},
+ metadata: {},
+ componentId: 'docs',
+ apis: [],
+ path: '',
+};
+
+const defaultMetadata = {
+ site_name: 'Tech Docs',
+ site_description: 'Tech Docs',
+};
+
+const defaultEntity = {
+ kind: 'Component',
+ metadata: { namespace: 'default', name: 'docs' },
+};
+
+const defaultDom = (
+
+
+
+
+
+
+);
+
+/**
+ * @public
+ */
+
+export class TechDocsAddonTester {
+ private options: TechDocsAddonTesterOptions = defaultOptions;
+ private addons: ReactElement[];
+
+ static buildAddonsInTechDocs(addons: ReactElement[]) {
+ return new TechDocsAddonTester(addons);
+ }
+
+ private constructor(addons: ReactElement[]) {
+ this.addons = addons;
+ }
+
+ withApis(apis: TechdocsAddonTesterApis) {
+ const refs = apis.map(([ref]) => ref);
+ this.options.apis = this.options.apis
+ .filter(([ref]) => !refs.includes(ref))
+ .concat(apis);
+ return this;
+ }
+
+ withDom(dom: ReactElement) {
+ this.options.dom = dom;
+ return this;
+ }
+
+ withMetadata(metadata: Partial) {
+ this.options.metadata = metadata;
+ return this;
+ }
+
+ withEntity(entity: Partial) {
+ this.options.entity = entity;
+ return this;
+ }
+
+ atPath(path: string) {
+ this.options.path = path;
+ return this;
+ }
+
+ build() {
+ const apis: TechdocsAddonTesterApis = [
+ [techdocsApiRef, techdocsApi],
+ [techdocsStorageApiRef, techdocsStorageApi],
+ [searchApiRef, searchApi],
+ [scmIntegrationsApiRef, scmIntegrationsApi],
+ ...this.options.apis,
+ ];
+
+ const entityName = {
+ namespace:
+ this.options.entity?.metadata?.namespace ||
+ defaultEntity.metadata.namespace,
+ kind: this.options.entity?.kind || defaultEntity.kind,
+ name: this.options.entity?.metadata?.name || defaultEntity.metadata.name,
+ };
+
+ techdocsApi.getTechDocsMetadata.mockReturnValue(
+ this.options.metadata || { ...defaultMetadata },
+ );
+ techdocsApi.getEntityMetadata.mockResolvedValue(
+ this.options.entity || { ...defaultEntity },
+ );
+
+ techdocsStorageApi.syncEntityDocs.mockResolvedValue('cached');
+ techdocsStorageApi.getApiOrigin.mockResolvedValue(
+ 'https://backstage.example.com/api/techdocs',
+ );
+
+ techdocsStorageApi.getEntityDocs.mockResolvedValue(
+ renderToStaticMarkup(this.options.dom || defaultDom),
+ );
+
+ const TechDocsAddonsPage = () => {
+ return (
+
+
+ }
+ >
+
+ {this.addons.map((addon, index) => (
+ {addon}
+ ))}
+
+
+
+
+ );
+ };
+
+ return wrapInTestApp( , {
+ routeEntries: [
+ `/docs/${entityName.namespace}/${entityName.kind}/${entityName.name}/${this.options.path}`,
+ ],
+ mountedRoutes: {
+ '/docs': techdocsPlugin.routes.root,
+ '/docs/:namespace/:kind/:name/*': techdocsPlugin.routes.docRoot,
+ '/catalog/:namespace/:kind/:name': catalogPlugin.routes.catalogEntity,
+ },
+ });
+ }
+
+ // Components using useEffect to perform an asynchronous action (such as fetch) must be rendered within an async
+ // act call to properly get the final state, even with mocked responses. This utility method makes the signature a bit
+ // cleaner, since act doesn't return the result of the evaluated function.
+ // https://github.com/testing-library/react-testing-library/issues/281
+ // https://github.com/facebook/react/pull/14853
+ async renderWithEffects(): Promise<
+ typeof screen & { shadowRoot: ShadowRoot | null }
+ > {
+ await act(async () => {
+ render(this.build());
+ });
+
+ const shadowHost = screen.getByTestId('techdocs-native-shadowroot');
+
+ return {
+ ...screen,
+ shadowRoot: shadowHost?.shadowRoot || null,
+ };
+ }
+}
+
+export default TechDocsAddonTester.buildAddonsInTechDocs;
diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md
index f95ed10409..30c428220c 100644
--- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md
+++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-techdocs-module-addons-contrib
+## 0.1.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-techdocs-react@0.1.1-next.1
+ - @backstage/integration-react@1.1.0-next.1
+
## 0.1.0-next.0
### Minor Changes
diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json
index 531e68ad7a..79224ef5fb 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": "0.1.0-next.0",
+ "version": "0.1.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,11 +34,11 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/integration": "^1.2.0-next.0",
- "@backstage/integration-react": "^1.1.0-next.0",
- "@backstage/plugin-techdocs-react": "^0.1.1-next.0",
+ "@backstage/integration-react": "^1.1.0-next.1",
+ "@backstage/plugin-techdocs-react": "^0.1.1-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.9.13",
"@material-ui/icons": "^4.9.1",
@@ -50,10 +50,11 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/plugin-techdocs-addons-test-utils": "^0.1.0-next.0",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx b/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx
index 0a1a64218a..bb2de22350 100644
--- a/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx
+++ b/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx
@@ -66,7 +66,7 @@ const getUrl = (repository: Repository, template: ReportIssueTemplate) => {
if (type === 'github') {
return `${url}/issues/new?title=${encodedTitle}&body=${encodedBody}`;
}
- return `${url}/issues/new?[title]=${encodedTitle}&[body]=${encodedBody}`;
+ return `${url}/issues/new?issue[title]=${encodedTitle}&issue[description]=${encodedBody}`;
};
export const IssueLink = ({ template, repository }: IssueLinkProps) => {
diff --git a/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx
new file mode 100644
index 0000000000..68bde5c762
--- /dev/null
+++ b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx
@@ -0,0 +1,238 @@
+/*
+ * 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 { TechDocsAddonTester } from '@backstage/plugin-techdocs-addons-test-utils';
+
+import React from 'react';
+import { fireEvent, waitFor } from '@testing-library/react';
+
+import { scmIntegrationsApiRef } from '@backstage/integration-react';
+import { ReportIssue } from '..';
+
+const byUrl = jest.fn();
+
+const fireSelectionChangeEvent = (window: Window) => {
+ const selectionChangeEvent = window.document.createEvent('Event');
+ selectionChangeEvent.initEvent('selectionchange', true, true);
+ window.document.addEventListener('selectionchange', () => {}, false);
+ fireEvent(window.document, selectionChangeEvent);
+};
+
+describe('ReportIssue', () => {
+ const selection = {
+ type: 'Range',
+ rangeCount: 1,
+ isCollapsed: true,
+ getRangeAt: () => ({
+ startContainer: 'this is a sentence',
+ endContainer: 'this is a sentence',
+ startOffset: 1,
+ endOffset: 3,
+ getBoundingClientRect: () => ({
+ right: 100,
+ top: 100,
+ width: 100,
+ height: 100,
+ }),
+ }),
+ toString: () => 'his ',
+ containsNode: () => true,
+ } as unknown as Selection;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('renders github link without exploding', async () => {
+ byUrl.mockReturnValue({ type: 'github' });
+ const { shadowRoot, getByText } =
+ await TechDocsAddonTester.buildAddonsInTechDocs([
+ ,
+ ])
+ .withDom(
+
+
+
+
+
+ ,
+ )
+ .withApis([[scmIntegrationsApiRef, { byUrl }]])
+ .renderWithEffects();
+
+ (shadowRoot as ShadowRoot & Pick).getSelection =
+ () => selection;
+
+ await waitFor(() => {
+ expect(getByText('Edit page')).toBeInTheDocument();
+ });
+
+ fireSelectionChangeEvent(window);
+
+ await waitFor(() => {
+ const link = getByText('Open new Github issue');
+ expect(link).toHaveAttribute(
+ 'href',
+ 'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20his%20&body=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20his%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fdocs%2FREADME.md%3E',
+ );
+ });
+ });
+
+ it('renders gitlab link without exploding', async () => {
+ byUrl.mockReturnValue({ type: 'gitlab' });
+ const { shadowRoot, getByText } =
+ await TechDocsAddonTester.buildAddonsInTechDocs([
+ ,
+ ])
+ .withDom(
+
+
+
+
+
+ ,
+ )
+ .withApis([[scmIntegrationsApiRef, { byUrl }]])
+ .renderWithEffects();
+
+ (shadowRoot as ShadowRoot & Pick).getSelection =
+ () => selection;
+
+ await waitFor(() => {
+ expect(getByText('Edit page')).toBeInTheDocument();
+ });
+
+ fireSelectionChangeEvent(window);
+
+ await waitFor(() => {
+ const link = getByText('Open new Gitlab issue');
+ expect(link).toHaveAttribute(
+ 'href',
+ 'https://gitlab.com/backstage/backstage/issues/new?issue[title]=Documentation%20feedback%3A%20his%20&issue[description]=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20his%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgitlab.com%2Fbackstage%2Fbackstage%2F-%2Fblob%2Fmaster%2Fdocs%2FREADME.md%3E',
+ );
+ });
+ });
+
+ it('renders using a custom template builder', async () => {
+ byUrl.mockReturnValue({ type: 'gitlab' });
+
+ const templateBuilder = (options: { selection: Selection }) => ({
+ title: 'Custom',
+ body: options.selection.toString().trim(),
+ });
+
+ const { shadowRoot, getByText } =
+ await TechDocsAddonTester.buildAddonsInTechDocs([
+ ,
+ ])
+ .withDom(
+
+
+
+
+
+ ,
+ )
+ .withApis([[scmIntegrationsApiRef, { byUrl }]])
+ .renderWithEffects();
+
+ (shadowRoot as ShadowRoot & Pick).getSelection =
+ () => selection;
+
+ await waitFor(() => {
+ expect(getByText('Edit page')).toBeInTheDocument();
+ });
+
+ fireSelectionChangeEvent(window);
+
+ await waitFor(() => {
+ const link = getByText('Open new Gitlab issue');
+ expect(link).toHaveAttribute(
+ 'href',
+ 'https://gitlab.com/backstage/backstage/issues/new?issue[title]=Custom&issue[description]=his',
+ );
+ });
+ });
+});
diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md
index 98ab640e5f..ae06a45ff3 100644
--- a/plugins/techdocs-react/CHANGELOG.md
+++ b/plugins/techdocs-react/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-techdocs-react
+## 0.1.1-next.1
+
+### Patch Changes
+
+- 52fddad92d: The `TechDocsStorageApi` and its associated ref are now exported by `@backstage/plugin-techdocs-react`. The API interface, ref, and types are now deprecated in `@backstage/plugin-techdocs` and will be removed in a future release.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.1.1-next.0
### Patch Changes
diff --git a/plugins/techdocs-react/api-report.md b/plugins/techdocs-react/api-report.md
index 264d59146e..fa38feef14 100644
--- a/plugins/techdocs-react/api-report.md
+++ b/plugins/techdocs-react/api-report.md
@@ -22,6 +22,9 @@ export function createTechDocsAddonExtension(
// @alpha (undocumented)
export const defaultTechDocsReaderPageValue: TechDocsReaderPageValue;
+// @public
+export type SyncResult = 'cached' | 'updated';
+
// @alpha
export const TECHDOCS_ADDONS_WRAPPER_KEY = 'techdocs.addons.wrapper.v1';
@@ -103,6 +106,32 @@ export type TechDocsReaderPageValue = {
onReady?: () => void;
};
+// @public
+export interface TechDocsStorageApi {
+ // (undocumented)
+ getApiOrigin(): Promise;
+ // (undocumented)
+ getBaseUrl(
+ oldBaseUrl: string,
+ entityId: CompoundEntityRef,
+ path: string,
+ ): Promise;
+ // (undocumented)
+ getBuilder(): Promise;
+ // (undocumented)
+ getEntityDocs(entityId: CompoundEntityRef, path: string): Promise;
+ // (undocumented)
+ getStorageUrl(): Promise;
+ // (undocumented)
+ syncEntityDocs(
+ entityId: CompoundEntityRef,
+ logHandler?: (line: string) => void,
+ ): Promise;
+}
+
+// @public
+export const techdocsStorageApiRef: ApiRef;
+
// @alpha
export const useShadowRoot: () => ShadowRoot | undefined;
diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json
index 490e7b2ce1..2d967e1062 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": "0.1.1-next.0",
+ "version": "0.1.1-next.1",
"private": false,
"publishConfig": {
"access": "public",
@@ -36,8 +36,8 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/version-bridge": "^1.0.1",
"@material-ui/core": "^4.12.2",
"@material-ui/lab": "4.0.0-alpha.57",
@@ -55,7 +55,7 @@
"devDependencies": {
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15"
},
"files": [
diff --git a/plugins/techdocs-react/src/api.ts b/plugins/techdocs-react/src/api.ts
index 0d3c0b931a..6d726fae01 100644
--- a/plugins/techdocs-react/src/api.ts
+++ b/plugins/techdocs-react/src/api.ts
@@ -39,3 +39,40 @@ export interface TechDocsApi {
export const techdocsApiRef = createApiRef({
id: 'plugin.techdocs.service',
});
+
+/**
+ * The outcome of a docs sync operation.
+ *
+ * @public
+ */
+export type SyncResult = 'cached' | 'updated';
+
+/**
+ * API which talks to TechDocs storage to fetch files to render.
+ *
+ * @public
+ */
+export interface TechDocsStorageApi {
+ getApiOrigin(): Promise;
+ getStorageUrl(): Promise;
+ getBuilder(): Promise;
+ getEntityDocs(entityId: CompoundEntityRef, path: string): Promise;
+ syncEntityDocs(
+ entityId: CompoundEntityRef,
+ logHandler?: (line: string) => void,
+ ): Promise;
+ getBaseUrl(
+ oldBaseUrl: string,
+ entityId: CompoundEntityRef,
+ path: string,
+ ): Promise;
+}
+
+/**
+ * Utility API reference for the {@link TechDocsStorageApi}.
+ *
+ * @public
+ */
+export const techdocsStorageApiRef = createApiRef({
+ id: 'plugin.techdocs.storageservice',
+});
diff --git a/plugins/techdocs-react/src/index.ts b/plugins/techdocs-react/src/index.ts
index 8b46c9d717..c1cc3a1791 100644
--- a/plugins/techdocs-react/src/index.ts
+++ b/plugins/techdocs-react/src/index.ts
@@ -26,8 +26,8 @@ export {
TechDocsAddons,
TECHDOCS_ADDONS_WRAPPER_KEY,
} from './addons';
-export { techdocsApiRef } from './api';
-export type { TechDocsApi } from './api';
+export { techdocsApiRef, techdocsStorageApiRef } from './api';
+export type { SyncResult, TechDocsApi, TechDocsStorageApi } from './api';
export {
defaultTechDocsReaderPageValue,
TechDocsReaderPageProvider,
diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md
index fb63fcc99d..8717877fb7 100644
--- a/plugins/techdocs/CHANGELOG.md
+++ b/plugins/techdocs/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-techdocs
+## 1.1.1-next.1
+
+### Patch Changes
+
+- 52fddad92d: The `TechDocsStorageApi` and its associated ref are now exported by `@backstage/plugin-techdocs-react`. The API interface, ref, and types are now deprecated in `@backstage/plugin-techdocs` and will be removed in a future release.
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+ - @backstage/plugin-search-react@0.2.0-next.1
+ - @backstage/plugin-techdocs-react@0.1.1-next.1
+ - @backstage/integration-react@1.1.0-next.1
+
## 1.1.1-next.0
### Patch Changes
diff --git a/plugins/techdocs/api-report.md b/plugins/techdocs/api-report.md
index a7c287a4f7..131a3a062a 100644
--- a/plugins/techdocs/api-report.md
+++ b/plugins/techdocs/api-report.md
@@ -191,7 +191,7 @@ export type ReaderState = {
// @public
export const Router: () => JSX.Element;
-// @public
+// @public @deprecated
export type SyncResult = 'cached' | 'updated';
// @public
@@ -394,7 +394,7 @@ export type TechDocsSearchResultListItemProps = {
title?: string;
};
-// @public
+// @public @deprecated
export interface TechDocsStorageApi {
// (undocumented)
getApiOrigin(): Promise;
@@ -417,7 +417,7 @@ export interface TechDocsStorageApi {
): Promise;
}
-// @public
+// @public @deprecated
export const techdocsStorageApiRef: ApiRef;
// @public
diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json
index c5498db5a1..ea899088dd 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.1.1-next.0",
+ "version": "1.1.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -37,21 +37,21 @@
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
"@backstage/config": "^1.0.0",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
"@backstage/integration": "^1.2.0-next.0",
- "@backstage/integration-react": "^1.1.0-next.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
- "@backstage/plugin-search-react": "^0.1.1-next.0",
- "@backstage/plugin-techdocs-react": "^0.1.1-next.0",
+ "@backstage/integration-react": "^1.1.0-next.1",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
+ "@backstage/plugin-search-react": "^0.2.0-next.1",
+ "@backstage/plugin-techdocs-react": "^0.1.1-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
"@material-ui/styles": "^4.10.0",
"dompurify": "^2.2.9",
- "event-source-polyfill": "1.0.25",
+ "event-source-polyfill": "1.0.26",
"git-url-parse": "^11.6.0",
"jss": "~10.8.2",
"lodash": "^4.17.21",
@@ -67,10 +67,10 @@
"react-dom": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
diff --git a/plugins/techdocs/src/api.ts b/plugins/techdocs/src/api.ts
index 13bd654b4d..0c60b51511 100644
--- a/plugins/techdocs/src/api.ts
+++ b/plugins/techdocs/src/api.ts
@@ -25,6 +25,7 @@ import { createApiRef } from '@backstage/core-plugin-api';
* Utility API reference for the {@link TechDocsStorageApi}.
*
* @public
+ * @deprecated Import from `@backstage/plugin-techdocs-react` instead
*/
export const techdocsStorageApiRef = createApiRef({
id: 'plugin.techdocs.storageservice',
@@ -44,6 +45,7 @@ export const techdocsApiRef = createApiRef({
* The outcome of a docs sync operation.
*
* @public
+ * @deprecated Import from `@backstage/plugin-techdocs-react` instead
*/
export type SyncResult = 'cached' | 'updated';
@@ -51,6 +53,7 @@ export type SyncResult = 'cached' | 'updated';
* API which talks to TechDocs storage to fetch files to render.
*
* @public
+ * @deprecated Import from `@backstage/plugin-techdocs-react` instead
*/
export interface TechDocsStorageApi {
getApiOrigin(): Promise;
diff --git a/plugins/techdocs/src/plugin.ts b/plugins/techdocs/src/plugin.ts
index 2e3967cb6d..4ad8b98e37 100644
--- a/plugins/techdocs/src/plugin.ts
+++ b/plugins/techdocs/src/plugin.ts
@@ -14,7 +14,10 @@
* limitations under the License.
*/
-import { techdocsApiRef, techdocsStorageApiRef } from './api';
+import {
+ techdocsApiRef,
+ techdocsStorageApiRef,
+} from '@backstage/plugin-techdocs-react';
import { TechDocsClient, TechDocsStorageClient } from './client';
import {
rootDocsRouteRef,
diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/dom.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/dom.tsx
index e8d15e5231..7a373ab302 100644
--- a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/dom.tsx
+++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/dom.tsx
@@ -26,7 +26,7 @@ import { useApi, configApiRef } from '@backstage/core-plugin-api';
import { SidebarPinStateContext } from '@backstage/core-components';
import { scmIntegrationsApiRef } from '@backstage/integration-react';
-import { techdocsStorageApiRef } from '../../../api';
+import { techdocsStorageApiRef } from '@backstage/plugin-techdocs-react';
import { useTechDocsReader } from './context';
diff --git a/plugins/techdocs/src/reader/components/useReaderState.ts b/plugins/techdocs/src/reader/components/useReaderState.ts
index 39f09af264..c9dc9b5dbf 100644
--- a/plugins/techdocs/src/reader/components/useReaderState.ts
+++ b/plugins/techdocs/src/reader/components/useReaderState.ts
@@ -18,7 +18,7 @@ import { useApi } from '@backstage/core-plugin-api';
import { useMemo, useReducer, useRef } from 'react';
import useAsync from 'react-use/lib/useAsync';
import useAsyncRetry from 'react-use/lib/useAsyncRetry';
-import { techdocsStorageApiRef } from '../../api';
+import { techdocsStorageApiRef } from '@backstage/plugin-techdocs-react';
/**
* @public
diff --git a/plugins/techdocs/src/reader/transformers/addGitFeedbackLink.ts b/plugins/techdocs/src/reader/transformers/addGitFeedbackLink.ts
index 13befb3309..9c7865936c 100644
--- a/plugins/techdocs/src/reader/transformers/addGitFeedbackLink.ts
+++ b/plugins/techdocs/src/reader/transformers/addGitFeedbackLink.ts
@@ -48,8 +48,9 @@ export const addGitFeedbackLink = (
}
// topmost h1 only contains title for whole page
- const title = (dom.querySelector('article>h1') as HTMLElement).childNodes[0]
- .textContent;
+ const title =
+ (dom.querySelector('article>h1') as HTMLElement)?.childNodes[0]
+ .textContent || '';
const issueTitle = encodeURIComponent(`Documentation Feedback: ${title}`);
const issueDesc = encodeURIComponent(
`Page source:\n${sourceAnchor.href}\n\nFeedback:`,
diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md
index c06e220dfe..6d343f7e67 100644
--- a/plugins/todo/CHANGELOG.md
+++ b/plugins/todo/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-todo
+## 0.2.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+ - @backstage/plugin-catalog-react@1.1.0-next.1
+
## 0.2.7-next.0
### Patch Changes
diff --git a/plugins/todo/package.json b/plugins/todo/package.json
index dc35d43e1e..36ae1d199e 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.7-next.0",
+ "version": "0.2.7-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -31,10 +31,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^1.0.1",
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0-next.0",
+ "@backstage/plugin-catalog-react": "^1.1.0-next.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -45,10 +45,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md
index a8e7bb03ab..74a5d9e18c 100644
--- a/plugins/user-settings/CHANGELOG.md
+++ b/plugins/user-settings/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-user-settings
+## 0.4.4-next.0
+
+### Patch Changes
+
+- ed075219aa: Added alternative text to profile picture
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.4.3
### Patch Changes
diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json
index c7b99e67c6..fa3edcf546 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.4.3",
+ "version": "0.4.4-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,8 +34,8 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -48,10 +48,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/plugins/user-settings/src/components/General/UserSettingsSignInAvatar.tsx b/plugins/user-settings/src/components/General/UserSettingsSignInAvatar.tsx
index d36655a75f..eced74c29c 100644
--- a/plugins/user-settings/src/components/General/UserSettingsSignInAvatar.tsx
+++ b/plugins/user-settings/src/components/General/UserSettingsSignInAvatar.tsx
@@ -36,5 +36,11 @@ export const UserSettingsSignInAvatar = ({ size }: Props) => {
const classes = useStyles(size ? { size } : { size: iconSize });
const { profile } = useUserProfile();
- return ;
+ return (
+
+ );
};
diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md
index 807b564ee8..bcb9ae33de 100644
--- a/plugins/xcmetrics/CHANGELOG.md
+++ b/plugins/xcmetrics/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-xcmetrics
+## 0.2.25-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.4-next.0
+ - @backstage/core-plugin-api@1.0.2-next.0
+
## 0.2.24
### Patch Changes
diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json
index 18737fce13..9112ad9c38 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.24",
+ "version": "0.2.25-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,8 +24,8 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/core-components": "^0.9.3",
- "@backstage/core-plugin-api": "^1.0.1",
+ "@backstage/core-components": "^0.9.4-next.0",
+ "@backstage/core-plugin-api": "^1.0.2-next.0",
"@backstage/errors": "^1.0.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
@@ -40,10 +40,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
- "@backstage/core-app-api": "^1.0.1",
- "@backstage/dev-utils": "^1.0.2-next.0",
- "@backstage/test-utils": "^1.0.2-next.0",
+ "@backstage/cli": "^0.17.1-next.1",
+ "@backstage/core-app-api": "^1.0.2-next.0",
+ "@backstage/dev-utils": "^1.0.2-next.1",
+ "@backstage/test-utils": "^1.1.0-next.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
diff --git a/scripts/api-extractor.ts b/scripts/api-extractor.ts
index 6d3ffb8eb2..f4a7a4dd3b 100644
--- a/scripts/api-extractor.ts
+++ b/scripts/api-extractor.ts
@@ -259,7 +259,9 @@ const NO_WARNING_PACKAGES = [
'plugins/search-common',
'plugins/search-react',
'plugins/techdocs',
+ 'plugins/techdocs-addons-test-utils',
'plugins/techdocs-backend',
+ 'plugins/techdocs-module-addons-contrib',
'plugins/techdocs-node',
'plugins/techdocs-react',
'plugins/tech-insights',
diff --git a/scripts/check-docs-quality.js b/scripts/check-docs-quality.js
index 3352596890..ac9db65b40 100755
--- a/scripts/check-docs-quality.js
+++ b/scripts/check-docs-quality.js
@@ -13,81 +13,104 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-const { execSync, spawnSync } = require('child_process');
-// eslint-disable-next-line import/no-extraneous-dependencies
-const commandExists = require('command-exists');
+const { spawnSync } = require('child_process');
+const { resolve: resolvePath, join: joinPath } = require('path');
+const fs = require('fs').promises;
-const inheritStdIo = {
- stdio: 'inherit',
-};
+const IGNORED = [
+ /^ADOPTERS\.md$/,
+ /^OWNERS\.md$/,
+ /^.*[/\\]CHANGELOG\.md$/,
+ /^.*[/\\]api-report\.md$/,
+ /^docs[/\\]releases[/\\].*-changelog\.md$/,
+];
-const LINT_SKIPPED_MESSAGE =
- 'Skipping documentation quality check (vale not found). Install vale linter (https://docs.errata.ai/vale/install) to enable.\n';
-const LINT_ERROR_MESSAGE = `Language linter (vale) generated errors. Please check the errors and review any markdown files that you changed.
- Possibly update .github/styles/vocab.txt to add new valid words.\n`;
-const VALE_NOT_FOUND_MESSAGE = `Language linter (vale) was not found. Please install vale linter (https://docs.errata.ai/vale/install).\n`;
+const rootDir = resolvePath(__dirname, '..');
-// Note: Make sure the script is run as `node check-docs-quality.js [FILES]` instead of `./check-docs-quality.js [FILES]`
-// If the script receives arguments (file paths), the script is run exclusively on them. (e.g. when run via pre-commit hook)
-const getFilesToLint = () => {
- // Files have been provided as arguments
- if (process.argv.length > 2) {
- return process.argv.slice(2);
- }
+// Manual listing to avoid dependency install for listing files in CI
+async function listFiles(dir = '') {
+ const files = await fs.readdir(dir || rootDir);
+ const paths = await Promise.all(
+ files
+ .filter(file => file !== 'node_modules')
+ .map(async file => {
+ const path = joinPath(dir, file);
- let command = `git ls-files | ./node_modules/.bin/shx grep ".md"`;
- if (process.platform === 'win32') {
- command = `git ls-files | .\\node_modules\\.bin\\shx grep ".md"`;
- }
+ if (IGNORED.some(pattern => pattern.test(path))) {
+ return [];
+ }
+ if ((await fs.stat(path)).isDirectory()) {
+ return listFiles(path);
+ }
+ if (!path.endsWith('.md')) {
+ return [];
+ }
+ return path;
+ }),
+ );
+ return paths.flat();
+}
- // Note this ignore list only applies locally, CI runs `.github/workflows/docs-quality-checker.yml`
- const ignored = ['', 'ADOPTERS.md', 'OWNERS.md'];
-
- return execSync(command, {
- stdio: ['ignore', 'pipe', 'inherit'],
- })
- .toString()
- .split('\n')
- .filter(el => !ignored.includes(el));
-};
-
-// Proceed with the script only if Vale linter is installed. Limit the friction and surprises caused by the script.
-// On CI, we want to ensure vale linter is run.
-commandExists('vale')
- .catch(() => {
+// Proceed with the script only if Vale linter is installed. Limit the friction and surprises
+// caused by the script. In CI, we want to ensure vale linter is run.
+async function exitIfMissingVale() {
+ try {
+ await require('command-exists')('vale');
+ } catch (e) {
if (process.env.CI) {
- console.log(VALE_NOT_FOUND_MESSAGE);
+ console.log(
+ `Language linter (vale) was not found. Please install vale linter (https://docs.errata.ai/vale/install).\n`,
+ );
process.exit(1);
}
- console.log(LINT_SKIPPED_MESSAGE);
+ console.log(`Language linter (vale) generated errors. Please check the errors and review any markdown files that you changed.
+ Possibly update .github/vale/Vocab/Backstage/accept.txt to add new valid words.\n`);
process.exit(0);
- })
- .then(() => {
- const filesToLint = getFilesToLint();
+ }
+}
- if (process.platform === 'win32') {
- // Windows
- try {
- const output = spawnSync('vale', filesToLint, inheritStdIo);
+async function runVale(files) {
+ const result = spawnSync(
+ 'vale',
+ ['--config', resolvePath(rootDir, '.github/vale/config.ini'), ...files],
+ {
+ stdio: 'inherit',
+ },
+ );
- // If the command does not succeed
- if (output.status !== 0) {
- // If it contains system level error. In this case vale does not exist.
- if (output.error) {
- console.log(LINT_ERROR_MESSAGE);
- }
- process.exit(1);
- }
- } catch (e) {
- console.log(e.message);
- process.exit(1);
- }
- } else {
- // Unix
- const output = spawnSync('vale', filesToLint, inheritStdIo);
- if (output.status !== 0) {
- console.log(LINT_ERROR_MESSAGE);
- process.exit(1);
- }
+ if (result.status !== 0) {
+ // TODO(Rugvip): This logic was here before but seems a bit odd, could use some verification on windows.
+ // If it contains system level error. In this case vale does not exist.
+ if (process.platform !== 'win32' || result.error) {
+ console.log(`Language linter (vale) generated errors. Please check the errors and review any markdown files that you changed.
+ Possibly update .github/vale/Vocab/Backstage/accept.txt to add new valid words.\n`);
}
- });
+ return false;
+ }
+
+ return true;
+}
+
+async function main() {
+ const files = await listFiles();
+
+ if (process.argv.includes('--ci-args')) {
+ process.stdout.write(
+ // Workaround for not being able to pass arguments to the vale action
+ JSON.stringify(['--config=.github/vale/config.ini', ...files]),
+ );
+ return;
+ }
+
+ await exitIfMissingVale();
+
+ const success = await runVale(files);
+ if (!success) {
+ process.exit(2);
+ }
+}
+
+main().catch(error => {
+ console.error(error);
+ process.exit(1);
+});
diff --git a/scripts/check-type-dependencies.js b/scripts/check-type-dependencies.js
index 4374e36ae6..ba362bd5ff 100755
--- a/scripts/check-type-dependencies.js
+++ b/scripts/check-type-dependencies.js
@@ -74,11 +74,13 @@ function shouldCheckTypes(pkg) {
}
function findAllDeps(declSrc) {
- const importedDeps = (declSrc.match(/from '.*'/g) || [])
- .map(match => match.replace(/from '(.*)'/, '$1'))
+ const importedDeps = (declSrc.match(/^import .* from '.*';$/gm) || [])
+ .map(match => match.match(/from '(.*)'/)[1])
.filter(n => !n.startsWith('.'));
- const referencedDeps = (declSrc.match(/types=".*"/g) || [])
- .map(match => match.replace(/types="(.*)"/, '$1'))
+ const referencedDeps = (
+ declSrc.match(/^\/\/\/ $/gm) || []
+ )
+ .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));
diff --git a/storybook/yarn.lock b/storybook/yarn.lock
index 98772f8c05..4660d682bc 100644
--- a/storybook/yarn.lock
+++ b/storybook/yarn.lock
@@ -7913,9 +7913,9 @@ store2@^2.12.0:
integrity sha512-CMtO2Uneg3SAz/d6fZ/6qbqqQHi2ynq6/KzMD/26gTkiEShCcpqFfTHgOxsE0egAq6SX3FmN4CeSqn8BzXQkJg==
storybook-dark-mode@^1.0.9:
- version "1.0.9"
- resolved "https://registry.npmjs.org/storybook-dark-mode/-/storybook-dark-mode-1.0.9.tgz#40c15aa340bc700df2fb4f1345250e6fdace0b3a"
- integrity sha512-ITPXM2OSaga1zM5blpZy5HxMWAhrAqYi9aJtLgRtSdgoRrxVNAInDRD14TjmObdgLHNWxINoNbnEB+sKETa+iw==
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/storybook-dark-mode/-/storybook-dark-mode-1.1.0.tgz#4aca307a9c09f1b95743da2db6b07c8eea99ed24"
+ integrity sha512-F+hG02zYGBzxGTUonA1XDV/CtMYm3OjF38Tu1CIUN+w+8hwUrwLcOtgtLLw6VjSrZdJ/ECK+tjXdKTV4oZqAXw==
dependencies:
fast-deep-equal "^3.0.0"
memoizerific "^1.11.3"
diff --git a/yarn.lock b/yarn.lock
index 6ce1b2240e..61c1c2c17a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -56,13 +56,6 @@
dependencies:
xss "^1.0.8"
-"@ardatan/aggregate-error@0.0.6":
- version "0.0.6"
- resolved "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz#fe6924771ea40fc98dc7a7045c2e872dc8527609"
- integrity sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==
- dependencies:
- tslib "~2.0.1"
-
"@asyncapi/avro-schema-parser@^0.3.0":
version "0.3.0"
resolved "https://registry.npmjs.org/@asyncapi/avro-schema-parser/-/avro-schema-parser-0.3.0.tgz#6922acc559ef999c57e81297d78ffe680fc92b3c"
@@ -75,13 +68,13 @@
dependencies:
"@openapi-contrib/openapi-schema-to-json-schema" "^3.0.0"
-"@asyncapi/parser@^1.14.1":
- version "1.14.1"
- resolved "https://registry.npmjs.org/@asyncapi/parser/-/parser-1.14.1.tgz#2f474f9d5ba1ce5b144e487fd956c0809ab11a9e"
- integrity sha512-ZsNQc/HXmGDrxkYBRrGou/JrWn+FLHYdQQI0WPOylSL+LNfaWtLlIcYwbcj61l+jLLFqIe0DK/yZbmjxm0ydqw==
+"@asyncapi/parser@^1.15.0":
+ version "1.15.0"
+ resolved "https://registry.npmjs.org/@asyncapi/parser/-/parser-1.15.0.tgz#649f88097a6af750ef034c22b8925f674a220dd6"
+ integrity sha512-ff4ljaNry0BFvlM1SOSff3jvZyKkiBVJgIOqHcUZtKBAmXxpvsX0nz9pi8fHbg9NrmNyASPCVTCpiDb7Zasreg==
dependencies:
"@apidevtools/json-schema-ref-parser" "^9.0.6"
- "@asyncapi/specs" "^2.13.0"
+ "@asyncapi/specs" "^2.14.0"
"@fmvilas/pseudo-yaml-ast" "^0.3.1"
ajv "^6.10.1"
js-yaml "^3.13.1"
@@ -90,24 +83,24 @@
node-fetch "^2.6.0"
tiny-merge-patch "^0.1.2"
-"@asyncapi/react-component@1.0.0-next.36":
- version "1.0.0-next.36"
- resolved "https://registry.npmjs.org/@asyncapi/react-component/-/react-component-1.0.0-next.36.tgz#81b2099381f8e77d175a6e04933299f2dd24d97b"
- integrity sha512-2ruMfFHCJGnIlbmB/x1qBcg9eLhqDUSzWs7OjSoVPEoJQgtyFGy+Wkow7Liu0cYwPFJJfHCu+VOvLVKXmUUTxw==
+"@asyncapi/react-component@1.0.0-next.38":
+ version "1.0.0-next.38"
+ resolved "https://registry.npmjs.org/@asyncapi/react-component/-/react-component-1.0.0-next.38.tgz#33909f556f18870faca8d8a9e9827a7e341a90ea"
+ integrity sha512-Uq0wcVHqmKXfvYCa74OiCEgNz3CbpVodeeIjrIsKWqyb9H6QjEA0pIJSLbvEwA+YKVGDXb48R3zsMSmRaqnmnA==
dependencies:
"@asyncapi/avro-schema-parser" "^0.3.0"
"@asyncapi/openapi-schema-parser" "^2.0.0"
- "@asyncapi/parser" "^1.14.1"
+ "@asyncapi/parser" "^1.15.0"
highlight.js "^10.7.2"
isomorphic-dompurify "^0.13.0"
marked "^4.0.14"
openapi-sampler "^1.2.1"
use-resize-observer "^8.0.0"
-"@asyncapi/specs@^2.13.0":
- version "2.13.0"
- resolved "https://registry.npmjs.org/@asyncapi/specs/-/specs-2.13.0.tgz#c0f46d00e8a67c1c9ea445eb3e8bca90f7dca795"
- integrity sha512-X0OrxJtzwRH8iLILO/gUTDqjGVPmagmdlgdyuBggYAoGXzF6ZuAws3XCLxtPNve5eA/0V/1puwpUYEGekI22og==
+"@asyncapi/specs@^2.14.0":
+ version "2.14.0"
+ resolved "https://registry.npmjs.org/@asyncapi/specs/-/specs-2.14.0.tgz#a4535fedde931181f20d41356ed1906d0fb73d48"
+ integrity sha512-hHsYF6XsYNIKb1P2rXaooF4H+uKKQ4b/Ljxrk3rZ3riEDiSxMshMEfb1fUlw9Yj4V4OmJhjXwkNvw8W59AXv1A==
"@azure/abort-controller@^1.0.0":
version "1.0.2"
@@ -260,17 +253,17 @@
dependencies:
debug "^4.1.1"
-"@azure/msal-common@^6.2.0":
- version "6.2.0"
- resolved "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.2.0.tgz#715fd68df92ed230913d1d725e9f9b09f799a66c"
- integrity sha512-SU2/vfbKn1WvtKM8tsBKZAbmRJvO8E3H773ZT0GGKuO9rwLfxP5qOzTHV5crCEm8DgvL/IppmWh2lsUFieDi1A==
+"@azure/msal-common@^6.3.0":
+ version "6.3.0"
+ resolved "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.3.0.tgz#a0cdb6be1ae3cfdc5acf3c32979375a0fef433b2"
+ integrity sha512-ZyLq9GdnLBi/83YpysE86TFKbA0TuvfNAN5Psqu20cdAjLo/4rw4ttiItdh1G//XeGErHk9qn57gi2AYU1b5/Q==
"@azure/msal-node@^1.1.0", "@azure/msal-node@^1.3.0":
- version "1.8.0"
- resolved "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.8.0.tgz#b119362e756a2a214853b9e8d0a1bec2e00dacef"
- integrity sha512-rA5KzhvNuNef6Bzap8Sm/LbuesvA1yY2dj/W+QZuKMtT5nboZ4n4w8LRjwMMxucvYfizybPbLGTFpbq2IJtOfQ==
+ version "1.9.0"
+ resolved "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.9.0.tgz#d42d848d2997aa9559d6bd6e1ec4f602b29dc1ba"
+ integrity sha512-lw6ejz1WPqcdjkwp91Gidte98+kfGxHk9eYSmmpUChzrUUrZMFGvrtrvG3Qnr6bp5d4WijVge9LMe+2QQUMhoA==
dependencies:
- "@azure/msal-common" "^6.2.0"
+ "@azure/msal-common" "^6.3.0"
axios "^0.21.4"
https-proxy-agent "^5.0.0"
jsonwebtoken "^8.5.1"
@@ -1366,7 +1359,7 @@
dependencies:
regenerator-runtime "^0.13.4"
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
version "7.17.7"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.7.tgz#a5f3328dc41ff39d803f311cfe17703418cf9825"
integrity sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA==
@@ -1430,6 +1423,63 @@
"@babel/helper-validator-identifier" "^7.16.7"
to-fast-properties "^2.0.0"
+"@backstage/core-components@^0.9.0", "@backstage/core-components@^0.9.3":
+ version "0.9.3"
+ resolved "https://registry.npmjs.org/@backstage/core-components/-/core-components-0.9.3.tgz#79d8bcea06281da492730fe8eb14aa18877b27c4"
+ integrity sha512-cZr6pT3Q7whzdKvB/M3P4NH2/J4+GHKLvQsnRNoel+DE6PmenyAPDslSRf62Lu17+n6qZNHPMfySK1rePnf0Kg==
+ dependencies:
+ "@backstage/config" "^1.0.0"
+ "@backstage/core-plugin-api" "^1.0.1"
+ "@backstage/errors" "^1.0.0"
+ "@backstage/theme" "^0.2.15"
+ "@material-table/core" "^3.1.0"
+ "@material-ui/core" "^4.12.2"
+ "@material-ui/icons" "^4.9.1"
+ "@material-ui/lab" "4.0.0-alpha.57"
+ "@react-hookz/web" "^13.0.0"
+ "@types/react-sparklines" "^1.7.0"
+ "@types/react-text-truncate" "^0.14.0"
+ ansi-regex "^6.0.1"
+ classnames "^2.2.6"
+ d3-selection "^3.0.0"
+ d3-shape "^3.0.0"
+ d3-zoom "^3.0.0"
+ dagre "^0.8.5"
+ history "^5.0.0"
+ immer "^9.0.1"
+ lodash "^4.17.21"
+ pluralize "^8.0.0"
+ prop-types "^15.7.2"
+ qs "^6.9.4"
+ rc-progress "3.2.4"
+ react-helmet "6.1.0"
+ react-hook-form "^7.12.2"
+ react-markdown "^8.0.0"
+ react-router "6.0.0-beta.0"
+ react-router-dom "6.0.0-beta.0"
+ react-sparklines "^1.7.0"
+ react-syntax-highlighter "^15.4.5"
+ react-text-truncate "^0.18.0"
+ react-use "^17.3.2"
+ react-virtualized-auto-sizer "^1.0.6"
+ react-window "^1.8.6"
+ remark-gfm "^3.0.1"
+ zen-observable "^0.8.15"
+ zod "^3.11.6"
+
+"@backstage/core-plugin-api@^1.0.0", "@backstage/core-plugin-api@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@backstage/core-plugin-api/-/core-plugin-api-1.0.1.tgz#2ad19da6765c40db353c6ae5bf4255dab1f47be2"
+ integrity sha512-x7xlSDqi7SuVgbq9NSdzciDEThIfytVmtbZasY/TtHH3upLre/5AFb8SiPEFiQJX6QBmPWeKG/I+LW+91cEMig==
+ dependencies:
+ "@backstage/config" "^1.0.0"
+ "@backstage/types" "^1.0.0"
+ "@backstage/version-bridge" "^1.0.1"
+ history "^5.0.0"
+ prop-types "^15.7.2"
+ react-router-dom "6.0.0-beta.0"
+ zen-observable "^0.8.15"
+
"@backstage/integration-react@^1.0.0":
version "1.0.1"
resolved "https://registry.npmjs.org/@backstage/integration-react/-/integration-react-1.0.1.tgz#47f56df1fdc9c30ab43be4471667769989b2192e"
@@ -1506,6 +1556,19 @@
react-router "6.0.0-beta.0"
react-use "^17.2.4"
+"@backstage/plugin-permission-react@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/@backstage/plugin-permission-react/-/plugin-permission-react-0.4.0.tgz#3135b8bbd0e303afafeeae7b9a0d4de7d9e1198c"
+ integrity sha512-bqyBWHKQKT7Lsk4Z3Y6m2FkczN/0I7cRHiBAqv8go8etYk+tEsud9Mk7lRMX/e4+RKg3i4bLcUHerWdEeNqagw==
+ dependencies:
+ "@backstage/config" "^1.0.0"
+ "@backstage/core-plugin-api" "^1.0.1"
+ "@backstage/plugin-permission-common" "^0.6.0"
+ cross-fetch "^3.1.5"
+ react-router "6.0.0-beta.0"
+ react-use "^17.2.4"
+ swr "^1.1.2"
+
"@backstage/plugin-stack-overflow@^0.1.0":
version "0.1.0"
resolved "https://registry.npmjs.org/@backstage/plugin-stack-overflow/-/plugin-stack-overflow-0.1.0.tgz#5f5ee8b30d684b7c71f746fe923c16875a62d621"
@@ -1738,237 +1801,96 @@
human-id "^1.0.2"
prettier "^1.19.1"
-"@codemirror/autocomplete@^0.19.0":
- version "0.19.14"
- resolved "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-0.19.14.tgz#5f61b0fced56e7960791063d03b21d11a63f0ec5"
- integrity sha512-4PqJG7GGTePc+FQF387RFebDV4ERvKj23gQBmzNtu64ZSHlYEGulwP5EIIfulBiaWEmei9TYVaMFmTdNfofpRQ==
+"@codemirror/autocomplete@^0.20.0":
+ version "0.20.0"
+ resolved "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-0.20.0.tgz#390cc444ea36474e77117f2153caad84214f0edf"
+ integrity sha512-F6VOM8lImn5ApqxJcaWgdl7hhlw8B5yAfZJGlsQifcpNotkZOMND61mBFZ84OmSLWxtT8/smkSeLvJupKbjP9w==
dependencies:
- "@codemirror/language" "^0.19.0"
- "@codemirror/state" "^0.19.4"
- "@codemirror/text" "^0.19.2"
- "@codemirror/tooltip" "^0.19.12"
- "@codemirror/view" "^0.19.0"
- "@lezer/common" "^0.15.0"
+ "@codemirror/language" "^0.20.0"
+ "@codemirror/state" "^0.20.0"
+ "@codemirror/view" "^0.20.0"
+ "@lezer/common" "^0.16.0"
-"@codemirror/basic-setup@^0.19.1":
- version "0.19.1"
- resolved "https://registry.npmjs.org/@codemirror/basic-setup/-/basic-setup-0.19.1.tgz#17b27d02f15c628eb62a85d01e3e1b1958933eb4"
- integrity sha512-gLjD7YgZU/we6BzS/ecCmD3viw83dsgv5ZUaSydYbYx9X4w4w9RqYnckcJ+0GDyHfNr5Jtfv2Z5ZtFQnBj0UDA==
+"@codemirror/basic-setup@^0.20.0":
+ version "0.20.0"
+ resolved "https://registry.npmjs.org/@codemirror/basic-setup/-/basic-setup-0.20.0.tgz#ed331e0b2d29efc0a09317de9e10467b992b0c7b"
+ integrity sha512-W/ERKMLErWkrVLyP5I8Yh8PXl4r+WFNkdYVSzkXYPQv2RMPSkWpr2BgggiSJ8AHF/q3GuApncDD8I4BZz65fyg==
dependencies:
- "@codemirror/autocomplete" "^0.19.0"
- "@codemirror/closebrackets" "^0.19.0"
- "@codemirror/commands" "^0.19.0"
- "@codemirror/comment" "^0.19.0"
- "@codemirror/fold" "^0.19.0"
- "@codemirror/gutter" "^0.19.0"
- "@codemirror/highlight" "^0.19.0"
- "@codemirror/history" "^0.19.0"
- "@codemirror/language" "^0.19.0"
- "@codemirror/lint" "^0.19.0"
- "@codemirror/matchbrackets" "^0.19.0"
- "@codemirror/rectangular-selection" "^0.19.0"
- "@codemirror/search" "^0.19.0"
- "@codemirror/state" "^0.19.0"
- "@codemirror/view" "^0.19.31"
+ "@codemirror/autocomplete" "^0.20.0"
+ "@codemirror/commands" "^0.20.0"
+ "@codemirror/language" "^0.20.0"
+ "@codemirror/lint" "^0.20.0"
+ "@codemirror/search" "^0.20.0"
+ "@codemirror/state" "^0.20.0"
+ "@codemirror/view" "^0.20.0"
-"@codemirror/closebrackets@^0.19.0":
- version "0.19.1"
- resolved "https://registry.npmjs.org/@codemirror/closebrackets/-/closebrackets-0.19.1.tgz#c93219d6800c27a880e569135b468cf4a05d903f"
- integrity sha512-ZiLXT6u+VuBK5QnfBbt/Vmfd9Pg6449wn1DIOWFZHUOldg5eFn3VGGjYY2XWuHQz5WuK+7dXamV2KE885O1gyA==
+"@codemirror/commands@^0.20.0":
+ version "0.20.0"
+ resolved "https://registry.npmjs.org/@codemirror/commands/-/commands-0.20.0.tgz#51405d442e6b8687b63e8fa27effc28179917c88"
+ integrity sha512-v9L5NNVA+A9R6zaFvaTbxs30kc69F6BkOoiEbeFw4m4I0exmDEKBILN6mK+GksJtvTzGBxvhAPlVFTdQW8GB7Q==
dependencies:
- "@codemirror/language" "^0.19.0"
- "@codemirror/rangeset" "^0.19.0"
- "@codemirror/state" "^0.19.2"
- "@codemirror/text" "^0.19.0"
- "@codemirror/view" "^0.19.44"
+ "@codemirror/language" "^0.20.0"
+ "@codemirror/state" "^0.20.0"
+ "@codemirror/view" "^0.20.0"
+ "@lezer/common" "^0.16.0"
-"@codemirror/commands@^0.19.0":
- version "0.19.8"
- resolved "https://registry.npmjs.org/@codemirror/commands/-/commands-0.19.8.tgz#1f99c1a8bf200d17c4d6997379099459f3678107"
- integrity sha512-65LIMSGUGGpY3oH6mzV46YWRrgao6NmfJ+AuC7jNz3K5NPnH6GCV1H5I6SwOFyVbkiygGyd0EFwrWqywTBD1aw==
+"@codemirror/language@^0.20.0":
+ version "0.20.0"
+ resolved "https://registry.npmjs.org/@codemirror/language/-/language-0.20.0.tgz#959967901e780c1612934cf5d6df3d7b7e5bf9f0"
+ integrity sha512-lPsF5Y2ZFd5lZ9+7HXTxu57Po3dms3+7q2iAffzrbis2wyJo0lzi/j2312EKStEzwd0pGGpvrUk2dEd333N2jw==
dependencies:
- "@codemirror/language" "^0.19.0"
- "@codemirror/matchbrackets" "^0.19.0"
- "@codemirror/state" "^0.19.2"
- "@codemirror/text" "^0.19.6"
- "@codemirror/view" "^0.19.22"
- "@lezer/common" "^0.15.0"
+ "@codemirror/state" "^0.20.0"
+ "@codemirror/view" "^0.20.0"
+ "@lezer/common" "^0.16.0"
+ "@lezer/highlight" "^0.16.0"
+ "@lezer/lr" "^0.16.0"
-"@codemirror/comment@^0.19.0":
- version "0.19.1"
- resolved "https://registry.npmjs.org/@codemirror/comment/-/comment-0.19.1.tgz#7def8345eeb9095ef1ef33676fbde1ab4fe33fad"
- integrity sha512-uGKteBuVWAC6fW+Yt8u27DOnXMT/xV4Ekk2Z5mRsiADCZDqYvryrJd6PLL5+8t64BVyocwQwNfz1UswYS2CtFQ==
+"@codemirror/legacy-modes@^0.20.0":
+ version "0.20.0"
+ resolved "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-0.20.0.tgz#a1cea5eed05fa09a0cac4a39f41e362a136da5ea"
+ integrity sha512-SYllodnzD8OI6Y6NoFzCv+77cU9aTdfqDO0Zn8j5PbjUIAD+pIofwHAvecd9/ePLAICr+EYCEuqUxldHAR+pLQ==
dependencies:
- "@codemirror/state" "^0.19.9"
- "@codemirror/text" "^0.19.0"
- "@codemirror/view" "^0.19.0"
+ "@codemirror/language" "^0.20.0"
-"@codemirror/fold@^0.19.0":
- version "0.19.3"
- resolved "https://registry.npmjs.org/@codemirror/fold/-/fold-0.19.3.tgz#de55d44a7313f2a8920aefb6ebf9eff34715d8d4"
- integrity sha512-8hT+Eq2G68mL0yPRvSD2ewhnLQAX6sbUJmtGVKFcj8oAXtfpYCX8LIcfXsuI19Qs7gZkOSpqZvn+KKj8IhZoAw==
+"@codemirror/lint@^0.20.0":
+ version "0.20.1"
+ resolved "https://registry.npmjs.org/@codemirror/lint/-/lint-0.20.1.tgz#791c83642f76103bbf6b8bfdc8020eff2b78b5e2"
+ integrity sha512-aWbeicDiNe5tb2aZuXs7sKk3hQ89Z1YcUuUX8ngQu23tT6EY4kcY2cayDjizvkLn8iHkObNf97uSudjNmUon2Q==
dependencies:
- "@codemirror/gutter" "^0.19.0"
- "@codemirror/language" "^0.19.0"
- "@codemirror/rangeset" "^0.19.0"
- "@codemirror/state" "^0.19.0"
- "@codemirror/view" "^0.19.22"
-
-"@codemirror/gutter@^0.19.0", "@codemirror/gutter@^0.19.4":
- version "0.19.9"
- resolved "https://registry.npmjs.org/@codemirror/gutter/-/gutter-0.19.9.tgz#bbb69f4d49570d9c1b3f3df5d134980c516cd42b"
- integrity sha512-PFrtmilahin1g6uL27aG5tM/rqR9DZzZYZsIrCXA5Uc2OFTFqx4owuhoU9hqfYxHp5ovfvBwQ+txFzqS4vog6Q==
- dependencies:
- "@codemirror/rangeset" "^0.19.0"
- "@codemirror/state" "^0.19.0"
- "@codemirror/view" "^0.19.23"
-
-"@codemirror/highlight@^0.19.0":
- version "0.19.6"
- resolved "https://registry.npmjs.org/@codemirror/highlight/-/highlight-0.19.6.tgz#7f2e066f83f5649e8e0748a3abe0aaeaf64b8ac2"
- integrity sha512-+eibu6on9quY8uN3xJ/n3rH+YIDLlpX7YulVmFvqAIz/ukRQ5tWaBmB7fMixHmnmRIRBRZgB8rNtonuMwZSAHQ==
- dependencies:
- "@codemirror/language" "^0.19.0"
- "@codemirror/rangeset" "^0.19.0"
- "@codemirror/state" "^0.19.0"
- "@codemirror/view" "^0.19.0"
- "@lezer/common" "^0.15.0"
- style-mod "^4.0.0"
-
-"@codemirror/history@^0.19.0":
- version "0.19.2"
- resolved "https://registry.npmjs.org/@codemirror/history/-/history-0.19.2.tgz#25e3fda755f77ac1223a6ae6e9d7899f5919265e"
- integrity sha512-unhP4t3N2smzmHoo/Yio6ueWi+il8gm9VKrvi6wlcdGH5fOfVDNkmjHQ495SiR+EdOG35+3iNebSPYww0vN7ow==
- dependencies:
- "@codemirror/state" "^0.19.2"
- "@codemirror/view" "^0.19.0"
-
-"@codemirror/language@^0.19.0":
- version "0.19.7"
- resolved "https://registry.npmjs.org/@codemirror/language/-/language-0.19.7.tgz#9eef8e827692d93a701b18db9d46a42be34ecca6"
- integrity sha512-pNNUtYWMIMG0lUSKyUXJr8U0rFiCKsKFXbA2Oj17PC+S1FY99hV0z1vcntW67ekAIZw9DMEUQnLsKBuIbAUX7Q==
- dependencies:
- "@codemirror/state" "^0.19.0"
- "@codemirror/text" "^0.19.0"
- "@codemirror/view" "^0.19.0"
- "@lezer/common" "^0.15.5"
- "@lezer/lr" "^0.15.0"
-
-"@codemirror/legacy-modes@^0.19.0":
- version "0.19.1"
- resolved "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-0.19.1.tgz#7dc3b5df1842060648f75764ab6919fcfce3ea1a"
- integrity sha512-vYPLsD/ON+3SXhlGj9Qb3fpFNNU3Ya/AtDiv/g3OyqVzhh5vs5rAnOvk8xopGWRwppdhlNPD9VyXjiOmZUQtmQ==
- dependencies:
- "@codemirror/stream-parser" "^0.19.0"
-
-"@codemirror/lint@^0.19.0":
- version "0.19.6"
- resolved "https://registry.npmjs.org/@codemirror/lint/-/lint-0.19.6.tgz#0379688da3e16739db4a6304c73db857ca85d7ec"
- integrity sha512-Pbw1Y5kHVs2J+itQ0uez3dI4qY9ApYVap7eNfV81x1/3/BXgBkKfadaw0gqJ4h4FDG7OnJwb0VbPsjJQllHjaA==
- dependencies:
- "@codemirror/gutter" "^0.19.4"
- "@codemirror/panel" "^0.19.0"
- "@codemirror/rangeset" "^0.19.1"
- "@codemirror/state" "^0.19.4"
- "@codemirror/tooltip" "^0.19.16"
- "@codemirror/view" "^0.19.22"
+ "@codemirror/state" "^0.20.0"
+ "@codemirror/view" "^0.20.2"
crelt "^1.0.5"
-"@codemirror/matchbrackets@^0.19.0":
- version "0.19.4"
- resolved "https://registry.npmjs.org/@codemirror/matchbrackets/-/matchbrackets-0.19.4.tgz#50b5188eb2d53f32598dca906bf5fd66626a9ebc"
- integrity sha512-VFkaOKPNudAA5sGP1zikRHCEKU0hjYmkKpr04pybUpQvfTvNJXlReCyP0rvH/1iEwAGPL990ZTT+QrLdu4MeEA==
+"@codemirror/search@^0.20.0":
+ version "0.20.1"
+ resolved "https://registry.npmjs.org/@codemirror/search/-/search-0.20.1.tgz#9eba0514218a673e29501a889a4fcb7da7ce24ad"
+ integrity sha512-ROe6gRboQU5E4z6GAkNa2kxhXqsGNbeLEisbvzbOeB7nuDYXUZ70vGIgmqPu0tB+1M3F9yWk6W8k2vrFpJaD4Q==
dependencies:
- "@codemirror/language" "^0.19.0"
- "@codemirror/state" "^0.19.0"
- "@codemirror/view" "^0.19.0"
- "@lezer/common" "^0.15.0"
-
-"@codemirror/panel@^0.19.0", "@codemirror/panel@^0.19.1":
- version "0.19.1"
- resolved "https://registry.npmjs.org/@codemirror/panel/-/panel-0.19.1.tgz#bf77d27b962cf16357139e50864d0eb69d634441"
- integrity sha512-sYeOCMA3KRYxZYJYn5PNlt9yNsjy3zTNTrbYSfVgjgL9QomIVgOJWPO5hZ2sTN8lufO6lw0vTBsIPL9MSidmBg==
- dependencies:
- "@codemirror/state" "^0.19.0"
- "@codemirror/view" "^0.19.0"
-
-"@codemirror/rangeset@^0.19.0", "@codemirror/rangeset@^0.19.1", "@codemirror/rangeset@^0.19.5":
- version "0.19.9"
- resolved "https://registry.npmjs.org/@codemirror/rangeset/-/rangeset-0.19.9.tgz#e80895de93c39dc7899f5be31d368c9d88aa4efc"
- integrity sha512-V8YUuOvK+ew87Xem+71nKcqu1SXd5QROMRLMS/ljT5/3MCxtgrRie1Cvild0G/Z2f1fpWxzX78V0U4jjXBorBQ==
- dependencies:
- "@codemirror/state" "^0.19.0"
-
-"@codemirror/rectangular-selection@^0.19.0":
- version "0.19.1"
- resolved "https://registry.npmjs.org/@codemirror/rectangular-selection/-/rectangular-selection-0.19.1.tgz#5a88ece4fb68ce5682539497db8a64fc015aae63"
- integrity sha512-9ElnqOg3mpZIWe0prPRd1SZ48Q9QB3bR8Aocq8UtjboJSUG8ABhRrbuTZMW/rMqpBPSjVpCe9xkCCkEQMYQVmw==
- dependencies:
- "@codemirror/state" "^0.19.0"
- "@codemirror/text" "^0.19.4"
- "@codemirror/view" "^0.19.0"
-
-"@codemirror/search@^0.19.0":
- version "0.19.9"
- resolved "https://registry.npmjs.org/@codemirror/search/-/search-0.19.9.tgz#b9548dfeb2028e6d5ecd1965f8f0ee50e2925603"
- integrity sha512-h3MuwbUbiyOp6Np3IB5r4LH0w4inZvbtLO1Ipmz8RhElcGRiYr11Q6Bim8ocLfe08RmZT6B5EkTj1E8eNlugQQ==
- dependencies:
- "@codemirror/panel" "^0.19.0"
- "@codemirror/rangeset" "^0.19.0"
- "@codemirror/state" "^0.19.3"
- "@codemirror/text" "^0.19.0"
- "@codemirror/view" "^0.19.34"
+ "@codemirror/state" "^0.20.0"
+ "@codemirror/view" "^0.20.0"
crelt "^1.0.5"
-"@codemirror/state@^0.19.0", "@codemirror/state@^0.19.2", "@codemirror/state@^0.19.3", "@codemirror/state@^0.19.4", "@codemirror/state@^0.19.9":
- version "0.19.9"
- resolved "https://registry.npmjs.org/@codemirror/state/-/state-0.19.9.tgz#b797f9fbc204d6dc7975485e231693c09001b0dd"
- integrity sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw==
- dependencies:
- "@codemirror/text" "^0.19.0"
+"@codemirror/state@^0.20.0":
+ version "0.20.0"
+ resolved "https://registry.npmjs.org/@codemirror/state/-/state-0.20.0.tgz#3343d209169813b0152b77361cd78bea01549a73"
+ integrity sha512-R3XrAWCS5Xm9lx+4pDET4EUPEg+8bDfAa5zoOFIhx+VChsfew9Vy33dAjCXS5ES4Q8UecW4WM4UudmUFpZ+86A==
-"@codemirror/stream-parser@^0.19.0", "@codemirror/stream-parser@^0.19.2", "@codemirror/stream-parser@^0.19.6":
- version "0.19.9"
- resolved "https://registry.npmjs.org/@codemirror/stream-parser/-/stream-parser-0.19.9.tgz#34955ea91a8047cf72abebd5ce28f0d332aeca48"
- integrity sha512-WTmkEFSRCetpk8xIOvV2yyXdZs3DgYckM0IP7eFi4ewlxWnJO/H4BeJZLs4wQaydWsAqTQoDyIwNH1BCzK5LUQ==
+"@codemirror/theme-one-dark@^0.20.0":
+ version "0.20.0"
+ resolved "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-0.20.0.tgz#112074e446d46931d1104405154ccbe8c8874009"
+ integrity sha512-iqTKaiOZddwlc2rYF+9D60Gfyz9EsSawVejSjyP2FCtOwZ1X0frG5/ByTKH5FBDD2+P7W8+h/OIG4r5dWq4bgA==
dependencies:
- "@codemirror/highlight" "^0.19.0"
- "@codemirror/language" "^0.19.0"
- "@codemirror/state" "^0.19.0"
- "@codemirror/text" "^0.19.0"
- "@lezer/common" "^0.15.0"
- "@lezer/lr" "^0.15.0"
+ "@codemirror/language" "^0.20.0"
+ "@codemirror/state" "^0.20.0"
+ "@codemirror/view" "^0.20.0"
+ "@lezer/highlight" "^0.16.0"
-"@codemirror/text@^0.19.0", "@codemirror/text@^0.19.2", "@codemirror/text@^0.19.4", "@codemirror/text@^0.19.6":
- version "0.19.6"
- resolved "https://registry.npmjs.org/@codemirror/text/-/text-0.19.6.tgz#9adcbd8137f69b75518eacd30ddb16fd67bbac45"
- integrity sha512-T9jnREMIygx+TPC1bOuepz18maGq/92q2a+n4qTqObKwvNMg+8cMTslb8yxeEDEq7S3kpgGWxgO1UWbQRij0dA==
-
-"@codemirror/theme-one-dark@^0.19.1":
- version "0.19.1"
- resolved "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-0.19.1.tgz#648b9cbe37186a2b7bd2a83fb483dc7aa18ce218"
- integrity sha512-8gc4c2k2o/EhyHoWkghCxp5vyDT96JaFGtRy35PHwIom0LZdx7aU4AbDUnITvwiFB+0+i54VO+WQjBqgTyJvqg==
+"@codemirror/view@^0.20.0", "@codemirror/view@^0.20.2":
+ version "0.20.4"
+ resolved "https://registry.npmjs.org/@codemirror/view/-/view-0.20.4.tgz#5d988b929103f8148ec92512b937a3a8601bcc72"
+ integrity sha512-6yprcc0/39EzI6y9Jm/J5F9lFzQik0yj8gE3CO/wOCQ4vd3Drol114mMK91LGtKrfoS0MFKVGulw0TdfN49Bfw==
dependencies:
- "@codemirror/highlight" "^0.19.0"
- "@codemirror/state" "^0.19.0"
- "@codemirror/view" "^0.19.0"
-
-"@codemirror/tooltip@^0.19.12", "@codemirror/tooltip@^0.19.16":
- version "0.19.16"
- resolved "https://registry.npmjs.org/@codemirror/tooltip/-/tooltip-0.19.16.tgz#6ba2c43f9d8e3d943d9d7bbae22bf800f7726a22"
- integrity sha512-zxKDHryUV5/RS45AQL+wOeN+i7/l81wK56OMnUPoTSzCWNITfxHn7BToDsjtrRKbzHqUxKYmBnn/4hPjpZ4WJQ==
- dependencies:
- "@codemirror/state" "^0.19.0"
- "@codemirror/view" "^0.19.0"
-
-"@codemirror/view@^0.19.0", "@codemirror/view@^0.19.22", "@codemirror/view@^0.19.23", "@codemirror/view@^0.19.31", "@codemirror/view@^0.19.34", "@codemirror/view@^0.19.44", "@codemirror/view@^0.19.45":
- version "0.19.47"
- resolved "https://registry.npmjs.org/@codemirror/view/-/view-0.19.47.tgz#2163c3016d7680bf50dd695c0e3abdaf80f45363"
- integrity sha512-SfbagKvJQl5dtt+9wYpo9sa3ZkMgUxTq+/hXDf0KVwIx+zu3cJIqfEm9xSx6yXkq7it7RsPGHaPasApNffF/8g==
- dependencies:
- "@codemirror/rangeset" "^0.19.5"
- "@codemirror/state" "^0.19.3"
- "@codemirror/text" "^0.19.0"
+ "@codemirror/state" "^0.20.0"
style-mod "^4.0.0"
w3c-keyname "^2.2.4"
@@ -2119,10 +2041,10 @@
dependencies:
tiny-lru "7.0.6"
-"@eslint/eslintrc@^1.2.1":
- version "1.2.1"
- resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6"
- integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==
+"@eslint/eslintrc@^1.2.2":
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz#4989b9e8c0216747ee7cca314ae73791bb281aae"
+ integrity sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
@@ -2224,9 +2146,9 @@
integrity sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw==
"@google-cloud/storage@^5.6.0", "@google-cloud/storage@^5.8.0":
- version "5.19.3"
- resolved "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.19.3.tgz#0624f57a7ed5a4e3e0e23d5aaab849cb015f903a"
- integrity sha512-l+8X0BoA7rg9jyZaS4p2DwMg1Ivju+VAL6PeQZE1u2q52LQ0KemrZmdQWhtrplHYo8UdYtqpbj4A6Fc5fKDZdg==
+ version "5.19.4"
+ resolved "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.19.4.tgz#d3377f03b575c66f61e2782ffd0f65419a30ebe0"
+ integrity sha512-Jz7ugcPHhsEmMVvIxM9uoBsdEbKIYwDkh3u07tifsIymEWs47F4/D6+/Tv/W7kLhznqjyOjVJ/0frtBeIC0lJA==
dependencies:
"@google-cloud/paginator" "^3.0.7"
"@google-cloud/projectify" "^2.0.0"
@@ -2319,16 +2241,16 @@
tslib "~2.3.0"
"@graphql-codegen/graphql-modules-preset@^2.3.2":
- version "2.3.8"
- resolved "https://registry.npmjs.org/@graphql-codegen/graphql-modules-preset/-/graphql-modules-preset-2.3.8.tgz#6b7bc5fed2890c1893e1e3779921821265055023"
- integrity sha512-mYQG2+cbyG3AB1mKR3bqcUUHinbDpCfU/JzHu48t9S/db0HHDzo00WtUMnYPBPd5gohXJ1D1y4h6noPU0gt8bg==
+ version "2.3.9"
+ resolved "https://registry.npmjs.org/@graphql-codegen/graphql-modules-preset/-/graphql-modules-preset-2.3.9.tgz#65f52d5dba222d3770b634167872dd99de52e1eb"
+ integrity sha512-1qW2uXgorZRVNgk9EccCZ32Fi49otwD0Hl+PDFqw/PZUGLfSspDabup4LZE7XGlKAG8q38xgBNgZxcuSnCqyAA==
dependencies:
"@graphql-codegen/plugin-helpers" "^2.4.0"
- "@graphql-codegen/visitor-plugin-common" "2.7.4"
- "@graphql-tools/utils" "8.6.3"
+ "@graphql-codegen/visitor-plugin-common" "2.7.5"
+ "@graphql-tools/utils" "8.6.9"
change-case-all "1.0.14"
parse-filepath "^1.0.2"
- tslib "~2.3.0"
+ tslib "~2.4.0"
"@graphql-codegen/plugin-helpers@^2.3.2", "@graphql-codegen/plugin-helpers@^2.4.0", "@graphql-codegen/plugin-helpers@^2.4.1":
version "2.4.2"
@@ -2352,32 +2274,32 @@
tslib "~2.3.0"
"@graphql-codegen/typescript-resolvers@^2.4.3":
- version "2.6.1"
- resolved "https://registry.npmjs.org/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-2.6.1.tgz#5963da60de79cfb847b55b2433cd9f65a33d7aad"
- integrity sha512-tb8qiIYRDbypHvEVBi04OlItABPeormhd6gh26Q0FO/dD+tLx1V85A6wnHC4jExWPP9+/3PwHJL1pq/0n1kxlA==
+ version "2.6.2"
+ resolved "https://registry.npmjs.org/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-2.6.2.tgz#0cf0d5e25837440e8f1d41b92bf8495e32f65974"
+ integrity sha512-X2F/AyC7ZVNuTJPpM9VyItUNX0KeYQuYkmfunOXJ1WhIWKNd8SlnmSTaEd3xbrhfIXpKyFI43Qe/BjcDdfTdUw==
dependencies:
"@graphql-codegen/plugin-helpers" "^2.4.0"
- "@graphql-codegen/typescript" "^2.4.8"
- "@graphql-codegen/visitor-plugin-common" "2.7.4"
+ "@graphql-codegen/typescript" "^2.4.9"
+ "@graphql-codegen/visitor-plugin-common" "2.7.5"
"@graphql-tools/utils" "^8.1.1"
auto-bind "~4.0.0"
- tslib "~2.3.0"
+ tslib "~2.4.0"
-"@graphql-codegen/typescript@^2.4.2", "@graphql-codegen/typescript@^2.4.8":
- version "2.4.8"
- resolved "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.4.8.tgz#e8110baba9713cde72d57a5c95aa27400363ed9a"
- integrity sha512-tVsHIkuyenBany7c5IMU1yi4S1er2hgyXJGNY7PcyhpJMx0eChmbqz1VTiZxDEwi8mDBS2mn3TaSJMh6xuJM5g==
+"@graphql-codegen/typescript@^2.4.2", "@graphql-codegen/typescript@^2.4.9":
+ version "2.4.9"
+ resolved "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.4.9.tgz#ab3eeaa5773cf78df7ddc2ffbb0447ee2920728c"
+ integrity sha512-7l2qw3j8aC9CAW/Tm4x1kkIpDt34xqv8zTwRpmVaVwooZd6usvydkaEwJUMId8Aj0F1SDIzAlYNiG523SRu+Ng==
dependencies:
"@graphql-codegen/plugin-helpers" "^2.4.0"
"@graphql-codegen/schema-ast" "^2.4.1"
- "@graphql-codegen/visitor-plugin-common" "2.7.4"
+ "@graphql-codegen/visitor-plugin-common" "2.7.5"
auto-bind "~4.0.0"
- tslib "~2.3.0"
+ tslib "~2.4.0"
-"@graphql-codegen/visitor-plugin-common@2.7.4":
- version "2.7.4"
- resolved "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.7.4.tgz#fbc8aec9df0035b8f29fa64a6356cbb02062da5d"
- integrity sha512-aaDoEudDD+B7DK/UwDSL2Fzej75N9hNJ3N8FQuTIeDyw6FNGWUxmkjVBLQGlzfnYfK8IYkdfYkrPn3Skq0pVxA==
+"@graphql-codegen/visitor-plugin-common@2.7.5":
+ version "2.7.5"
+ resolved "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.7.5.tgz#930fea2c084042b604bead6665b7a0d1542c445b"
+ integrity sha512-k4adLokuudmhEO4l8PncoQdQl20BpwAOdSWzuYEjezb7KJvYgImkNCk0GghyRSg0rHh+0yFN4CjtpBR4nZX7Aw==
dependencies:
"@graphql-codegen/plugin-helpers" "^2.4.0"
"@graphql-tools/optimize" "^1.0.1"
@@ -2388,7 +2310,7 @@
dependency-graph "^0.11.0"
graphql-tag "^2.11.0"
parse-filepath "^1.0.2"
- tslib "~2.3.0"
+ tslib "~2.4.0"
"@graphql-tools/apollo-engine-loader@^7.0.5":
version "7.2.11"
@@ -2410,16 +2332,6 @@
tslib "~2.3.0"
value-or-promise "1.0.11"
-"@graphql-tools/batch-execute@^7.1.2":
- version "7.1.2"
- resolved "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-7.1.2.tgz#35ba09a1e0f80f34f1ce111d23c40f039d4403a0"
- integrity sha512-IuR2SB2MnC2ztA/XeTMTfWcA0Wy7ZH5u+nDkDNLAdX+AaSyDnsQS35sCmHqG0VOGTl7rzoyBWLCKGwSJplgtwg==
- dependencies:
- "@graphql-tools/utils" "^7.7.0"
- dataloader "2.0.0"
- tslib "~2.2.0"
- value-or-promise "1.0.6"
-
"@graphql-tools/code-file-loader@^7.0.6":
version "7.2.14"
resolved "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-7.2.14.tgz#b43ce0c682040b3969f1f785b18fc33c79341084"
@@ -2444,19 +2356,6 @@
tslib "~2.3.0"
value-or-promise "1.0.11"
-"@graphql-tools/delegate@^7.0.1", "@graphql-tools/delegate@^7.1.5":
- version "7.1.5"
- resolved "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-7.1.5.tgz#0b027819b7047eff29bacbd5032e34a3d64bd093"
- integrity sha512-bQu+hDd37e+FZ0CQGEEczmRSfQRnnXeUxI/0miDV+NV/zCbEdIJj5tYFNrKT03W6wgdqx8U06d8L23LxvGri/g==
- dependencies:
- "@ardatan/aggregate-error" "0.0.6"
- "@graphql-tools/batch-execute" "^7.1.2"
- "@graphql-tools/schema" "^7.1.5"
- "@graphql-tools/utils" "^7.7.1"
- dataloader "2.0.0"
- tslib "~2.2.0"
- value-or-promise "1.0.6"
-
"@graphql-tools/git-loader@^7.0.5":
version "7.1.13"
resolved "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-7.1.13.tgz#95f4715f4caf290dde975813bc87e0a96a81095d"
@@ -2480,15 +2379,6 @@
sync-fetch "0.3.1"
tslib "~2.3.0"
-"@graphql-tools/graphql-file-loader@^6.0.0":
- version "6.2.7"
- resolved "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-6.2.7.tgz#d3720f2c4f4bb90eb2a03a7869a780c61945e143"
- integrity sha512-5k2SNz0W87tDcymhEMZMkd6/vs6QawDyjQXWtqkuLTBF3vxjxPD1I4dwHoxgWPIjjANhXybvulD7E+St/7s9TQ==
- dependencies:
- "@graphql-tools/import" "^6.2.6"
- "@graphql-tools/utils" "^7.0.0"
- tslib "~2.1.0"
-
"@graphql-tools/graphql-file-loader@^7.0.5", "@graphql-tools/graphql-file-loader@^7.3.2":
version "7.3.11"
resolved "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.3.11.tgz#3acc3fffdba5e1d47750ea693577c2388e6cf22b"
@@ -2511,7 +2401,7 @@
"@graphql-tools/utils" "8.6.9"
tslib "~2.3.0"
-"@graphql-tools/import@6.6.13", "@graphql-tools/import@^6.2.6":
+"@graphql-tools/import@6.6.13":
version "6.6.13"
resolved "https://registry.npmjs.org/@graphql-tools/import/-/import-6.6.13.tgz#5561204a16ce3d1308aa96fb5e54cd1e550c748c"
integrity sha512-yqdCem+ZZFVAaIC2IxWyAXSEHLNPIuMzm4avTQe/LbYNRFRTpzyIYo3clc22ixeuh2LqSL3tLXKq2IsggCAeQw==
@@ -2520,14 +2410,6 @@
resolve-from "5.0.0"
tslib "~2.3.0"
-"@graphql-tools/json-file-loader@^6.0.0":
- version "6.2.6"
- resolved "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-6.2.6.tgz#830482cfd3721a0799cbf2fe5b09959d9332739a"
- integrity sha512-CnfwBSY5926zyb6fkDBHnlTblHnHI4hoBALFYXnrg0Ev4yWU8B04DZl/pBRUc459VNgO2x8/mxGIZj2hPJG1EA==
- dependencies:
- "@graphql-tools/utils" "^7.0.0"
- tslib "~2.0.1"
-
"@graphql-tools/json-file-loader@^7.1.2", "@graphql-tools/json-file-loader@^7.3.2":
version "7.3.11"
resolved "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-7.3.11.tgz#2d4fde06136d97c1b3d3939699976fb11260a22c"
@@ -2538,21 +2420,6 @@
tslib "~2.3.0"
unixify "^1.0.0"
-"@graphql-tools/load@^6.0.0":
- version "6.2.8"
- resolved "https://registry.npmjs.org/@graphql-tools/load/-/load-6.2.8.tgz#16900fb6e75e1d075cad8f7ea439b334feb0b96a"
- integrity sha512-JpbyXOXd8fJXdBh2ta0Q4w8ia6uK5FHzrTNmcvYBvflFuWly2LDTk2abbSl81zKkzswQMEd2UIYghXELRg8eTA==
- dependencies:
- "@graphql-tools/merge" "^6.2.12"
- "@graphql-tools/utils" "^7.5.0"
- globby "11.0.3"
- import-from "3.0.0"
- is-glob "4.0.1"
- p-limit "3.1.0"
- tslib "~2.2.0"
- unixify "1.0.0"
- valid-url "1.0.9"
-
"@graphql-tools/load@^7.3.0", "@graphql-tools/load@^7.4.1":
version "7.5.10"
resolved "https://registry.npmjs.org/@graphql-tools/load/-/load-7.5.10.tgz#6e53dd62ec081b3a2966ab9d93e8b991f06501b3"
@@ -2571,15 +2438,6 @@
"@graphql-tools/utils" "8.6.9"
tslib "~2.3.0"
-"@graphql-tools/merge@^6.0.0", "@graphql-tools/merge@^6.2.12":
- version "6.2.17"
- resolved "https://registry.npmjs.org/@graphql-tools/merge/-/merge-6.2.17.tgz#4dedf87d8435a5e1091d7cc8d4f371ed1e029f1f"
- integrity sha512-G5YrOew39fZf16VIrc49q3c8dBqQDD0ax5LYPiNja00xsXDi0T9zsEWVt06ApjtSdSF6HDddlu5S12QjeN8Tow==
- dependencies:
- "@graphql-tools/schema" "^8.0.2"
- "@graphql-tools/utils" "8.0.2"
- tslib "~2.3.0"
-
"@graphql-tools/mock@^8.1.2":
version "8.6.8"
resolved "https://registry.npmjs.org/@graphql-tools/mock/-/mock-8.6.8.tgz#232a23c0c14dcfca88012886230b93e6fc2303e2"
@@ -2632,7 +2490,7 @@
relay-compiler "12.0.0"
tslib "~2.3.0"
-"@graphql-tools/schema@8.3.10", "@graphql-tools/schema@^8.0.0", "@graphql-tools/schema@^8.0.2", "@graphql-tools/schema@^8.1.1", "@graphql-tools/schema@^8.1.2", "@graphql-tools/schema@^8.3.1":
+"@graphql-tools/schema@8.3.10", "@graphql-tools/schema@^8.0.0", "@graphql-tools/schema@^8.1.1", "@graphql-tools/schema@^8.1.2", "@graphql-tools/schema@^8.3.1":
version "8.3.10"
resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.3.10.tgz#c3e373e6ad854f533fc7e55859dd8f9e81de30dd"
integrity sha512-tfhjSTi3OzheDrVzG7rkPZg2BbQjmZRLM2vvQoM2b1TnUwgUIbpAgcnf+AWDLRsoCOWlezeLgij1BLeAR0Q0jg==
@@ -2642,15 +2500,6 @@
tslib "~2.3.0"
value-or-promise "1.0.11"
-"@graphql-tools/schema@^7.1.5":
- version "7.1.5"
- resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-7.1.5.tgz#07b24e52b182e736a6b77c829fc48b84d89aa711"
- integrity sha512-uyn3HSNSckf4mvQSq0Q07CPaVZMNFCYEVxroApOaw802m9DcZPgf9XVPy/gda5GWj9AhbijfRYVTZQgHnJ4CXA==
- dependencies:
- "@graphql-tools/utils" "^7.1.2"
- tslib "~2.2.0"
- value-or-promise "1.0.6"
-
"@graphql-tools/url-loader@7.9.14", "@graphql-tools/url-loader@^7.0.11", "@graphql-tools/url-loader@^7.4.2":
version "7.9.14"
resolved "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.9.14.tgz#9f76af9a6c55a0cf2e87ccf9b3be15eeb6af188c"
@@ -2673,45 +2522,6 @@
value-or-promise "^1.0.11"
ws "^8.3.0"
-"@graphql-tools/url-loader@^6.0.0":
- version "6.10.1"
- resolved "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-6.10.1.tgz#dc741e4299e0e7ddf435eba50a1f713b3e763b33"
- integrity sha512-DSDrbhQIv7fheQ60pfDpGD256ixUQIR6Hhf9Z5bRjVkXOCvO5XrkwoWLiU7iHL81GB1r0Ba31bf+sl+D4nyyfw==
- dependencies:
- "@graphql-tools/delegate" "^7.0.1"
- "@graphql-tools/utils" "^7.9.0"
- "@graphql-tools/wrap" "^7.0.4"
- "@microsoft/fetch-event-source" "2.0.1"
- "@types/websocket" "1.0.2"
- abort-controller "3.0.0"
- cross-fetch "3.1.4"
- extract-files "9.0.0"
- form-data "4.0.0"
- graphql-ws "^4.4.1"
- is-promise "4.0.0"
- isomorphic-ws "4.0.1"
- lodash "4.17.21"
- meros "1.1.4"
- subscriptions-transport-ws "^0.9.18"
- sync-fetch "0.3.0"
- tslib "~2.2.0"
- valid-url "1.0.9"
- ws "7.4.5"
-
-"@graphql-tools/utils@8.0.2":
- version "8.0.2"
- resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.0.2.tgz#795a8383cdfdc89855707d62491c576f439f3c51"
- integrity sha512-gzkavMOgbhnwkHJYg32Adv6f+LxjbQmmbdD5Hty0+CWxvaiuJq+nU6tzb/7VSU4cwhbNLx/lGu2jbCPEW1McZQ==
- dependencies:
- tslib "~2.3.0"
-
-"@graphql-tools/utils@8.6.3":
- version "8.6.3"
- resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.6.3.tgz#ce9fc9adce4d45b229e314a2261290a88a252aed"
- integrity sha512-CNyP7Uu7dlVMQ32IpHWOxz4yic9BYXXVkDhG0UdTKSszvzHdgMilemE9MpUrGzzBPsTe3aYTtNGyPUkyh9yTXA==
- dependencies:
- tslib "~2.3.0"
-
"@graphql-tools/utils@8.6.9", "@graphql-tools/utils@^8.1.1", "@graphql-tools/utils@^8.3.0", "@graphql-tools/utils@^8.5.1", "@graphql-tools/utils@^8.5.2", "@graphql-tools/utils@^8.6.0":
version "8.6.9"
resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.6.9.tgz#fe1b81df29c9418b41b7a1ffe731710b93d3a1fe"
@@ -2719,15 +2529,6 @@
dependencies:
tslib "~2.3.0"
-"@graphql-tools/utils@^7.0.0", "@graphql-tools/utils@^7.1.2", "@graphql-tools/utils@^7.5.0", "@graphql-tools/utils@^7.7.0", "@graphql-tools/utils@^7.7.1", "@graphql-tools/utils@^7.8.1", "@graphql-tools/utils@^7.9.0":
- version "7.10.0"
- resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz#07a4cb5d1bec1ff1dc1d47a935919ee6abd38699"
- integrity sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==
- dependencies:
- "@ardatan/aggregate-error" "0.0.6"
- camel-case "4.1.2"
- tslib "~2.2.0"
-
"@graphql-tools/wrap@8.4.16", "@graphql-tools/wrap@^8.3.1":
version "8.4.16"
resolved "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-8.4.16.tgz#87dce9ec623a921e5a62f44e75abc9655892724b"
@@ -2739,17 +2540,6 @@
tslib "~2.3.0"
value-or-promise "1.0.11"
-"@graphql-tools/wrap@^7.0.4":
- version "7.0.8"
- resolved "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-7.0.8.tgz#ad41e487135ca3ea1ae0ea04bb3f596177fb4f50"
- integrity sha512-1NDUymworsOlb53Qfh7fonDi2STvqCtbeE68ntKY9K/Ju/be2ZNxrFSbrBHwnxWcN9PjISNnLcAyJ1L5tCUyhg==
- dependencies:
- "@graphql-tools/delegate" "^7.1.5"
- "@graphql-tools/schema" "^7.1.5"
- "@graphql-tools/utils" "^7.8.1"
- tslib "~2.2.0"
- value-or-promise "1.0.6"
-
"@graphql-typed-document-node/core@^3.1.0", "@graphql-typed-document-node/core@^3.1.1":
version "3.1.1"
resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052"
@@ -2866,6 +2656,11 @@
resolved "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c"
integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==
+"@ioredis/commands@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@ioredis/commands/-/commands-1.1.1.tgz#2ba4299ea624a6bfac15b35f6df90b0015691ec3"
+ integrity sha512-fsR4P/ROllzf/7lXYyElUJCheWdTJVJvOTps8v9IWKFATxR61ANOlnoPqhH099xYLrJGpc2ZQ28B3rMeUt5VQg==
+
"@isaacs/string-locale-compare@^1.1.0":
version "1.1.0"
resolved "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b"
@@ -3431,11 +3226,11 @@
integrity sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==
"@keyv/redis@^2.2.3":
- version "2.2.3"
- resolved "https://registry.npmjs.org/@keyv/redis/-/redis-2.2.3.tgz#af5b1ea32d847a63ce24012844af7323b3c421a7"
- integrity sha512-d9Maf1LzT6Ti5hWsVzaWFriFmXrscK1eUl/etNquQgAJxH7Drecbn+uNZXMc6xb78Ju9szy0fD9RAp/G9RzAdg==
+ version "2.3.4"
+ resolved "https://registry.npmjs.org/@keyv/redis/-/redis-2.3.4.tgz#441b7fd1e27d2c361ae0180afd9182a45ac6ee68"
+ integrity sha512-9DqSKV2v5nEcEJa6WajOiWw4GX1rE07Z2oNWaE4XjfPHWLvG46+uOlF0b3Xa5WBaExkWVc7bo5pLAOSK7lAaew==
dependencies:
- ioredis "^4.28.5"
+ ioredis "^5.0.3"
"@kubernetes/client-node@^0.16.0":
version "0.16.3"
@@ -4141,17 +3936,24 @@
npmlog "^4.1.2"
write-file-atomic "^3.0.3"
-"@lezer/common@^0.15.0", "@lezer/common@^0.15.5":
- version "0.15.10"
- resolved "https://registry.npmjs.org/@lezer/common/-/common-0.15.10.tgz#662da668f46244fb20bfaada67b43b3d0463b344"
- integrity sha512-vlr+be73zTDoQBIknBVOh/633tmbQcjxUu9PIeVeYESeBK3V6TuBW96RRFg93Y2cyK9lglz241gOgSn452HFvA==
+"@lezer/common@^0.16.0":
+ version "0.16.0"
+ resolved "https://registry.npmjs.org/@lezer/common/-/common-0.16.0.tgz#b6023a0a682b0b7676d0e7f0e0838f71bde39fcd"
+ integrity sha512-H6sPCku+asKWYaNjwfQ1Uvcay9UP1Pdzu4qpy8GtRZ0cKT2AAGnj9MQGiRtY18MDntvhYRJxNGv7FNWOSV/e8A==
-"@lezer/lr@^0.15.0":
- version "0.15.5"
- resolved "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.5.tgz#4bce44169c441d9dda7be398f5202ea65c5f1138"
- integrity sha512-DEcLyhdmBxD1foQe7RegLrSlfS/XaTMGLkO5evkzHWAQKh/JnFWp7j7iNB7s2EpxzRrBCh0U+W7JDCeFhv2mng==
+"@lezer/highlight@^0.16.0":
+ version "0.16.0"
+ resolved "https://registry.npmjs.org/@lezer/highlight/-/highlight-0.16.0.tgz#95f7b7ee3c32c8a0f6ce499c085e8b1f927ffbdc"
+ integrity sha512-iE5f4flHlJ1g1clOStvXNLbORJoiW4Kytso6ubfYzHnaNo/eo5SKhxs4wv/rtvwZQeZrK3we8S9SyA7OGOoRKQ==
dependencies:
- "@lezer/common" "^0.15.0"
+ "@lezer/common" "^0.16.0"
+
+"@lezer/lr@^0.16.0":
+ version "0.16.1"
+ resolved "https://registry.npmjs.org/@lezer/lr/-/lr-0.16.1.tgz#abe8c538d3f1a811ce5731847e3d0470c7709dcd"
+ integrity sha512-RuRD84dWY9If8BanfaaWNe0YhRdYWtni92GpB4C4/7JgHyAIfdkJz7miBjgILm3gOsBjJsJh56vb1ckxSQEWBg==
+ dependencies:
+ "@lezer/common" "^0.16.0"
"@manypkg/find-root@^1.1.0":
version "1.1.0"
@@ -4329,61 +4131,56 @@
react-is "^16.8.0 || ^17.0.0"
"@maxim_mazurok/gapi.client.calendar@^3.0.20220408":
- version "3.0.20220408"
- resolved "https://registry.npmjs.org/@maxim_mazurok/gapi.client.calendar/-/gapi.client.calendar-3.0.20220408.tgz#f6c4c91a1785bc0484a9c0b14fd079215d9ed80f"
- integrity sha512-G0PF3QE2wWTDIDTpCQFmwkZSxuHtJQyMlRzK2Li5ZYdZ+sL2wm16iRaa3C8wx6nUStN5kY7nHSAPJ4jeN4npGw==
+ version "3.0.20220429"
+ resolved "https://registry.npmjs.org/@maxim_mazurok/gapi.client.calendar/-/gapi.client.calendar-3.0.20220429.tgz#ccd5116bd5222a586782e83c4f1370179c600a2b"
+ integrity sha512-vzjnM+bRo2Heq8BuaWEQUxnB+yi7KmCqs6YfgZITp/84r3IKRLQuu5vAiaHu37kOYKKswRVJ+K5vBU6B742jag==
dependencies:
"@types/gapi.client" "*"
-"@microsoft/api-documenter@^7.17.5":
- version "7.17.9"
- resolved "https://registry.npmjs.org/@microsoft/api-documenter/-/api-documenter-7.17.9.tgz#d3d4f8a5872c80d542f64195f096f92da92c74ab"
- integrity sha512-crmuhaqKG0zfeoCjIjvRfUzUe/JZaMGE3HS7FwtH7jROy/AHU8nL2Zpq8RzFRNKV9yHMiF8wVcEgfGmH5oM3hw==
+"@microsoft/api-documenter@^7.17.11":
+ version "7.17.11"
+ resolved "https://registry.npmjs.org/@microsoft/api-documenter/-/api-documenter-7.17.11.tgz#7f1b50e610e45f581ff4344c73b184d822e6bc11"
+ integrity sha512-VdCu4eG5RISGEiG/hFO3jaN3gEgMZVXZRFpch/PQzrLO3Vh2QhZTz2LsZ2SYyb7UwBZCK9Z76ULv5cGoflylNA==
dependencies:
- "@microsoft/api-extractor-model" "7.17.1"
+ "@microsoft/api-extractor-model" "7.17.2"
"@microsoft/tsdoc" "0.14.1"
- "@rushstack/node-core-library" "3.45.3"
- "@rushstack/ts-command-line" "4.10.9"
+ "@rushstack/node-core-library" "3.45.4"
+ "@rushstack/ts-command-line" "4.10.10"
colors "~1.2.1"
js-yaml "~3.13.1"
resolve "~1.17.0"
-"@microsoft/api-extractor-model@7.17.1", "@microsoft/api-extractor-model@^7.16.1":
- version "7.17.1"
- resolved "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.17.1.tgz#2a6b7d8eec510ba1c7713c682d2a0c730074b29c"
- integrity sha512-DCDtD8TdEpNk2lW4JvXgwwpxKy70P0JLad55iahwO8A+C63KYsrHIpAzo0FUauh5pwJ0v5QVNIJ+OBgKGteemg==
+"@microsoft/api-extractor-model@7.17.2", "@microsoft/api-extractor-model@^7.17.2":
+ version "7.17.2"
+ resolved "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.17.2.tgz#033b39a7bac4f3eee3e5ffd406d2af61cedc727e"
+ integrity sha512-fYfCeBeLm7jnZligC64qHiH4/vzswFLDfyPpX+uKO36OI2kIeMHrYG0zaezmuinKvE4vg1dAz38zZeDbPvBKGg==
dependencies:
"@microsoft/tsdoc" "0.14.1"
"@microsoft/tsdoc-config" "~0.16.1"
- "@rushstack/node-core-library" "3.45.3"
+ "@rushstack/node-core-library" "3.45.4"
-"@microsoft/api-extractor@^7.21.2":
- version "7.22.2"
- resolved "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.22.2.tgz#8957b5ec81ff8a76b9a8a0e6a1bac70eb9a1a974"
- integrity sha512-G7vXz6UHz+qoaUGPf2k5Md4bSpHii9nFys3sIe3bmFUbmhAe+HfSB/dCn1PsLhW7tZfEXwMHTj7fbL5vcZkrEw==
+"@microsoft/api-extractor@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.23.0.tgz#8bd5a197e04b0ba92fb85e0f53b4d7cadd0a95b2"
+ integrity sha512-fbdX05RVE1EMA7nvyRHuS9nx1pryhjgURDx6pQlE/9yOXQ5PO7MpYdfWGaRsQwyYuU3+tPxgro819c0R3AK6KA==
dependencies:
- "@microsoft/api-extractor-model" "7.17.1"
+ "@microsoft/api-extractor-model" "7.17.2"
"@microsoft/tsdoc" "0.14.1"
"@microsoft/tsdoc-config" "~0.16.1"
- "@rushstack/node-core-library" "3.45.3"
- "@rushstack/rig-package" "0.3.10"
- "@rushstack/ts-command-line" "4.10.9"
+ "@rushstack/node-core-library" "3.45.4"
+ "@rushstack/rig-package" "0.3.11"
+ "@rushstack/ts-command-line" "4.10.10"
colors "~1.2.1"
lodash "~4.17.15"
resolve "~1.17.0"
semver "~7.3.0"
source-map "~0.6.1"
- typescript "~4.5.2"
-
-"@microsoft/fetch-event-source@2.0.1":
- version "2.0.1"
- resolved "https://registry.npmjs.org/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz#9ceecc94b49fbaa15666e38ae8587f64acce007d"
- integrity sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==
+ typescript "~4.6.3"
"@microsoft/microsoft-graph-types@^2.6.0":
- version "2.19.0"
- resolved "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.19.0.tgz#df95ab3b59308221a6063fc11a9235d6558e890e"
- integrity sha512-TvSbalr8bpNN74dqXQQkpfoMCtEyaMECqi6Yk1WcOCYLL7k7z7ABErafFXH9uBmqSIXYchKSyR4IJNh9Sd4BYA==
+ version "2.20.0"
+ resolved "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.20.0.tgz#fc532a5dc146c0b8a6f78a633fe930535f8cdc42"
+ integrity sha512-T1EPoYdH4124Rg+h261dvW2qAeSRAotHM/6lv10fDsYX4DWsppvresmfhGbPrLApK/lRTRj93bn4/Nwwmdv4Zg==
"@microsoft/tsdoc-config@~0.16.1":
version "0.16.1"
@@ -4944,19 +4741,19 @@
resolved "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-2.0.0.tgz#1108b9ea661ca6c81e4a8bfa63a09eb27d5bc2db"
integrity sha512-35cfQ4YWlnZnmZKmIxlGPUPLtbkF8lr/A/1Sk1eC0ddLMwQN06dOuLc+dI3YLQS+T+MoNt3DIQ0NynwgKPilig==
-"@octokit/webhooks-types@5.5.1":
- version "5.5.1"
- resolved "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-5.5.1.tgz#3ab94e890bee827302c6312e80497426d6627cbf"
- integrity sha512-FaBbqZS2e4fCdQvUqeBKpJJOVsRxGcrf0NA91WBXz9GP5/4xgQgdjpbzAcDOSfESBYDYD78HeI5VeihfCW28Ew==
+"@octokit/webhooks-types@5.6.0":
+ version "5.6.0"
+ resolved "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-5.6.0.tgz#cbc908ef0df997de7f65da4e4003ecb8430410d3"
+ integrity sha512-y3MqE6N6Ksg1+YV0sXVpW2WP7Y24h7rUp2hDJuzoqWdKGr7owmRDyHC72INwfCYNzura/vsNPXvc6Xbfp4wGGw==
"@octokit/webhooks@^9.0.1", "@octokit/webhooks@^9.14.1":
- version "9.23.0"
- resolved "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-9.23.0.tgz#16fc24284afdf3e119d32928dd3f8b338890e56c"
- integrity sha512-4+imw+CajrKpafaE9oLCtXyU3ZAcCLwuoeZ3XmFruQZCEcBBJYE/juSFvU3x1HkFFeKwsUyr+nRikRwiK/VSmA==
+ version "9.24.0"
+ resolved "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-9.24.0.tgz#3e3b194ee67151f674e8d0d565c8179828a12b3d"
+ integrity sha512-s1nqplA+j4sP7Cz40jn/Q2ipkKRKJ7Gi+NzZiSnwNfisYNduLHEwMUJVBEKc5I0r6GMcZZRJOe6PJ2rJXYW66g==
dependencies:
"@octokit/request-error" "^2.0.2"
"@octokit/webhooks-methods" "^2.0.0"
- "@octokit/webhooks-types" "5.5.1"
+ "@octokit/webhooks-types" "5.6.0"
aggregate-error "^3.1.0"
"@open-draft/until@^1.0.3":
@@ -5041,9 +4838,9 @@
integrity sha512-6k/pU2jNlgYvKOy84vpCAZ8MGVwybvAdjzrh4UicCVOCPxz0LSBws1OE6O5TO4sPHaSw+yLfNzNK8RicGFc1Kw==
"@react-hookz/web@^13.0.0":
- version "13.2.1"
- resolved "https://registry.npmjs.org/@react-hookz/web/-/web-13.2.1.tgz#12b3bc30d2cced8b75690c6c3708f96cfdf58172"
- integrity sha512-ckHdvZ5rgblBscvHdPWAASH46FvfOGjnC+TG3ZtzkOEaYxFtXAzxgQyjjPS+veLuVEGLZ/9HdU6A2l24QBp+9w==
+ version "13.3.0"
+ resolved "https://registry.npmjs.org/@react-hookz/web/-/web-13.3.0.tgz#257e31049e92a121912fe1e67bdd01dbec5a203b"
+ integrity sha512-KswgkmqBVVDo6UnBFfssrojmDisogxC4jGZmd976R8YHoS3zdQJxjqICpOBSRohbRyYhYS9Cprw7BuV/CZcMaw==
dependencies:
"@react-hookz/deep-equal" "^1.0.1"
@@ -5073,9 +4870,9 @@
integrity sha512-8UiDeDbjCImFSfOegGu13otQ7OdP9FOYpcLjeouppnhs+MPeIEAtYS+jCcBKmi3reyTagC15/KVSRhde1wS1vg==
"@roadiehq/backstage-plugin-buildkite@^2.0.0":
- version "2.0.0"
- resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-buildkite/-/backstage-plugin-buildkite-2.0.0.tgz#e5da049a2e15c533228e26da1af537b3783fe5de"
- integrity sha512-qurSWt+n505BXFBTzoTSXn9BPmhtLjt+SPiVYjD3KSqJ7hwOoJg3rr1wuCWigUDj1R0Kx9TgaxNscETGBzUUgQ==
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-buildkite/-/backstage-plugin-buildkite-2.0.1.tgz#a17cf1e827b7b27f6c4f36bb5959004cac40712c"
+ integrity sha512-Dd38wPv4N3GHDNxu6XsJm7jfIHru0avE2lwmIlZsKn9+Ad+CbeTdjkYjObctIynzjhrETJrNpmZath57yCVe1A==
dependencies:
"@backstage/catalog-model" "^1.0.0"
"@backstage/core-components" "^0.9.0"
@@ -5092,9 +4889,9 @@
react-use "^17.2.4"
"@roadiehq/backstage-plugin-github-insights@^2.0.0":
- version "2.0.0"
- resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-github-insights/-/backstage-plugin-github-insights-2.0.0.tgz#1137f4f3ad5744559bf095ee868371f5fd8c60ec"
- integrity sha512-6rLMWq8F6hYNAkuF+gOKyAZ/A2MGVHuNJArBJCUVhw6b/tmSxQcj78y62GaXB1Zz9KERhSk8OZf94m0+EE8C5g==
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-github-insights/-/backstage-plugin-github-insights-2.0.1.tgz#b0cccdd5cfe1c94055ad372087a1daba9ec72bb4"
+ integrity sha512-Kq3JdzSIpLV0Ka6GqX7Ok2QW/s6w18l0Kyec+OtQ+/1dz8AeG7UoYwUtBI/+sTd+gveTHAonwi9xINYbcIvQhQ==
dependencies:
"@backstage/catalog-model" "^1.0.0"
"@backstage/core-components" "^0.9.0"
@@ -5116,9 +4913,9 @@
zustand "3.6.9"
"@roadiehq/backstage-plugin-github-pull-requests@^2.0.0":
- version "2.1.0"
- resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-github-pull-requests/-/backstage-plugin-github-pull-requests-2.1.0.tgz#a241a8c00816a2fc840c4a94b1946915e96cadda"
- integrity sha512-fkP6flVV8qAsuybnANS2viOtyaV+zsq0+ek/lbXD54vtLbKl3tPryinNKS6BRBP6lTrU3Ec34et1kGEudUaIbg==
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-github-pull-requests/-/backstage-plugin-github-pull-requests-2.1.1.tgz#90bc2e82c47ddf5fe40063ddcfff9efdb464f046"
+ integrity sha512-/855fB7F0Ss4h7iTayBu/SVbWLM5iw3401ER5uWf1IoSpXorJECEW0lfzroJtWMGse6LfNfbuWqTKnp2vTSosg==
dependencies:
"@backstage/catalog-model" "^1.0.0"
"@backstage/core-components" "^0.9.0"
@@ -5140,9 +4937,9 @@
react-use "^17.2.4"
"@roadiehq/backstage-plugin-travis-ci@^2.0.0":
- version "2.0.0"
- resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-travis-ci/-/backstage-plugin-travis-ci-2.0.0.tgz#d86eba878bbaa6ada77e9eda932ff25bd9121021"
- integrity sha512-nrqWysSLBq4t9jVkQb5rz1pfNt2Ojlj+s0004FSNzPa8PPD+5XUhFZiS9Mi4kJVUC9BLW5SVdJzWtWEGbxyLPw==
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-travis-ci/-/backstage-plugin-travis-ci-2.0.1.tgz#0d706d3a31b123cd2e76b6d7fd849ae8cb97e786"
+ integrity sha512-Qay8Ad+heMEyW5QPi2I4C7ky3NUYhgE7FF+pV77ES21zyytCcTHQIkYHJd0FrR6WpedtNSegfcRj61VSZfbRKA==
dependencies:
"@backstage/catalog-model" "^1.0.0"
"@backstage/core-components" "^0.9.0"
@@ -5181,14 +4978,14 @@
"@rollup/pluginutils" "^3.0.8"
"@rollup/plugin-node-resolve@^13.0.0":
- version "13.2.1"
- resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.2.1.tgz#cdee815cf02c180ff0a42536ca67a8f67e299f84"
- integrity sha512-btX7kzGvp1JwShQI9V6IM841YKNPYjKCvUbNrQ2EcVYbULtUd/GH6wZ/qdqH13j9pOHBER+EZXNN2L8RSJhVRA==
+ version "13.3.0"
+ resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c"
+ integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==
dependencies:
"@rollup/pluginutils" "^3.1.0"
"@types/resolve" "1.17.1"
- builtin-modules "^3.1.0"
deepmerge "^4.2.2"
+ is-builtin-module "^3.1.0"
is-module "^1.0.0"
resolve "^1.19.0"
@@ -5218,10 +5015,10 @@
estree-walker "^2.0.1"
picomatch "^2.2.2"
-"@rushstack/node-core-library@3.45.3":
- version "3.45.3"
- resolved "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.3.tgz#8db2befbbf23969e08d2bc69d5d91ba812c01640"
- integrity sha512-Rn0mxqC3MPb+YbvaeFcRWfcYHLwyZ99/ffYA8chpq5OpqoY+Mr1ycTbMvzl5AxWf1pYmi/2+Eo3iTOsQdYR8xw==
+"@rushstack/node-core-library@3.45.4":
+ version "3.45.4"
+ resolved "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.4.tgz#a5e1246c462940d16a5acc667c1ffe460b514087"
+ integrity sha512-FMoEQWjK7nWAO2uFgV1eVpVhY9ZDGOdIIomi9zTej64cKJ+8/Nvu+ny0xKaUDEjw/ALftN2D2ml7L0RDpW/Z9g==
dependencies:
"@types/node" "12.20.24"
colors "~1.2.1"
@@ -5233,18 +5030,18 @@
timsort "~0.3.0"
z-schema "~5.0.2"
-"@rushstack/rig-package@0.3.10":
- version "0.3.10"
- resolved "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.10.tgz#cf8ba0935c6acc5bb62ef710d6eaec5895bbb3ed"
- integrity sha512-4Z2HhXM4YBWOi4ZYFQNK6Yxz641v+cvc8NKiaNZh+RIdNb3D4Rfpy3XUkggbCozpfDriBfL1+KaXlJtfJfAIXw==
+"@rushstack/rig-package@0.3.11":
+ version "0.3.11"
+ resolved "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.11.tgz#92a05929822610e8b42f2ad330d9ea20afae5165"
+ integrity sha512-uI1/g5oQPtyrT9nStoyX/xgZSLa2b+srRFaDk3r1eqC7zA5th4/bvTGl2QfV3C9NcP+coSqmk5mFJkUfH6i3Lw==
dependencies:
resolve "~1.17.0"
strip-json-comments "~3.1.1"
-"@rushstack/ts-command-line@4.10.9":
- version "4.10.9"
- resolved "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.10.9.tgz#a59958dbbe96ad18af9b93563a517c70014c4230"
- integrity sha512-TE3eZgHNVHOY3p8lp38FoNEJUr0+swPb24sCcYuwlC+MHgMGXyJNM+p7l3TKSBRiY01XShoL2k601oGwL00KlA==
+"@rushstack/ts-command-line@4.10.10":
+ version "4.10.10"
+ resolved "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.10.10.tgz#69da17b03ce57795b67ea2aabf7c976c81816078"
+ integrity sha512-F+MH7InPDXqX40qvvcEsnvPpmg566SBpfFqj2fcCh8RjM6AyOoWlXc8zx7giBD3ZN85NVAEjZAgrcLU0z+R2yg==
dependencies:
"@types/argparse" "1.0.38"
argparse "~1.0.9"
@@ -5292,10 +5089,10 @@
dependencies:
type-detect "4.0.8"
-"@sinonjs/fake-timers@^7.0.4", "@sinonjs/fake-timers@^7.1.0":
- version "7.1.2"
- resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5"
- integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==
+"@sinonjs/fake-timers@>=5", "@sinonjs/fake-timers@^9.1.2":
+ version "9.1.2"
+ resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c"
+ integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==
dependencies:
"@sinonjs/commons" "^1.7.0"
@@ -5306,10 +5103,10 @@
dependencies:
"@sinonjs/commons" "^1.7.0"
-"@sinonjs/samsam@^6.0.2":
- version "6.0.2"
- resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz#a0117d823260f282c04bff5f8704bdc2ac6910bb"
- integrity sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==
+"@sinonjs/samsam@^6.1.1":
+ version "6.1.1"
+ resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz#627f7f4cbdb56e6419fa2c1a3e4751ce4f6a00b1"
+ integrity sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==
dependencies:
"@sinonjs/commons" "^1.6.0"
lodash.get "^4.4.2"
@@ -5341,9 +5138,9 @@
integrity sha512-oVd4hjx2+y0MeUdk1l+ItwVLwlrDlvTlGwXBWMMzPYc7DLyxuxFvDfoHGkAQkrikfAgtdnzxrW6u9a8ywUqdfw==
"@sucrase/jest-plugin@^2.1.1":
- version "2.2.0"
- resolved "https://registry.npmjs.org/@sucrase/jest-plugin/-/jest-plugin-2.2.0.tgz#a176ae754a4e142fd50f9952dc6a8d161a1db951"
- integrity sha512-eBWmp771YXm0wIftlse4siG98J3HRnZBojhSrvPGYgj+R9Kbf1QeJGMr6iNC0e/0qlKkw01Ig3H8KjPVwUqiGQ==
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/@sucrase/jest-plugin/-/jest-plugin-2.2.1.tgz#659d31f34412fc9c50e6e0622298baaf27b75366"
+ integrity sha512-5fG+kHOlfwPNi82MCvTFQdAg50YQymGbdwH9nzTA9D9FhJVHynTjadXi58gb/Ae17RMvinY0+Fglx33MB056Rg==
dependencies:
sucrase "^3.18.0"
@@ -5610,7 +5407,7 @@
dependencies:
ansi-regex "*"
-"@types/archiver@^5.1.0", "@types/archiver@^5.1.1":
+"@types/archiver@^5.1.0", "@types/archiver@^5.3.1":
version "5.3.1"
resolved "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.1.tgz#02991e940a03dd1a32678fead4b4ca03d0e387ca"
integrity sha512-wKYZaSXaDvTZuInAWjCeGG7BEAgTWG2zZW0/f7IYFcoHB2X2d9lkVFnrOlXl3W6NrvO6Ml3FLLu8Uksyymcpnw==
@@ -5633,9 +5430,9 @@
integrity sha512-dB14TltT1SNq73z3MaZfKyyBZ37NAgAFl8jze59bisR4fJ6pB6AYGxItHFkooZbN7UcVJX/cFudM4p8wp1W4rA==
"@types/aws4@^1.5.1":
- version "1.11.1"
- resolved "https://registry.npmjs.org/@types/aws4/-/aws4-1.11.1.tgz#1783c88bd2a2fd0ad5ed497668a6d0df8d5f3c43"
- integrity sha512-yUnPMlHP5JMZJiiNZElJG5qj1ShezlaET6Bug9SBhYsxKVamh7aOwl7Q/XR1Y//cZ5PoeRb9j4hi9svb2+FLlg==
+ version "1.11.2"
+ resolved "https://registry.npmjs.org/@types/aws4/-/aws4-1.11.2.tgz#7700aabe4646f8868b5d2b20820d9583225e7b78"
+ integrity sha512-x0f96eBPrCCJzJxdPbUvDFRva4yPpINJzTuXXpmS2j9qLUpF2nyGzvXPlRziuGbCsPukwY4JfuO+8xwsoZLzGw==
dependencies:
"@types/node" "*"
@@ -5725,10 +5522,10 @@
dependencies:
classnames "*"
-"@types/codemirror@^0.0.108":
- version "0.0.108"
- resolved "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz#e640422b666bf49251b384c390cdeb2362585bde"
- integrity sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==
+"@types/codemirror@^0.0.109":
+ version "0.0.109"
+ resolved "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.109.tgz#89d575ff1c7b462c4c3b8654f8bb38e5622e9036"
+ integrity sha512-cSdiHeeLjvGn649lRTNeYrVCDOgDrtP+bDDSFDd1TF+i0jKGPDRozno2NOJ9lTniso+taiv4kiVS8dgM8Jm5lg==
dependencies:
"@types/tern" "*"
@@ -5793,9 +5590,9 @@
"@types/node" "*"
"@types/cookie-parser@^1.4.2":
- version "1.4.2"
- resolved "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.2.tgz#e4d5c5ffda82b80672a88a4281aaceefb1bd9df5"
- integrity sha512-uwcY8m6SDQqciHsqcKDGbo10GdasYsPCYkH3hVegj9qAah6pX5HivOnOuI3WYmyQMnOATV39zv/Ybs0bC/6iVg==
+ version "1.4.3"
+ resolved "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.3.tgz#3a01df117c5705cf89a84c876b50c5a1fd427a21"
+ integrity sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w==
dependencies:
"@types/express" "*"
@@ -5838,9 +5635,9 @@
integrity sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w==
"@types/d3-force@^2.1.1":
- version "2.1.1"
- resolved "https://registry.npmjs.org/@types/d3-force/-/d3-force-2.1.1.tgz#a18b6f029d056eb0f8f84a09471e6228e4469b14"
- integrity sha512-3r+CQv2K/uDTAVg0DGxsbBjV02vgOxb8RhPIv3gd6cp3pdPAZ7wEXpDjUZSoqycAQLSDOxG/AZ54Vx6YXZSbmQ==
+ version "2.1.4"
+ resolved "https://registry.npmjs.org/@types/d3-force/-/d3-force-2.1.4.tgz#98919b87db8a0ca5011d189c598d69251d20344d"
+ integrity sha512-1XVRc2QbeUSL1FRVE53Irdz7jY+drTwESHIMVirCwkAAMB/yVC8ezAfx/1Alq0t0uOnphoyhRle1ht5CuPgSJQ==
"@types/d3-interpolate@*":
version "3.0.1"
@@ -5942,7 +5739,7 @@
"@types/node" "*"
"@types/ssh2" "*"
-"@types/dockerode@^3.2.7", "@types/dockerode@^3.3.0":
+"@types/dockerode@^3.3.0", "@types/dockerode@^3.3.8":
version "3.3.8"
resolved "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.8.tgz#afb844b8e8cf54160e1686832903a1444912ff79"
integrity sha512-/Hip29GzPBWfbSS87lyQDVoB7Ja+kr8oOFWXsySxNFa7jlyj3Yws8LaZRmn1xZl7uJH3Xxsg0oI09GHpT1pIBw==
@@ -6053,14 +5850,14 @@
"@types/node" "*"
"@types/google-protobuf@^3.7.2":
- version "3.15.5"
- resolved "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.5.tgz#644b2be0f5613b1f822c70c73c6b0e0b5b5fa2ad"
- integrity sha512-6bgv24B+A2bo9AfzReeg5StdiijKzwwnRflA8RLd1V4Yv995LeTmo0z69/MPbBDFSiZWdZHQygLo/ccXhMEDgw==
+ version "3.15.6"
+ resolved "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz#674a69493ef2c849b95eafe69167ea59079eb504"
+ integrity sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==
"@types/graceful-fs@^4.1.2":
- version "4.1.3"
- resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f"
- integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==
+ version "4.1.5"
+ resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
+ integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==
dependencies:
"@types/node" "*"
@@ -6111,9 +5908,9 @@
"@types/node" "*"
"@types/http-proxy@*", "@types/http-proxy@^1.17.4", "@types/http-proxy@^1.17.8":
- version "1.17.8"
- resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55"
- integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==
+ version "1.17.9"
+ resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a"
+ integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==
dependencies:
"@types/node" "*"
@@ -6178,18 +5975,26 @@
dependencies:
"@types/jest" "*"
-"@types/jest@*", "@types/jest@^26.0.7":
- version "26.0.22"
- resolved "https://registry.npmjs.org/@types/jest/-/jest-26.0.22.tgz#8308a1debdf1b807aa47be2838acdcd91e88fbe6"
- integrity sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw==
+"@types/jest@*":
+ version "27.4.1"
+ resolved "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d"
+ integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==
+ dependencies:
+ jest-matcher-utils "^27.0.0"
+ pretty-format "^27.0.0"
+
+"@types/jest@^26.0.7":
+ version "26.0.24"
+ resolved "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a"
+ integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==
dependencies:
jest-diff "^26.0.0"
pretty-format "^26.0.0"
"@types/jquery@^3.3.34":
- version "3.5.13"
- resolved "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.13.tgz#5482d3ee325d5862f77a91c09369ae0a5b082bf3"
- integrity sha512-ZxJrup8nz/ZxcU0vantG+TPdboMhB24jad2uSap50zE7Q9rUeYlCF25kFMSmHR33qoeOgqcdHEp3roaookC0Sg==
+ version "3.5.14"
+ resolved "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz#ac8e11ee591e94d4d58da602cb3a5a8320dee577"
+ integrity sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==
dependencies:
"@types/sizzle" "*"
@@ -6214,9 +6019,9 @@
integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==
"@types/jscodeshift@^0.11.0":
- version "0.11.3"
- resolved "https://registry.npmjs.org/@types/jscodeshift/-/jscodeshift-0.11.3.tgz#8dcab24ced39dcab1c8ff3461b3d171aafee3d48"
- integrity sha512-pM0JD9kWVDH9DQp5Y6td16924V3MwZHei8P3cTeuFhXpzpk0K+iWraBZz8wF61QkFs9fZeAQNX0q8SG0+TFm2w==
+ version "0.11.5"
+ resolved "https://registry.npmjs.org/@types/jscodeshift/-/jscodeshift-0.11.5.tgz#51198aa72ceb66d36ceba3918e1ab445b868f29b"
+ integrity sha512-7JV0qdblTeWFigevmwFUgROXX395F+MQx6v0YqPn8Bx0B4Sng6alEejz9PENzgLYpG+zL0O4tGdBzc4gKZH8XA==
dependencies:
ast-types "^0.14.1"
recast "^0.20.3"
@@ -6297,9 +6102,9 @@
integrity sha512-j4x4XJwZvorEUbA519VdQ5b9AOU9TSvfi8tvxMAfP8XzNLtFex7A8vFQwqOx3WACbV0KMXbACV3cZl4/gynQ7g==
"@types/luxon@^2.0.4", "@types/luxon@^2.0.5", "@types/luxon@^2.0.9":
- version "2.3.1"
- resolved "https://registry.npmjs.org/@types/luxon/-/luxon-2.3.1.tgz#e34763178b46232e4c5f079f1706e18692415519"
- integrity sha512-nAPUltOT28fal2eDZz8yyzNhBjHw1NEymFBP7Q9iCShqpflWPybxHbD7pw/46jQmT+HXOy1QN5hNTms8MOTlOQ==
+ version "2.3.2"
+ resolved "https://registry.npmjs.org/@types/luxon/-/luxon-2.3.2.tgz#8a3f2cdd4858ce698b56cd8597d9243b8e9d3c65"
+ integrity sha512-WOehptuhKIXukSUUkRgGbj2c997Uv/iUgYgII8U7XLJqq9W2oF0kQ6frEznRQbdurioz+L/cdaIm4GutTQfgmA==
"@types/marked@^4.0.0":
version "4.0.3"
@@ -6393,9 +6198,9 @@
integrity sha512-4kxzqkrpwYtn6okJUcb2lfUu9ilnb3yhUOH6qX3nug8D2DupZ2drIkff2yJzYcNJVl3begnlcaBJ7tqiTTzjnQ==
"@types/node@^14.14.31", "@types/node@^14.14.32":
- version "14.18.14"
- resolved "https://registry.npmjs.org/@types/node/-/node-14.18.14.tgz#a0137fcc35719123e7270f158c50afd51e5e0674"
- integrity sha512-HTgN9C1x8iMFycNAkLKIkJg+D3z1j0/Bm5/CMyzI3bO8a8dS0U1FxlS6hfvg5MPUYqkG3Y1myuje7HUNKLX9Mw==
+ version "14.18.16"
+ resolved "https://registry.npmjs.org/@types/node/-/node-14.18.16.tgz#878f670ba3f00482bf859b6550b6010610fc54b5"
+ integrity sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==
"@types/node@^15.6.1":
version "15.14.9"
@@ -6403,9 +6208,9 @@
integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==
"@types/node@^16.11.26", "@types/node@^16.9.2":
- version "16.11.28"
- resolved "https://registry.npmjs.org/@types/node/-/node-16.11.28.tgz#4c16c266882b1cbd268719ea6c7c8ff3c60aae39"
- integrity sha512-l/y1ZZpWqevemVQmk0Q1TPohlJTul7u9ysq3bw6xlRDO8z+98JBI6gp4JS0OK8YkWUdYxnJU35H4vOzuiOFIag==
+ version "16.11.33"
+ resolved "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz#566713b1b626f781c5c58fe3531307283e00720c"
+ integrity sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA==
"@types/normalize-package-data@^2.4.0":
version "2.4.1"
@@ -6512,9 +6317,9 @@
integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
"@types/puppeteer@^5.4.4":
- version "5.4.5"
- resolved "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.5.tgz#154e3850a77bfd3967f036680de8ddc88eb3a12b"
- integrity sha512-lxCjpDEY+DZ66+W3x5Af4oHnEmUXt0HuaRzkBGE2UZiZEp/V1d3StpLPlmNVu/ea091bdNmVPl44lu8Wy/0ZCA==
+ version "5.4.6"
+ resolved "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.6.tgz#afc438e41dcbc27ca1ba0235ea464a372db2b21c"
+ integrity sha512-98Kghehs7+/GD9b56qryhqdqVCXUTbetTv3PlvDnmFRTHQH0j9DIp1f7rkAW3BAj4U3yoeSEQnKgdW8bDq0Y0Q==
dependencies:
"@types/node" "*"
@@ -6529,9 +6334,9 @@
integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
"@types/react-dom@*", "@types/react-dom@<18.0.0", "@types/react-dom@^17":
- version "17.0.15"
- resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.15.tgz#f2c8efde11521a4b7991e076cb9c70ba3bb0d156"
- integrity sha512-Tr9VU9DvNoHDWlmecmcsE5ZZiUkYx+nKBzum4Oxe1K0yJVyBlfbq7H3eXjxXqJczBKqPGq3EgfTru4MgKb9+Yw==
+ version "17.0.16"
+ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.16.tgz#7caba93cf2806c51e64d620d8dff4bae57e06cc4"
+ integrity sha512-DWcXf8EbMrO/gWnQU7Z88Ws/p16qxGpPyjTKTpmBSFKeE+HveVubqGO1CVK7FrwlWD5MuOcvh8gtd0/XO38NdQ==
dependencies:
"@types/react" "^17"
@@ -6797,9 +6602,9 @@
"@types/superagent" "*"
"@types/svgo@^2.6.2":
- version "2.6.2"
- resolved "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.2.tgz#97d8be0c50ff0562ed7522ba840149aee1c970e3"
- integrity sha512-m1SqMc/EDAZ8v0BBX+NmlYytUXtvrMD2/J9LICwnMvAuJwb0GSmACU3XPvcORqE7ghEJA4Mk6NYzpwhQI/biPw==
+ version "2.6.3"
+ resolved "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.3.tgz#0786d8329b67cd48d84e57cb92b79832b85e6c8e"
+ integrity sha512-5sP0Xgo0dXppY0tbYF6TevB/1+tzFLuu71XXxC/zGvQAn9PW7y+DwtDO81g0ZUPye00K6tPwtsLDOpARa0mFcA==
dependencies:
"@types/node" "*"
@@ -6915,13 +6720,6 @@
tapable "^2.2.0"
webpack "^5"
-"@types/websocket@1.0.2":
- version "1.0.2"
- resolved "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.2.tgz#d2855c6a312b7da73ed16ba6781815bf30c6187a"
- integrity sha512-B5m9aq7cbbD/5/jThEr33nUY8WEfVi6A2YKCTOvw5Ldy7mtsOkqRvGjnzy6g7iMMDsgu7xREuCzqATLDLQVKcQ==
- dependencies:
- "@types/node" "*"
-
"@types/ws@^6.0.1":
version "6.0.4"
resolved "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz#7797707c8acce8f76d8c34b370d4645b70421ff1"
@@ -6985,13 +6783,13 @@
integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==
"@typescript-eslint/eslint-plugin@^5.9.0":
- version "5.20.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz#022531a639640ff3faafaf251d1ce00a2ef000a1"
- integrity sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==
+ version "5.22.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.22.0.tgz#7b52a0de2e664044f28b36419210aea4ab619e2a"
+ integrity sha512-YCiy5PUzpAeOPGQ7VSGDEY2NeYUV1B0swde2e0HzokRsHBYjSdF6DZ51OuRZxVPHx0032lXGLvOMls91D8FXlg==
dependencies:
- "@typescript-eslint/scope-manager" "5.20.0"
- "@typescript-eslint/type-utils" "5.20.0"
- "@typescript-eslint/utils" "5.20.0"
+ "@typescript-eslint/scope-manager" "5.22.0"
+ "@typescript-eslint/type-utils" "5.22.0"
+ "@typescript-eslint/utils" "5.22.0"
debug "^4.3.2"
functional-red-black-tree "^1.0.1"
ignore "^5.1.8"
@@ -7012,13 +6810,13 @@
eslint-utils "^3.0.0"
"@typescript-eslint/parser@^5.9.0":
- version "5.20.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.20.0.tgz#4991c4ee0344315c2afc2a62f156565f689c8d0b"
- integrity sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w==
+ version "5.22.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.22.0.tgz#7bedf8784ef0d5d60567c5ba4ce162460e70c178"
+ integrity sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ==
dependencies:
- "@typescript-eslint/scope-manager" "5.20.0"
- "@typescript-eslint/types" "5.20.0"
- "@typescript-eslint/typescript-estree" "5.20.0"
+ "@typescript-eslint/scope-manager" "5.22.0"
+ "@typescript-eslint/types" "5.22.0"
+ "@typescript-eslint/typescript-estree" "5.22.0"
debug "^4.3.2"
"@typescript-eslint/scope-manager@5.20.0":
@@ -7029,6 +6827,14 @@
"@typescript-eslint/types" "5.20.0"
"@typescript-eslint/visitor-keys" "5.20.0"
+"@typescript-eslint/scope-manager@5.22.0":
+ version "5.22.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.22.0.tgz#590865f244ebe6e46dc3e9cab7976fc2afa8af24"
+ integrity sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA==
+ dependencies:
+ "@typescript-eslint/types" "5.22.0"
+ "@typescript-eslint/visitor-keys" "5.22.0"
+
"@typescript-eslint/scope-manager@5.9.0":
version "5.9.0"
resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz#02dfef920290c1dcd7b1999455a3eaae7a1a3117"
@@ -7037,12 +6843,12 @@
"@typescript-eslint/types" "5.9.0"
"@typescript-eslint/visitor-keys" "5.9.0"
-"@typescript-eslint/type-utils@5.20.0":
- version "5.20.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz#151c21cbe9a378a34685735036e5ddfc00223be3"
- integrity sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw==
+"@typescript-eslint/type-utils@5.22.0":
+ version "5.22.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.22.0.tgz#0c0e93b34210e334fbe1bcb7250c470f4a537c19"
+ integrity sha512-iqfLZIsZhK2OEJ4cQ01xOq3NaCuG5FQRKyHicA3xhZxMgaxQazLUHbH/B2k9y5i7l3+o+B5ND9Mf1AWETeMISA==
dependencies:
- "@typescript-eslint/utils" "5.20.0"
+ "@typescript-eslint/utils" "5.22.0"
debug "^4.3.2"
tsutils "^3.21.0"
@@ -7051,6 +6857,11 @@
resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz#fa39c3c2aa786568302318f1cb51fcf64258c20c"
integrity sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==
+"@typescript-eslint/types@5.22.0":
+ version "5.22.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.22.0.tgz#50a4266e457a5d4c4b87ac31903b28b06b2c3ed0"
+ integrity sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw==
+
"@typescript-eslint/types@5.9.0":
version "5.9.0"
resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz#e5619803e39d24a03b3369506df196355736e1a3"
@@ -7069,6 +6880,19 @@
semver "^7.3.5"
tsutils "^3.21.0"
+"@typescript-eslint/typescript-estree@5.22.0":
+ version "5.22.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.22.0.tgz#e2116fd644c3e2fda7f4395158cddd38c0c6df97"
+ integrity sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw==
+ dependencies:
+ "@typescript-eslint/types" "5.22.0"
+ "@typescript-eslint/visitor-keys" "5.22.0"
+ debug "^4.3.2"
+ globby "^11.0.4"
+ is-glob "^4.0.3"
+ semver "^7.3.5"
+ tsutils "^3.21.0"
+
"@typescript-eslint/typescript-estree@5.9.0":
version "5.9.0"
resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz#0e5c6f03f982931abbfbc3c1b9df5fbf92a3490f"
@@ -7082,7 +6906,19 @@
semver "^7.3.5"
tsutils "^3.21.0"
-"@typescript-eslint/utils@5.20.0", "@typescript-eslint/utils@^5.10.0":
+"@typescript-eslint/utils@5.22.0":
+ version "5.22.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.22.0.tgz#1f2c4897e2cf7e44443c848a13c60407861babd8"
+ integrity sha512-HodsGb037iobrWSUMS7QH6Hl1kppikjA1ELiJlNSTYf/UdMEwzgj0WIp+lBNb6WZ3zTwb0tEz51j0Wee3iJ3wQ==
+ dependencies:
+ "@types/json-schema" "^7.0.9"
+ "@typescript-eslint/scope-manager" "5.22.0"
+ "@typescript-eslint/types" "5.22.0"
+ "@typescript-eslint/typescript-estree" "5.22.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^3.0.0"
+
+"@typescript-eslint/utils@^5.10.0":
version "5.20.0"
resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz#b8e959ed11eca1b2d5414e12417fd94cae3517a5"
integrity sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==
@@ -7102,6 +6938,14 @@
"@typescript-eslint/types" "5.20.0"
eslint-visitor-keys "^3.0.0"
+"@typescript-eslint/visitor-keys@5.22.0":
+ version "5.22.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.22.0.tgz#f49c0ce406944ffa331a1cfabeed451ea4d0909c"
+ integrity sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg==
+ dependencies:
+ "@typescript-eslint/types" "5.22.0"
+ eslint-visitor-keys "^3.0.0"
+
"@typescript-eslint/visitor-keys@5.9.0":
version "5.9.0"
resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz#7585677732365e9d27f1878150fab3922784a1a6"
@@ -7110,16 +6954,16 @@
"@typescript-eslint/types" "5.9.0"
eslint-visitor-keys "^3.0.0"
-"@uiw/react-codemirror@^4.5.1":
- version "4.6.0"
- resolved "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.6.0.tgz#c0600bf0c337fc4daf65aa14d17328544d7cda42"
- integrity sha512-lF4vCaVDzuYlUGc8h8stXqvxwTiZR5Vt0oAv/ZZN4esU7gr6dETOGK90DiLbipuUgMiTwnsy/8IZ7MK218spCg==
+"@uiw/react-codemirror@^4.7.0":
+ version "4.7.0"
+ resolved "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.7.0.tgz#cca6cb2e91f5c5c5e545b389cc55fb307087be75"
+ integrity sha512-gRBsIScecZzqj1/vqPZ6XxykccBkp+qv6wLFyTk2DxHzuPl4cDIQwqCBl81u80by5nCKambceRkTvpiQ6oJ2Ew==
dependencies:
"@babel/runtime" ">=7.11.0"
- "@codemirror/basic-setup" "^0.19.1"
- "@codemirror/state" "^0.19.9"
- "@codemirror/theme-one-dark" "^0.19.1"
- "@codemirror/view" "^0.19.45"
+ "@codemirror/basic-setup" "^0.20.0"
+ "@codemirror/state" "^0.20.0"
+ "@codemirror/theme-one-dark" "^0.20.0"
+ "@codemirror/view" "^0.20.0"
"@webassemblyjs/ast@1.11.1":
version "1.11.1"
@@ -7290,7 +7134,7 @@ abbrev@1:
resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
-abort-controller@3.0.0, abort-controller@^3.0.0:
+abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
@@ -7682,7 +7526,7 @@ archiver-utils@^2.1.0:
normalize-path "^3.0.0"
readable-stream "^2.0.0"
-archiver@^5.0.2, archiver@^5.3.0:
+archiver@^5.0.2, archiver@^5.3.1:
version "5.3.1"
resolved "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6"
integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==
@@ -7933,15 +7777,10 @@ async-retry@^1.2.1, async-retry@^1.3.3:
dependencies:
retry "0.13.1"
-async@0.9.x:
- version "0.9.2"
- resolved "https://registry.npmjs.org/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
- integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=
-
async@^2.6.2:
- version "2.6.3"
- resolved "https://registry.npmjs.org/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
- integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+ version "2.6.4"
+ resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
+ integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==
dependencies:
lodash "^4.17.14"
@@ -7990,18 +7829,18 @@ available-typed-arrays@^1.0.2:
array-filter "^1.0.0"
aws-sdk-mock@^5.2.1:
- version "5.6.2"
- resolved "https://registry.npmjs.org/aws-sdk-mock/-/aws-sdk-mock-5.6.2.tgz#664771462953ca8d3806d5a50a63b4a6dbd5290f"
- integrity sha512-GRJg8kjRJFLm2aLiPkYSqe/RreHqlqncAeFtWdAbtSxzBdct9EaV6rqSqjyWXKNJG45Rzn2Ojo3F6qVIgkQnSg==
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/aws-sdk-mock/-/aws-sdk-mock-5.7.0.tgz#b2a9454c78d008186c3f1a460b79cdb9cc9dfdc4"
+ integrity sha512-G0AAVHLpde4fVadJrphYvVnDUX1lPxS2L+52oPYBXw9BROfVzWj47MrMMkIINBoxg3TfkCWuetczLXVKXd862w==
dependencies:
- aws-sdk "^2.928.0"
- sinon "^11.1.1"
+ aws-sdk "^2.1122.0"
+ sinon "^13.0.2"
traverse "^0.6.6"
-aws-sdk@^2.840.0, aws-sdk@^2.928.0, aws-sdk@^2.948.0:
- version "2.1119.0"
- resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1119.0.tgz#f490aca34f2f01e919a621cfdde522852a6fd7c8"
- integrity sha512-f9xoIWo0/kLVfQ65UCkQ7G+Oxl/mjmdGQNPDcylU8dOjXGfc4cgWxTLThRLCsf9l/4yUjWgo+KtJgY6BWc9UjA==
+aws-sdk@^2.1122.0, aws-sdk@^2.840.0, aws-sdk@^2.948.0:
+ version "2.1127.0"
+ resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1127.0.tgz#c5dc814bb876ea896eddcbc7891ab6493f1a5153"
+ integrity sha512-jtP0CV89m2XNfgi1SnomrK798QqLmR+340w4KOMF0vBkY9kvGzPLV9GBNcg3JPj45tML1H4hSIonYkUUFSLkYw==
dependencies:
buffer "4.9.2"
events "1.1.1"
@@ -8212,7 +8051,7 @@ babel-runtime@^6.26.0:
core-js "^2.4.0"
regenerator-runtime "^0.11.0"
-backo2@1.0.2, backo2@^1.0.2:
+backo2@1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
@@ -8312,9 +8151,9 @@ better-path-resolve@1.0.0:
is-windows "^1.0.0"
better-sqlite3@^7.5.0:
- version "7.5.0"
- resolved "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.5.0.tgz#2a91cb616453f002096743b0e5b66a7021cd1c63"
- integrity sha512-6FdG9DoytYGDhLW7VWW1vxjEz7xHkqK6LnaUQYA8d6GHNgZhu9PFX2xwKEEnSBRoT1J4PjTUPeg217ShxNmuPg==
+ version "7.5.1"
+ resolved "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.5.1.tgz#22c87135b871afd60f7cb0469d73d5339ad38665"
+ integrity sha512-+i6tH1y9KEIol1iYpZJrqDwBDQZGHioDENU49Rnidorp3bSXvw/QTYDjQGq9+TFF7RX4q0YV1sEOIRq4vDZdRg==
dependencies:
bindings "^1.5.0"
prebuild-install "^7.0.0"
@@ -8430,7 +8269,25 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9:
resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
-body-parser@1.19.2, body-parser@^1.19.0:
+body-parser@1.20.0:
+ version "1.20.0"
+ resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5"
+ integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.10.3"
+ raw-body "2.5.1"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+body-parser@^1.19.0:
version "1.19.2"
resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e"
integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==
@@ -8706,10 +8563,10 @@ buffers@~0.1.1:
resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb"
integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s=
-builtin-modules@^3.1.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484"
- integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==
+builtin-modules@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887"
+ integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==
builtin-status-codes@^3.0.0:
version "3.0.0"
@@ -8834,7 +8691,7 @@ callsites@^3.0.0:
resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-camel-case@4.1.2, camel-case@^4.1.2:
+camel-case@^4.1.2:
version "4.1.2"
resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a"
integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==
@@ -8931,7 +8788,7 @@ chainsaw@~0.1.0:
dependencies:
traverse ">=0.3.0 <0.4"
-chalk@2.4.2, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2:
+chalk@2.4.2, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1:
version "2.4.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -8967,7 +8824,7 @@ chalk@^3.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
+chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
version "4.1.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -9333,18 +9190,17 @@ code-point-at@^1.0.0:
resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
-codemirror-graphql@^1.2.15:
- version "1.2.15"
- resolved "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-1.2.15.tgz#0a7ba091ee429763aa31075e1c06ce1ed29a655f"
- integrity sha512-srON9VHCaVt6VoZm2m7Qgy0EUNCUgD50Lc3HRtHpyoi1HRjN9dAens6KlQPjv5uJrpuYLGkhwiYjh92zLfSyiA==
+codemirror-graphql@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-1.3.0.tgz#6ca19eb2735dbfd5ac9db59b8fc4c8fc1e34fe43"
+ integrity sha512-Inqecp/PpUsNFz6+V6jpgQD1m7jjGg3yby60baw2t5yb2stBH8Z/6cHm/IYp9eN0Aq2EWqomd0GkGmiISPi4jQ==
dependencies:
- "@codemirror/stream-parser" "^0.19.2"
- graphql-language-service "^5.0.1"
+ graphql-language-service "^5.0.4"
-codemirror@^5.58.2:
- version "5.63.3"
- resolved "https://registry.npmjs.org/codemirror/-/codemirror-5.63.3.tgz#97042a242027fe0c87c09b36bc01931d37b76527"
- integrity sha512-1C+LELr+5grgJYqwZKqxrcbPsHFHapVaVAloBsFBASbpLnQqLw1U8yXJ3gT5D+rhxIiSpo+kTqN+hQ+9ialIXw==
+codemirror@^5.65.3:
+ version "5.65.3"
+ resolved "https://registry.npmjs.org/codemirror/-/codemirror-5.65.3.tgz#2d029930d5a293bc5fb96ceea64654803c0d4ac7"
+ integrity sha512-kCC0iwGZOVZXHEKW3NDTObvM7pTIyowjty4BUqeREROc/3I6bWbgZDA3fGDwlA+rbgRjvnRnfqs9SfXynel1AQ==
codeowners-utils@^1.0.2:
version "1.0.2"
@@ -9835,7 +9691,12 @@ cookie@0.4.1:
resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
-cookie@0.4.2, cookie@^0.4.1, cookie@^0.4.2, cookie@~0.4.1:
+cookie@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
+ integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
+
+cookie@^0.4.1, cookie@^0.4.2, cookie@~0.4.1:
version "0.4.2"
resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
@@ -9876,9 +9737,9 @@ core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.10:
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-js@^3.4.1, core-js@^3.6.5:
- version "3.22.2"
- resolved "https://registry.npmjs.org/core-js/-/core-js-3.22.2.tgz#3ea0a245b0895fa39d1faa15fe75d91ade504a01"
- integrity sha512-Z5I2vzDnEIqO2YhELVMFcL1An2CIsFe9Q7byZhs8c/QxummxZlAHw33TUHbIte987LkisOgL0LwQ1P9D6VISnA==
+ version "3.22.4"
+ resolved "https://registry.npmjs.org/core-js/-/core-js-3.22.4.tgz#f4b3f108d45736935aa028444a69397e40d8c531"
+ integrity sha512-1uLykR+iOfYja+6Jn/57743gc9n73EWiOnSJJ4ba3B4fOEYDBv25MagmEZBxTp5cWq4b/KPx/l77zgsp28ju4w==
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
@@ -9900,17 +9761,6 @@ cosmiconfig-toml-loader@1.0.0:
dependencies:
"@iarna/toml" "^2.2.5"
-cosmiconfig@7.0.0:
- version "7.0.0"
- resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
- integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==
- dependencies:
- "@types/parse-json" "^4.0.0"
- import-fresh "^3.2.1"
- parse-json "^5.0.0"
- path-type "^4.0.0"
- yaml "^1.10.0"
-
cosmiconfig@7.0.1, cosmiconfig@^7.0.0, cosmiconfig@^7.0.1:
version "7.0.1"
resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
@@ -10016,13 +9866,6 @@ cross-env@^7.0.0:
dependencies:
cross-spawn "^7.0.1"
-cross-fetch@3.1.4:
- version "3.1.4"
- resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39"
- integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==
- dependencies:
- node-fetch "2.6.1"
-
cross-fetch@3.1.5, cross-fetch@^3.0.4, cross-fetch@^3.0.6, cross-fetch@^3.1.3, cross-fetch@^3.1.5:
version "3.1.5"
resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
@@ -10342,9 +10185,9 @@ cypress-plugin-snapshots@^1.4.4:
unidiff "1.0.2"
cypress@^9.5.0:
- version "9.5.4"
- resolved "https://registry.npmjs.org/cypress/-/cypress-9.5.4.tgz#49d9272f62eba12f2314faf29c2a865610e87550"
- integrity sha512-6AyJAD8phe7IMvOL4oBsI9puRNOWxZjl8z1lgixJMcgJ85JJmyKeP6uqNA0dI1z14lmJ7Qklf2MOgP/xdAqJ/Q==
+ version "9.6.0"
+ resolved "https://registry.npmjs.org/cypress/-/cypress-9.6.0.tgz#84473b3362255fa8f5e627a596e58575c9e5320f"
+ integrity sha512-nNwt9eBQmSENamwa8LxvggXksfyzpyYaQ7lNBLgks3XZ6dPE/6BCQFBzeAyAPt/bNXfH3tKPkAyhiAZPYkWoEg==
dependencies:
"@cypress/request" "^2.88.10"
"@cypress/xvfb" "^1.2.4"
@@ -10645,12 +10488,7 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0"
-dataloader@2.0.0, dataloader@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz#41eaf123db115987e21ca93c005cd7753c55fe6f"
- integrity sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==
-
-dataloader@2.1.0:
+dataloader@2.1.0, dataloader@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/dataloader/-/dataloader-2.1.0.tgz#c69c538235e85e7ac6c6c444bae8ecabf5de9df7"
integrity sha512-qTcEYLen3r7ojZNgVUaRggOI+KM7jrKxXeSHhogh/TWxYMeONEMqY+hmkobiYQozsGIyg9OYVzO4ZIfoB4I0pQ==
@@ -10905,11 +10743,6 @@ delegates@^1.0.0:
resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
-denque@^1.1.0:
- version "1.5.1"
- resolved "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf"
- integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==
-
denque@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a"
@@ -10948,10 +10781,10 @@ des.js@^1.0.0:
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
-destroy@~1.0.4:
- version "1.0.4"
- resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
- integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
detect-indent@^5.0.0:
version "5.0.0"
@@ -11307,11 +11140,11 @@ ee-first@1.1.1:
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
ejs@^3.1.6:
- version "3.1.6"
- resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a"
- integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==
+ version "3.1.7"
+ resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz#c544d9c7f715783dd92f0bddcf73a59e6962d006"
+ integrity sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==
dependencies:
- jake "^10.6.1"
+ jake "^10.8.5"
elastic-builder@^2.16.0:
version "2.16.0"
@@ -11787,16 +11620,6 @@ eslint-plugin-deprecation@^1.3.2:
tslib "^2.3.1"
tsutils "^3.21.0"
-eslint-plugin-graphql@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/eslint-plugin-graphql/-/eslint-plugin-graphql-4.0.0.tgz#d238ff2baee4d632cfcbe787a7a70a1f50428358"
- integrity sha512-d5tQm24YkVvCEk29ZR5ScsgXqAGCjKlMS8lx3mS7FS/EKsWbkvXQImpvic03EpMIvNTBW5e+2xnHzXB/VHNZJw==
- dependencies:
- "@babel/runtime" "^7.10.0"
- graphql-config "^3.0.2"
- lodash.flatten "^4.4.0"
- lodash.without "^4.4.0"
-
eslint-plugin-import@^2.25.4:
version "2.26.0"
resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b"
@@ -11864,9 +11687,9 @@ eslint-plugin-notice@^0.9.10:
metric-lcs "^0.1.2"
eslint-plugin-react-hooks@^4.3.0:
- version "4.4.0"
- resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz#71c39e528764c848d8253e1aa2c7024ed505f6c4"
- integrity sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==
+ version "4.5.0"
+ resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad"
+ integrity sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==
eslint-plugin-react@^7.28.0:
version "7.29.4"
@@ -11933,11 +11756,11 @@ eslint-webpack-plugin@^3.1.1:
schema-utils "^3.1.1"
eslint@^8.6.0:
- version "8.13.0"
- resolved "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz#6fcea43b6811e655410f5626cfcf328016badcd7"
- integrity sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==
+ version "8.14.0"
+ resolved "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz#62741f159d9eb4a79695b28ec4989fcdec623239"
+ integrity sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==
dependencies:
- "@eslint/eslintrc" "^1.2.1"
+ "@eslint/eslintrc" "^1.2.2"
"@humanwhocodes/config-array" "^0.9.2"
ajv "^6.10.0"
chalk "^4.0.0"
@@ -12041,10 +11864,10 @@ etag@~1.8.1:
resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
-event-source-polyfill@1.0.25:
- version "1.0.25"
- resolved "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.25.tgz#d8bb7f99cb6f8119c2baf086d9f6ee0514b6d9c8"
- integrity sha512-hQxu6sN1Eq4JjoI7ITdQeGGUN193A2ra83qC0Ltm9I2UJVAten3OFVN6k5RX4YWeCS0BoC8xg/5czOCIHVosQg==
+event-source-polyfill@1.0.26:
+ version "1.0.26"
+ resolved "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.26.tgz#86c04d088ef078279168eefa028f928fec5059a4"
+ integrity sha512-IwDLs9fUTcGAyacHBeS53T8wcEkDyDn0UP4tfQqJ4wQP8AyH0mszuQf2ULTylnpI0sMquzJ4usrNV7+uztwI9A==
event-stream@=3.3.4:
version "3.3.4"
@@ -12069,11 +11892,6 @@ eventemitter2@^6.4.3, eventemitter2@^6.4.4:
resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.5.tgz#97380f758ae24ac15df8353e0cc27f8b95644655"
integrity sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==
-eventemitter3@^3.1.0:
- version "3.1.2"
- resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
- integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
-
eventemitter3@^4.0.0, eventemitter3@^4.0.1, eventemitter3@^4.0.4:
version "4.0.7"
resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
@@ -12098,61 +11916,61 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
safe-buffer "^5.1.1"
"example-app@link:packages/app":
- version "0.2.71-next.0"
+ version "0.2.71-next.1"
dependencies:
- "@backstage/app-defaults" "^1.0.1"
+ "@backstage/app-defaults" "^1.0.2-next.0"
"@backstage/catalog-model" "^1.0.1"
- "@backstage/cli" "^0.17.1-next.0"
+ "@backstage/cli" "^0.17.1-next.1"
"@backstage/config" "^1.0.0"
- "@backstage/core-app-api" "^1.0.1"
- "@backstage/core-components" "^0.9.3"
- "@backstage/core-plugin-api" "^1.0.1"
- "@backstage/integration-react" "^1.1.0-next.0"
- "@backstage/plugin-airbrake" "^0.3.5-next.0"
- "@backstage/plugin-apache-airflow" "^0.1.12"
- "@backstage/plugin-api-docs" "^0.8.5-next.0"
- "@backstage/plugin-azure-devops" "^0.1.21-next.0"
- "@backstage/plugin-badges" "^0.2.29-next.0"
- "@backstage/plugin-catalog" "^1.2.0-next.0"
+ "@backstage/core-app-api" "^1.0.2-next.0"
+ "@backstage/core-components" "^0.9.4-next.0"
+ "@backstage/core-plugin-api" "^1.0.2-next.0"
+ "@backstage/integration-react" "^1.1.0-next.1"
+ "@backstage/plugin-airbrake" "^0.3.5-next.1"
+ "@backstage/plugin-apache-airflow" "^0.1.13-next.0"
+ "@backstage/plugin-api-docs" "^0.8.5-next.1"
+ "@backstage/plugin-azure-devops" "^0.1.21-next.1"
+ "@backstage/plugin-badges" "^0.2.29-next.1"
+ "@backstage/plugin-catalog" "^1.2.0-next.1"
"@backstage/plugin-catalog-common" "^1.0.1"
- "@backstage/plugin-catalog-graph" "^0.2.17-next.0"
- "@backstage/plugin-catalog-import" "^0.8.8-next.0"
- "@backstage/plugin-catalog-react" "^1.1.0-next.0"
- "@backstage/plugin-circleci" "^0.3.5-next.0"
- "@backstage/plugin-cloudbuild" "^0.3.5-next.0"
- "@backstage/plugin-code-coverage" "^0.1.32-next.0"
- "@backstage/plugin-cost-insights" "^0.11.26"
- "@backstage/plugin-explore" "^0.3.36-next.0"
- "@backstage/plugin-gcalendar" "^0.3.1-next.0"
- "@backstage/plugin-gcp-projects" "^0.3.23"
- "@backstage/plugin-github-actions" "^0.5.5-next.0"
- "@backstage/plugin-gocd" "^0.1.11-next.0"
- "@backstage/plugin-graphiql" "^0.2.36"
- "@backstage/plugin-home" "^0.4.21-next.0"
- "@backstage/plugin-jenkins" "^0.7.4-next.0"
- "@backstage/plugin-kafka" "^0.3.5-next.0"
- "@backstage/plugin-kubernetes" "^0.6.5-next.0"
- "@backstage/plugin-lighthouse" "^0.3.5-next.0"
- "@backstage/plugin-newrelic" "^0.3.22"
- "@backstage/plugin-newrelic-dashboard" "^0.1.13-next.0"
- "@backstage/plugin-org" "^0.5.5-next.0"
- "@backstage/plugin-pagerduty" "0.3.32-next.0"
- "@backstage/plugin-permission-react" "^0.4.0"
- "@backstage/plugin-rollbar" "^0.4.5-next.0"
- "@backstage/plugin-scaffolder" "^1.2.0-next.0"
- "@backstage/plugin-search" "^0.8.1-next.0"
+ "@backstage/plugin-catalog-graph" "^0.2.17-next.1"
+ "@backstage/plugin-catalog-import" "^0.8.8-next.1"
+ "@backstage/plugin-catalog-react" "^1.1.0-next.1"
+ "@backstage/plugin-circleci" "^0.3.5-next.1"
+ "@backstage/plugin-cloudbuild" "^0.3.5-next.1"
+ "@backstage/plugin-code-coverage" "^0.1.32-next.1"
+ "@backstage/plugin-cost-insights" "^0.11.27-next.0"
+ "@backstage/plugin-explore" "^0.3.36-next.1"
+ "@backstage/plugin-gcalendar" "^0.3.1-next.1"
+ "@backstage/plugin-gcp-projects" "^0.3.24-next.0"
+ "@backstage/plugin-github-actions" "^0.5.5-next.1"
+ "@backstage/plugin-gocd" "^0.1.11-next.1"
+ "@backstage/plugin-graphiql" "^0.2.37-next.0"
+ "@backstage/plugin-home" "^0.4.21-next.1"
+ "@backstage/plugin-jenkins" "^0.7.4-next.1"
+ "@backstage/plugin-kafka" "^0.3.5-next.1"
+ "@backstage/plugin-kubernetes" "^0.6.5-next.1"
+ "@backstage/plugin-lighthouse" "^0.3.5-next.1"
+ "@backstage/plugin-newrelic" "^0.3.23-next.0"
+ "@backstage/plugin-newrelic-dashboard" "^0.1.13-next.1"
+ "@backstage/plugin-org" "^0.5.5-next.1"
+ "@backstage/plugin-pagerduty" "0.3.32-next.1"
+ "@backstage/plugin-permission-react" "^0.4.1-next.0"
+ "@backstage/plugin-rollbar" "^0.4.5-next.1"
+ "@backstage/plugin-scaffolder" "^1.2.0-next.1"
+ "@backstage/plugin-search" "^0.8.1-next.1"
"@backstage/plugin-search-common" "^0.3.3"
- "@backstage/plugin-search-react" "^0.1.1-next.0"
- "@backstage/plugin-sentry" "^0.3.43-next.0"
- "@backstage/plugin-shortcuts" "^0.2.5"
- "@backstage/plugin-stack-overflow" "^0.1.1-next.0"
- "@backstage/plugin-tech-insights" "^0.2.1-next.0"
- "@backstage/plugin-tech-radar" "^0.5.11"
- "@backstage/plugin-techdocs" "^1.1.1-next.0"
- "@backstage/plugin-techdocs-module-addons-contrib" "^0.1.0-next.0"
- "@backstage/plugin-techdocs-react" "^0.1.1-next.0"
- "@backstage/plugin-todo" "^0.2.7-next.0"
- "@backstage/plugin-user-settings" "^0.4.3"
+ "@backstage/plugin-search-react" "^0.2.0-next.1"
+ "@backstage/plugin-sentry" "^0.3.43-next.1"
+ "@backstage/plugin-shortcuts" "^0.2.6-next.0"
+ "@backstage/plugin-stack-overflow" "^0.1.1-next.1"
+ "@backstage/plugin-tech-insights" "^0.2.1-next.1"
+ "@backstage/plugin-tech-radar" "^0.5.12-next.0"
+ "@backstage/plugin-techdocs" "^1.1.1-next.1"
+ "@backstage/plugin-techdocs-module-addons-contrib" "^0.1.0-next.1"
+ "@backstage/plugin-techdocs-react" "^0.1.1-next.1"
+ "@backstage/plugin-todo" "^0.2.7-next.1"
+ "@backstage/plugin-user-settings" "^0.4.4-next.0"
"@backstage/theme" "^0.2.15"
"@material-ui/core" "^4.12.2"
"@material-ui/icons" "^4.9.1"
@@ -12319,37 +12137,38 @@ express-xml-bodyparser@^0.3.0:
xml2js "^0.4.11"
express@^4.17.1, express@^4.17.3:
- version "4.17.3"
- resolved "https://registry.npmjs.org/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1"
- integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==
+ version "4.18.1"
+ resolved "https://registry.npmjs.org/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf"
+ integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==
dependencies:
accepts "~1.3.8"
array-flatten "1.1.1"
- body-parser "1.19.2"
+ body-parser "1.20.0"
content-disposition "0.5.4"
content-type "~1.0.4"
- cookie "0.4.2"
+ cookie "0.5.0"
cookie-signature "1.0.6"
debug "2.6.9"
- depd "~1.1.2"
+ depd "2.0.0"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
- finalhandler "~1.1.2"
+ finalhandler "1.2.0"
fresh "0.5.2"
+ http-errors "2.0.0"
merge-descriptors "1.0.1"
methods "~1.1.2"
- on-finished "~2.3.0"
+ on-finished "2.4.1"
parseurl "~1.3.3"
path-to-regexp "0.1.7"
proxy-addr "~2.0.7"
- qs "6.9.7"
+ qs "6.10.3"
range-parser "~1.2.1"
safe-buffer "5.2.1"
- send "0.17.2"
- serve-static "1.14.2"
+ send "0.18.0"
+ serve-static "1.15.0"
setprototypeof "1.2.0"
- statuses "~1.5.0"
+ statuses "2.0.1"
type-is "~1.6.18"
utils-merge "1.0.1"
vary "~1.1.2"
@@ -12402,16 +12221,16 @@ extglob@^2.0.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
-extract-files@9.0.0, extract-files@^9.0.0:
- version "9.0.0"
- resolved "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a"
- integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==
-
extract-files@^11.0.0:
version "11.0.0"
resolved "https://registry.npmjs.org/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a"
integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==
+extract-files@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a"
+ integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==
+
extract-zip@2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
@@ -12448,17 +12267,16 @@ fast-equals@^2.0.0:
resolved "https://registry.npmjs.org/fast-equals/-/fast-equals-2.0.4.tgz#3add9410585e2d7364c2deeb6a707beadb24b927"
integrity sha512-caj/ZmjHljPrZtbzJ3kfH5ia/k4mTJe/qSiXAGzxZWRZgsgDV0cvNaQULqUX8t0/JVlzzEdYOwCN5DmzTxoD4w==
-fast-glob@^3.1.1:
- version "3.2.2"
- resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d"
- integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==
+fast-glob@^3.2.9:
+ version "3.2.11"
+ resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
+ integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
- glob-parent "^5.1.0"
+ glob-parent "^5.1.2"
merge2 "^1.3.0"
- micromatch "^4.0.2"
- picomatch "^2.2.1"
+ micromatch "^4.0.4"
fast-json-parse@^1.0.3:
version "1.0.3"
@@ -12619,11 +12437,11 @@ file-uri-to-path@1.0.0:
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
filelist@^1.0.1:
- version "1.0.2"
- resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b"
- integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz#448607750376484932f67ef1b9ff07386b036c83"
+ integrity sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==
dependencies:
- minimatch "^3.0.4"
+ minimatch "^5.0.1"
filesize@^8.0.6:
version "8.0.6"
@@ -12652,17 +12470,17 @@ filter-obj@^1.1.0:
resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs=
-finalhandler@~1.1.2:
- version "1.1.2"
- resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
- integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+finalhandler@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
+ integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
dependencies:
debug "2.6.9"
encodeurl "~1.0.2"
escape-html "~1.0.3"
- on-finished "~2.3.0"
+ on-finished "2.4.1"
parseurl "~1.3.3"
- statuses "~1.5.0"
+ statuses "2.0.1"
unpipe "~1.0.0"
find-cache-dir@^2.0.0:
@@ -12819,9 +12637,9 @@ fork-ts-checker-webpack-plugin@^6.5.0:
tapable "^1.0.0"
fork-ts-checker-webpack-plugin@^7.0.0-alpha.8:
- version "7.2.6"
- resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.6.tgz#24e6b5b1ad9155bf25572a75cde9f33633a04069"
- integrity sha512-q5rdvy7CaqEWyK3ly/AjSMQ+e3DGkjuqP0pkTwJcg+PHLhQfTJXqkmRIeA2y0TPfX4U00Et+AxS2ObAsVcm0hQ==
+ version "7.2.11"
+ resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.11.tgz#aff3febbc11544ba3ad0ae4d5aa4055bd15cd26d"
+ integrity sha512-2e5+NyTUTE1Xq4fWo7KFEQblCaIvvINQwUX3jRmEGlgCTc1Ecqw/975EfQrQ0GEraxJTnp8KB9d/c8hlCHUMJA==
dependencies:
"@babel/code-frame" "^7.16.7"
chalk "^4.1.2"
@@ -12840,15 +12658,6 @@ form-data-encoder@^1.4.3, form-data-encoder@^1.7.1:
resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96"
integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==
-form-data@4.0.0, form-data@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
- integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.8"
- mime-types "^2.1.12"
-
form-data@^2.3.2, form-data@^2.5.0:
version "2.5.1"
resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4"
@@ -12867,6 +12676,15 @@ form-data@^3.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
form-data@~2.3.2:
version "2.3.3"
resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
@@ -12947,7 +12765,7 @@ fs-constants@^1.0.0:
resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
-fs-extra@10.1.0:
+fs-extra@10.1.0, fs-extra@^10.0.0, fs-extra@^10.0.1:
version "10.1.0"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
@@ -12956,15 +12774,6 @@ fs-extra@10.1.0:
jsonfile "^6.0.1"
universalify "^2.0.0"
-fs-extra@^10.0.0, fs-extra@^10.0.1:
- version "10.0.1"
- resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8"
- integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==
- dependencies:
- graceful-fs "^4.2.0"
- jsonfile "^6.0.1"
- universalify "^2.0.0"
-
fs-extra@^7.0.1, fs-extra@~7.0.1:
version "7.0.1"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
@@ -13281,7 +13090,7 @@ github-from-package@0.0.0:
resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
-glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.2:
+glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -13398,28 +13207,16 @@ globalthis@^1.0.1:
dependencies:
define-properties "^1.1.3"
-globby@11.0.3:
- version "11.0.3"
- resolved "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb"
- integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==
- dependencies:
- array-union "^2.1.0"
- dir-glob "^3.0.1"
- fast-glob "^3.1.1"
- ignore "^5.1.4"
- merge2 "^1.3.0"
- slash "^3.0.0"
-
globby@^11.0.0, globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.0.4:
- version "11.0.4"
- resolved "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
- integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==
+ version "11.1.0"
+ resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
- fast-glob "^3.1.1"
- ignore "^5.1.4"
- merge2 "^1.3.0"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
slash "^3.0.0"
globby@^7.1.1:
@@ -13509,28 +13306,33 @@ got@^9.6.0:
to-readable-stream "^1.0.0"
url-parse-lax "^3.0.0"
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
version "4.2.9"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
+graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.10"
+ resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
grapheme-splitter@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
-graphiql@^1.5.12:
- version "1.8.4"
- resolved "https://registry.npmjs.org/graphiql/-/graphiql-1.8.4.tgz#3a447eae85d839eb207a07fc3aabc6f3a10df46d"
- integrity sha512-mEYtfympvlZ4E1VMEMZ0BG3NCLA9L69EEbnpHpAA12oWz3aul4HXWl59JS0aHZftyiPx1/gHjSsjctkhbazT9g==
+graphiql@^1.5.12, graphiql@^1.8.8:
+ version "1.8.8"
+ resolved "https://registry.npmjs.org/graphiql/-/graphiql-1.8.8.tgz#eef760097b20901c0427f831ee6403fbdb2711b8"
+ integrity sha512-0AwnT7YnLU0Y+rQSZgdL7HxFJtAC2emyQAzsaqTglur/gSqw+4115LYi9tNRLGnFpxGE8giTslYLh9P0RdhiWg==
dependencies:
"@graphiql/toolkit" "^0.4.3"
- codemirror "^5.58.2"
- codemirror-graphql "^1.2.15"
+ codemirror "^5.65.3"
+ codemirror-graphql "^1.3.0"
copy-to-clipboard "^3.2.0"
entities "^2.0.0"
escape-html "^1.0.3"
- graphql-language-service "^5.0.1"
+ graphql-language-service "^5.0.4"
markdown-it "^12.2.0"
set-value "^4.1.0"
@@ -13541,23 +13343,6 @@ graphlib@^2.1.8:
dependencies:
lodash "^4.17.15"
-graphql-config@^3.0.2:
- version "3.3.0"
- resolved "https://registry.npmjs.org/graphql-config/-/graphql-config-3.3.0.tgz#24c3672a427cb67c0c717ca3b9d70e9f0c9e752b"
- integrity sha512-mSQIsPMssr7QrgqhnjI+CyVH6oQgCrgS6irHsTvwf7RFDRnR2k9kqpQOQgVoOytBSn0DOYryS0w0SAg9xor/Jw==
- dependencies:
- "@endemolshinegroup/cosmiconfig-typescript-loader" "3.0.2"
- "@graphql-tools/graphql-file-loader" "^6.0.0"
- "@graphql-tools/json-file-loader" "^6.0.0"
- "@graphql-tools/load" "^6.0.0"
- "@graphql-tools/merge" "^6.0.0"
- "@graphql-tools/url-loader" "^6.0.0"
- "@graphql-tools/utils" "^7.0.0"
- cosmiconfig "7.0.0"
- cosmiconfig-toml-loader "1.0.0"
- minimatch "3.0.4"
- string-env-interpolation "1.0.1"
-
graphql-config@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/graphql-config/-/graphql-config-4.1.0.tgz#a3b28d3fb537952ebeb69c75e4430605a10695e3"
@@ -13580,12 +13365,11 @@ graphql-executor@0.0.23:
resolved "https://registry.npmjs.org/graphql-executor/-/graphql-executor-0.0.23.tgz#205c1764b39ee0fcf611553865770f37b45851a2"
integrity sha512-3Ivlyfjaw3BWmGtUSnMpP/a4dcXCp0mJtj0PiPG14OKUizaMKlSEX+LX2Qed0LrxwniIwvU6B4w/koVjEPyWJg==
-graphql-language-service@^5.0.1:
- version "5.0.1"
- resolved "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-5.0.1.tgz#de72d12051fa48deec3883f4980f6ff3475ab8d6"
- integrity sha512-DGaGtCyU5ugCJIkTWqFxNESFCqjNEHJGWDhcu2jXY28GcPnTSqfKAk4ryCK4E514AKNFrvX9WwZEB6Csi+xbdQ==
+graphql-language-service@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-5.0.4.tgz#068dd4ff5dc6fcc6c8560ccc8f05311d5fd63fcd"
+ integrity sha512-lX+ahYBwvTHJe1N7JqA08moNwbr0RWaFILxVnbciaaeb469TTIhQi87ZgVJ/y9Szre4d0r3vjIt2EstwafzcDA==
dependencies:
- graphql-config "^4.1.0"
nullthrows "^1.0.0"
vscode-languageserver-types "^3.15.1"
@@ -13620,11 +13404,6 @@ graphql-type-json@^0.3.2:
resolved "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz#f53a851dbfe07bd1c8157d24150064baab41e115"
integrity sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==
-graphql-ws@^4.4.1:
- version "4.7.0"
- resolved "https://registry.npmjs.org/graphql-ws/-/graphql-ws-4.7.0.tgz#b323fbf35a3736eed85dac24c0054d6d10c93e62"
- integrity sha512-Md8SsmC9ZlsogFPd3Ot8HbIAAqsHh8Xoq7j4AmcIat1Bh6k91tjVyQvA0Au1/BolXSYq+RDvib6rATU2Hcf1Xw==
-
graphql-ws@^5.4.1:
version "5.5.5"
resolved "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.5.5.tgz#f375486d3f196e2a2527b503644693ae3a8670a9"
@@ -13636,9 +13415,9 @@ graphql@^15.5.1:
integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==
graphql@^16.0.0, graphql@^16.3.0:
- version "16.3.0"
- resolved "https://registry.npmjs.org/graphql/-/graphql-16.3.0.tgz#a91e24d10babf9e60c706919bb182b53ccdffc05"
- integrity sha512-xm+ANmA16BzCT5pLjuXySbQVFwH3oJctUVdy81w1sV0vBU0KgDdBGtxQOUd5zqOBk/JayAFeG8Dlmeq74rjm/A==
+ version "16.4.0"
+ resolved "https://registry.npmjs.org/graphql/-/graphql-16.4.0.tgz#bb10b1b4683045dedcb67000eb4ad134a36c59e6"
+ integrity sha512-tYDNcRvKCcfHREZYje3v33NSrSD/ZpbWWdPtBtUUuXx9NCo/2QDxYzNqCnMvfsrnbwRpEHMovVrPu/ERoLrIRg==
grouped-queue@^2.0.0:
version "2.0.0"
@@ -14118,10 +13897,10 @@ https-browserify@^1.0.0:
resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
-https-proxy-agent@5.0.0, https-proxy-agent@^5.0.0:
- version "5.0.0"
- resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
- integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
dependencies:
agent-base "6"
debug "4"
@@ -14280,18 +14059,18 @@ import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1:
parent-module "^1.0.0"
resolve-from "^4.0.0"
-import-from@3.0.0, import-from@^3.0.0:
+import-from@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2"
+ integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==
+
+import-from@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966"
integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==
dependencies:
resolve-from "^5.0.0"
-import-from@4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2"
- integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==
-
import-lazy@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
@@ -14426,9 +14205,9 @@ inquirer@^7.3.3:
through "^2.3.6"
inquirer@^8.0.0, inquirer@^8.1.1, inquirer@^8.2.0:
- version "8.2.2"
- resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.2.tgz#1310517a87a0814d25336c78a20b44c3d9b7629d"
- integrity sha512-pG7I/si6K/0X7p1qU+rfWnpTE1UIkTONN1wxtzh0d+dHXtT/JG6qBgLxoyHVsQa8cFABxAPh0pD6uUUHiAoaow==
+ version "8.2.4"
+ resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4"
+ integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==
dependencies:
ansi-escapes "^4.2.1"
chalk "^4.1.1"
@@ -14444,6 +14223,7 @@ inquirer@^8.0.0, inquirer@^8.1.1, inquirer@^8.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
through "^2.3.6"
+ wrap-ansi "^7.0.0"
internal-slot@^1.0.3:
version "1.0.3"
@@ -14489,19 +14269,17 @@ invert-kv@^1.0.0:
resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
-ioredis@^4.28.5:
- version "4.28.5"
- resolved "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz#5c149e6a8d76a7f8fa8a504ffc85b7d5b6797f9f"
- integrity sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==
+ioredis@^5.0.3:
+ version "5.0.4"
+ resolved "https://registry.npmjs.org/ioredis/-/ioredis-5.0.4.tgz#0d4abfd818adfc5ef5029fddac4b8f503a1433b7"
+ integrity sha512-qFJw3MnPNsJF1lcIOP3vztbsasOXK3nDdNAgjQj7t7/Bn/w10PGchTOpqylQNxjzPbLoYDu34LjeJtSWiKBntQ==
dependencies:
+ "@ioredis/commands" "^1.1.1"
cluster-key-slot "^1.1.0"
- debug "^4.3.1"
- denque "^1.1.0"
+ debug "^4.3.4"
+ denque "^2.0.1"
lodash.defaults "^4.2.0"
- lodash.flatten "^4.4.0"
lodash.isarguments "^3.1.0"
- p-map "^2.1.0"
- redis-commands "1.7.0"
redis-errors "^1.2.0"
redis-parser "^3.0.0"
standard-as-callback "^2.1.0"
@@ -14618,6 +14396,13 @@ is-buffer@^2.0.0:
resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623"
integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==
+is-builtin-module@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz#6fdb24313b1c03b75f8b9711c0feb8c30b903b00"
+ integrity sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==
+ dependencies:
+ builtin-modules "^3.0.0"
+
is-callable@^1.1.4, is-callable@^1.2.4:
version "1.2.4"
resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
@@ -14765,13 +14550,6 @@ is-generator-function@^1.0.7:
resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz#dfb5c2b120e02b0a8d9d2c6806cd5621aa922f7b"
integrity sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==
-is-glob@4.0.1:
- version "4.0.1"
- resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
- integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
- dependencies:
- is-extglob "^2.1.1"
-
is-glob@4.0.3, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
@@ -14932,16 +14710,16 @@ is-primitive@^3.0.1:
resolved "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz#98c4db1abff185485a657fc2905052b940524d05"
integrity sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==
-is-promise@4.0.0, is-promise@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3"
- integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==
-
is-promise@^2.1.0:
version "2.2.2"
resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
+is-promise@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3"
+ integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==
+
is-property@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
@@ -15182,9 +14960,9 @@ isomorphic-form-data@^2.0.0:
form-data "^2.3.2"
isomorphic-git@^1.8.0:
- version "1.13.1"
- resolved "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.13.1.tgz#66d9d1f24178f24230844dd70effb9d569214222"
- integrity sha512-Hyc/KCCZAqTD5oyn90K5bRbCvRt1vj60OFKKmBZZwGrdzGvXu4FBBaqUrgWnd7N07M8soCOXibkDLq0lGWjNOQ==
+ version "1.17.1"
+ resolved "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.17.1.tgz#ac5a095b78cf5ceef51954f5df4b1bdd24943e5f"
+ integrity sha512-JLZzAmc78yELH6+bZgMzqV0KGEi2duo+URWmyEnSbhhibHwDsMIlUw5tr1ZVHjC2CUQtU0X/5EY9Sbzsyx7nug==
dependencies:
async-lock "^1.1.0"
clean-git-ref "^2.0.1"
@@ -15198,7 +14976,7 @@ isomorphic-git@^1.8.0:
sha.js "^2.4.9"
simple-get "^4.0.1"
-isomorphic-ws@4.0.1, isomorphic-ws@^4.0.1:
+isomorphic-ws@^4.0.1:
version "4.0.1"
resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==
@@ -15255,18 +15033,13 @@ istanbul-reports@^3.1.3:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
-iterall@^1.2.1:
- version "1.3.0"
- resolved "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea"
- integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==
-
-jake@^10.6.1:
- version "10.8.2"
- resolved "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b"
- integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==
+jake@^10.8.5:
+ version "10.8.5"
+ resolved "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46"
+ integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==
dependencies:
- async "0.9.x"
- chalk "^2.4.2"
+ async "^3.2.3"
+ chalk "^4.0.2"
filelist "^1.0.1"
minimatch "^3.0.4"
@@ -15490,7 +15263,7 @@ jest-leak-detector@^27.5.1:
jest-get-type "^27.5.1"
pretty-format "^27.5.1"
-jest-matcher-utils@^27.5.1:
+jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1:
version "27.5.1"
resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab"
integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==
@@ -15767,9 +15540,9 @@ jose@^4.1.4:
integrity sha512-GFcVFQwYQKbQTUOo2JlpFGXTkgBw26uzDsRMD2q1WgSKNSnpKS9Ug7bdQ8dS+p4sZHNH6iRPu6WK2jLIjspaMA==
jose@^4.6.0:
- version "4.6.2"
- resolved "https://registry.npmjs.org/jose/-/jose-4.6.2.tgz#45724b4ec9b1e543240dba3da087f80eb979c1e1"
- integrity sha512-7Jd3kGkgDfhpj+SFqfam70HyVC0gtdfbGc/tHb5dqsWYlQqodgkotqWYEXn1PhQXgdJqsyOAIKT0N4O2riUFiA==
+ version "4.8.1"
+ resolved "https://registry.npmjs.org/jose/-/jose-4.8.1.tgz#dc7c2660b115ba29b44880e588c5ac313c158247"
+ integrity sha512-+/hpTbRcCw9YC0TOfN1W47pej4a9lRmltdOVdRLz5FP5UvUq3CenhXjQK7u/8NdMIIShMXYAh9VLPhc7TjhvFw==
joycon@^3.0.1:
version "3.1.0"
@@ -16078,11 +15851,11 @@ jsonfile@^4.0.0:
graceful-fs "^4.1.6"
jsonfile@^6.0.1:
- version "6.0.1"
- resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179"
- integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
dependencies:
- universalify "^1.0.0"
+ universalify "^2.0.0"
optionalDependencies:
graceful-fs "^4.1.6"
@@ -16455,9 +16228,9 @@ ldapjs@^2.2.0:
verror "^1.8.1"
leasot@^12.0.0:
- version "12.0.0"
- resolved "https://registry.npmjs.org/leasot/-/leasot-12.0.0.tgz#78c5df2c941c7285374c8d992866e22163241b22"
- integrity sha512-TMe3cJTRUMpXsOFNXCig5U84wM44y84vawkl2fC7iAJif88l/b7BtTt49VrkMsivlxlqHYVu5PjuxB9sRQf39w==
+ version "12.5.0"
+ resolved "https://registry.npmjs.org/leasot/-/leasot-12.5.0.tgz#d2b0273d0eaa3fc20ded2ede81b46b9c6f158451"
+ integrity sha512-bx2hqCDZ6EVzdaM+aIBNO12Ff0BscGVWPf23Wzj5FLCEXZuJR729Wn5Naom8dJcqpEbsk2XXzvdHus/3WZqW5w==
dependencies:
async "^3.2.0"
chalk "^4.1.0"
@@ -16565,9 +16338,9 @@ linkify-it@^3.0.1:
uc.micro "^1.0.1"
lint-staged@^12.2.0:
- version "12.4.0"
- resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-12.4.0.tgz#1fb8c73ac7a1c670b87bd2c1bf1e302c866e77af"
- integrity sha512-3X7MR0h9b7qf4iXf/1n7RlVAx+EzpAZXoCEMhVSpaBlgKDfH2ewf+QUm7BddFyq29v4dgPP+8+uYpWuSWx035A==
+ version "12.4.1"
+ resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-12.4.1.tgz#63fa27bfc8a33515f6902f63f6670864f1fb233c"
+ integrity sha512-PTXgzpflrQ+pODQTG116QNB+Q6uUTDg5B5HqGvNhoQSGt8Qy+MA/6zSnR8n38+sxP5TapzeQGTvoKni0KRS8Vg==
dependencies:
cli-truncate "^3.1.0"
colorette "^2.0.16"
@@ -16969,12 +16742,7 @@ lodash.uniq@^4.5.0:
resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
-lodash.without@^4.4.0:
- version "4.4.0"
- resolved "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac"
- integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=
-
-lodash@4.17.21, lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.0, lodash@~4.17.15, lodash@~4.17.4:
+lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.0, lodash@~4.17.15, lodash@~4.17.4:
version "4.17.21"
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -17275,9 +17043,9 @@ markdown-table@^3.0.0:
integrity sha512-CBbaYXKSGnE1uLRpKA1SWgIRb2PQrpkllNWpZtZe6VojOJ4ysqiq7/2glYcmKsOYN09QgH/HEBX5hIshAeiK6A==
marked@^4.0.14:
- version "4.0.14"
- resolved "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz#7a3a5fa5c80580bac78c1ed2e3b84d7bd6fc3870"
- integrity sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==
+ version "4.0.15"
+ resolved "https://registry.npmjs.org/marked/-/marked-4.0.15.tgz#0216b7c9d5fcf6ac5042343c41d81a8b1b5e1b4a"
+ integrity sha512-esX5lPdTfG4p8LDkv+obbRCyOKzB+820ZZyMOXJZygZBHrH9b3xXR64X4kT3sPe9Nx8qQXbmcz6kFSMt4Nfk6Q==
match-sorter@^6.0.2:
version "6.3.1"
@@ -17557,12 +17325,17 @@ merge2@^1.3.0:
resolved "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81"
integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==
+merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
merge@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==
-meros@1.1.4, meros@^1.1.4:
+meros@^1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/meros/-/meros-1.1.4.tgz#c17994d3133db8b23807f62bec7f0cb276cfd948"
integrity sha512-E9ZXfK9iQfG9s73ars9qvvvbSIkJZF5yOo9j4tcwM5tN8mUKfj/EKN5PzOr3ZH0y5wL7dLAHw3RVEfpQV9Q7VQ==
@@ -18370,11 +18143,16 @@ nanoclone@^0.2.1:
resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4"
integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==
-nanoid@^3.1.23, nanoid@^3.3.1:
+nanoid@^3.1.23:
version "3.3.1"
resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35"
integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==
+nanoid@^3.3.3:
+ version "3.3.4"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
+ integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@@ -18417,13 +18195,13 @@ nice-try@^1.0.4:
resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
-nise@^5.1.0:
- version "5.1.0"
- resolved "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz#713ef3ed138252daef20ec035ab62b7a28be645c"
- integrity sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==
+nise@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz#ac4237e0d785ecfcb83e20f389185975da5c31f3"
+ integrity sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==
dependencies:
- "@sinonjs/commons" "^1.7.0"
- "@sinonjs/fake-timers" "^7.0.4"
+ "@sinonjs/commons" "^1.8.3"
+ "@sinonjs/fake-timers" ">=5"
"@sinonjs/text-encoding" "^0.7.1"
just-extend "^4.0.2"
path-to-regexp "^1.7.0"
@@ -18467,11 +18245,6 @@ node-domexception@1.0.0:
resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
-node-fetch@2.6.1:
- version "2.6.1"
- resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
- integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
-
node-fetch@2.6.7, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.5, node-fetch@^2.6.7:
version "2.6.7"
resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
@@ -18583,9 +18356,9 @@ node-releases@^2.0.1:
integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==
nodemon@^2.0.2:
- version "2.0.15"
- resolved "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e"
- integrity sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==
+ version "2.0.16"
+ resolved "https://registry.npmjs.org/nodemon/-/nodemon-2.0.16.tgz#d71b31bfdb226c25de34afea53486c8ef225fdef"
+ integrity sha512-zsrcaOfTWRuUzBn3P44RDliLlp263Z/76FPoHFr3cFFkOz0lTPAcIw8dCzfdVIx/t3AtDYCZRCDkoCojJqaG3w==
dependencies:
chokidar "^3.5.2"
debug "^3.2.7"
@@ -19002,6 +18775,13 @@ omggif@^1.0.9:
resolved "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19"
integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
on-finished@^2.3.0, on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@@ -19267,7 +19047,7 @@ p-map-series@^2.1.0:
resolved "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2"
integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==
-p-map@^2.0.0, p-map@^2.1.0:
+p-map@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
@@ -20359,11 +20139,11 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.1.0, postcss@^8.4.7:
- version "8.4.12"
- resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905"
- integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==
+ version "8.4.13"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.13.tgz#7c87bc268e79f7f86524235821dfdf9f73e5d575"
+ integrity sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA==
dependencies:
- nanoid "^3.3.1"
+ nanoid "^3.3.3"
picocolors "^1.0.0"
source-map-js "^1.0.2"
@@ -20471,6 +20251,15 @@ pretty-format@^26.0.0, pretty-format@^26.6.2:
ansi-styles "^4.0.0"
react-is "^17.0.1"
+pretty-format@^27.0.0, pretty-format@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
+ integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+ dependencies:
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^17.0.1"
+
pretty-format@^27.0.2:
version "27.3.1"
resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.3.1.tgz#7e9486365ccdd4a502061fa761d3ab9ca1b78df5"
@@ -20481,15 +20270,6 @@ pretty-format@^27.0.2:
ansi-styles "^5.0.0"
react-is "^17.0.1"
-pretty-format@^27.5.1:
- version "27.5.1"
- resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
- integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
- dependencies:
- ansi-regex "^5.0.1"
- ansi-styles "^5.0.0"
- react-is "^17.0.1"
-
printj@~1.1.0:
version "1.1.2"
resolved "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
@@ -20748,15 +20528,15 @@ pupa@^2.1.1:
escape-goat "^2.0.0"
puppeteer@^13.1.1:
- version "13.6.0"
- resolved "https://registry.npmjs.org/puppeteer/-/puppeteer-13.6.0.tgz#3583fc60c1af59af838d65a09680f2d07f3608f9"
- integrity sha512-EJXhTyY5bXNPLFXPGcY9JaF6EKJIX8ll8cGG3WUK+553Jx96oDf1cB+lkFOro9p0X16tY+9xx7zYWl+vnWgW2g==
+ version "13.7.0"
+ resolved "https://registry.npmjs.org/puppeteer/-/puppeteer-13.7.0.tgz#18e16f83e397cf02f7a0804c67c1603d381cfb0b"
+ integrity sha512-U1uufzBjz3+PkpCxFrWzh4OrMIdIb2ztzCu0YEPfRHjHswcSwHZswnK+WdsOQJsRV8WeTg3jLhJR4D867+fjsA==
dependencies:
cross-fetch "3.1.5"
debug "4.3.4"
devtools-protocol "0.0.981744"
extract-zip "2.0.1"
- https-proxy-agent "5.0.0"
+ https-proxy-agent "5.0.1"
pkg-dir "4.2.0"
progress "2.0.3"
proxy-from-env "1.1.0"
@@ -20770,6 +20550,13 @@ q@^1.5.1:
resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+qs@6.10.3, qs@^6.10.1, qs@^6.10.2, qs@^6.10.3, qs@^6.9.1, qs@^6.9.4, qs@^6.9.6:
+ version "6.10.3"
+ resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
+ integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
+ dependencies:
+ side-channel "^1.0.4"
+
qs@6.9.3:
version "6.9.3"
resolved "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e"
@@ -20780,13 +20567,6 @@ qs@6.9.7:
resolved "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe"
integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==
-qs@^6.10.1, qs@^6.10.2, qs@^6.9.1, qs@^6.9.4, qs@^6.9.6:
- version "6.10.3"
- resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
- integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
- dependencies:
- side-channel "^1.0.4"
-
qs@~6.5.2:
version "6.5.2"
resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
@@ -20897,7 +20677,7 @@ raw-body@2.4.3:
iconv-lite "0.4.24"
unpipe "1.0.0"
-raw-body@^2.4.1:
+raw-body@2.5.1, raw-body@^2.4.1:
version "2.5.1"
resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
@@ -21041,9 +20821,9 @@ react-helmet@6.1.0:
react-side-effect "^2.1.0"
react-hook-form@^7.12.2, react-hook-form@^7.13.0:
- version "7.29.0"
- resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.29.0.tgz#5e7e41a483b70731720966ed8be52163ea1fecf1"
- integrity sha512-NcJqWRF6el5HMW30fqZRt27s+lorvlCCDbTpAyHoodQeYWXgQCvZJJQLC1kRMKdrJknVH0NIg3At6TUzlZJFOQ==
+ version "7.30.0"
+ resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.30.0.tgz#c9e2fd54d3627e43bd94bf38ef549df2e80c1371"
+ integrity sha512-DzjiM6o2vtDGNMB9I4yCqW8J21P314SboNG1O0obROkbg7KVS0I7bMtwSdKyapnCPjHgnxc3L7E5PEdISeEUcQ==
react-hot-loader@^4.13.0:
version "4.13.0"
@@ -21122,9 +20902,9 @@ react-markdown@^8.0.0:
vfile "^5.0.0"
react-query@^3.34.16:
- version "3.34.19"
- resolved "https://registry.npmjs.org/react-query/-/react-query-3.34.19.tgz#0ff049b6e0d2ed148e9abfdd346625d0e88dc229"
- integrity sha512-JO0Ymi58WKmvnhgg6bGIrYIeKb64KsKaPWo8JcGnmK2jJxAs2XmMBzlP75ZepSU7CHzcsWtIIyhMrLbX3pb/3w==
+ version "3.38.1"
+ resolved "https://registry.npmjs.org/react-query/-/react-query-3.38.1.tgz#4892304dae7eca7fa0ab5c8ae3e9748f0fca2df9"
+ integrity sha512-CM9hsz6oib17hsBguGaMJr+a0swMzou2gvNHHjAusnXvkfTx6CTzx0Iwuplox1jI2j3WiY91BGrcIN6bp1n1Iw==
dependencies:
"@babel/runtime" "^7.5.5"
broadcast-channel "^3.4.1"
@@ -21293,9 +21073,9 @@ react-virtualized-auto-sizer@^1.0.6:
integrity sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==
react-window@^1.8.6:
- version "1.8.6"
- resolved "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz#d011950ac643a994118632665aad0c6382e2a112"
- integrity sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==
+ version "1.8.7"
+ resolved "https://registry.npmjs.org/react-window/-/react-window-1.8.7.tgz#5e9fd0d23f48f432d7022cdb327219353a15f0d4"
+ integrity sha512-JHEZbPXBpKMmoNO1bNhoXOOLg/ujhL/BU4IqVU9r8eQPcy5KQnGHIHDRkJ0ns9IM5+Aq5LNwt3j8t3tIrePQzA==
dependencies:
"@babel/runtime" "^7.0.0"
memoize-one ">=3.1.1 <6"
@@ -21558,11 +21338,6 @@ redent@^3.0.0:
indent-string "^4.0.0"
strip-indent "^3.0.0"
-redis-commands@1.7.0:
- version "1.7.0"
- resolved "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89"
- integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==
-
redis-errors@^1.0.0, redis-errors@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad"
@@ -22175,9 +21950,9 @@ rollup@^0.63.4:
"@types/node" "*"
rollup@^2.60.2:
- version "2.70.2"
- resolved "https://registry.npmjs.org/rollup/-/rollup-2.70.2.tgz#808d206a8851628a065097b7ba2053bd83ba0c0d"
- integrity sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==
+ version "2.71.1"
+ resolved "https://registry.npmjs.org/rollup/-/rollup-2.71.1.tgz#82b259af7733dfd1224a8171013aaaad02971a22"
+ integrity sha512-lMZk3XfUBGjrrZQpvPSoXcZSfKcJ2Bgn+Z0L1MoW2V8Wh7BVM+LOBJTPo16yul2MwL59cXedzW1ruq3rCjSRgw==
optionalDependencies:
fsevents "~2.3.2"
@@ -22397,31 +22172,31 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-semver@^7.1.1, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@~7.3.0:
+semver@^7.1.1, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@~7.3.0:
version "7.3.7"
resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
dependencies:
lru-cache "^6.0.0"
-send@0.17.2:
- version "0.17.2"
- resolved "https://registry.npmjs.org/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820"
- integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==
+send@0.18.0:
+ version "0.18.0"
+ resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
+ integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
dependencies:
debug "2.6.9"
- depd "~1.1.2"
- destroy "~1.0.4"
+ depd "2.0.0"
+ destroy "1.2.0"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
fresh "0.5.2"
- http-errors "1.8.1"
+ http-errors "2.0.0"
mime "1.6.0"
ms "2.1.3"
- on-finished "~2.3.0"
+ on-finished "2.4.1"
range-parser "~1.2.1"
- statuses "~1.5.0"
+ statuses "2.0.1"
sentence-case@^3.0.4:
version "3.0.4"
@@ -22485,15 +22260,15 @@ serve-index@^1.9.1:
mime-types "~2.1.17"
parseurl "~1.3.2"
-serve-static@1.14.2:
- version "1.14.2"
- resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa"
- integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==
+serve-static@1.15.0:
+ version "1.15.0"
+ resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
+ integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
dependencies:
encodeurl "~1.0.2"
escape-html "~1.0.3"
parseurl "~1.3.3"
- send "0.17.2"
+ send "0.18.0"
set-blocking@^2.0.0, set-blocking@~2.0.0:
version "2.0.0"
@@ -22658,16 +22433,16 @@ simple-swizzle@^0.2.2:
dependencies:
is-arrayish "^0.3.1"
-sinon@^11.1.1:
- version "11.1.1"
- resolved "https://registry.npmjs.org/sinon/-/sinon-11.1.1.tgz#99a295a8b6f0fadbbb7e004076f3ae54fc6eab91"
- integrity sha512-ZSSmlkSyhUWbkF01Z9tEbxZLF/5tRC9eojCdFh33gtQaP7ITQVaMWQHGuFM7Cuf/KEfihuh1tTl3/ABju3AQMg==
+sinon@^13.0.2:
+ version "13.0.2"
+ resolved "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz#c6a8ddd655dc1415bbdc5ebf0e5b287806850c3a"
+ integrity sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==
dependencies:
"@sinonjs/commons" "^1.8.3"
- "@sinonjs/fake-timers" "^7.1.0"
- "@sinonjs/samsam" "^6.0.2"
+ "@sinonjs/fake-timers" "^9.1.2"
+ "@sinonjs/samsam" "^6.1.1"
diff "^5.0.0"
- nise "^5.1.0"
+ nise "^5.1.1"
supports-color "^7.2.0"
sisteransi@^1.0.5:
@@ -23206,7 +22981,7 @@ statuses@2.0.1, statuses@^2.0.0:
resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
-"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2":
version "1.5.0"
resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
@@ -23540,21 +23315,10 @@ stylis@^4.0.6:
resolved "https://registry.npmjs.org/stylis/-/stylis-4.0.7.tgz#412a90c28079417f3d27c028035095e4232d2904"
integrity sha512-OFFeUXFgwnGOKvEXaSv0D0KQ5ADP0n6g3SVONx6I/85JzNZ3u50FRwB3lVIk1QO2HNdI75tbVzc4Z66Gdp9voA==
-subscriptions-transport-ws@^0.9.18:
- version "0.9.19"
- resolved "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz#10ca32f7e291d5ee8eb728b9c02e43c52606cdcf"
- integrity sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw==
- dependencies:
- backo2 "^1.0.2"
- eventemitter3 "^3.1.0"
- iterall "^1.2.1"
- symbol-observable "^1.0.4"
- ws "^5.2.0 || ^6.0.0 || ^7.0.0"
-
sucrase@^3.18.0, sucrase@^3.20.2:
- version "3.20.3"
- resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.20.3.tgz#424f1e75b77f955724b06060f1ae708f5f0935cf"
- integrity sha512-azqwq0/Bs6RzLAdb4dXxsCgMtAaD2hzmUr4UhSfsxO46JFPAwMnnb441B/qsudZiS6Ylea3JXZe3Q497lsgXzQ==
+ version "3.21.0"
+ resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.21.0.tgz#6a5affdbe716b22e4dc99c57d366ad0d216444b9"
+ integrity sha512-FjAhMJjDcifARI7bZej0Bi1yekjWQHoEvWIXhLPwDhC6O4iZ5PtGb86WV56riW87hzpgB13wwBKO9vKAiWu5VQ==
dependencies:
commander "^4.0.0"
glob "7.1.6"
@@ -23563,30 +23327,30 @@ sucrase@^3.18.0, sucrase@^3.20.2:
pirates "^4.0.1"
ts-interface-checker "^0.1.9"
-superagent@^7.1.0:
- version "7.1.1"
- resolved "https://registry.npmjs.org/superagent/-/superagent-7.1.1.tgz#2ab187d38c3078c31c3771c0b751f10163a27136"
- integrity sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ==
+superagent@^7.1.3:
+ version "7.1.3"
+ resolved "https://registry.npmjs.org/superagent/-/superagent-7.1.3.tgz#783ff8330e7c2dad6ad8f0095edc772999273b6b"
+ integrity sha512-WA6et4nAvgBCS73lJvv1D0ssI5uk5Gh+TGN/kNe+B608EtcVs/yzfl+OLXTzDs7tOBDIpvgh/WUs1K2OK1zTeQ==
dependencies:
component-emitter "^1.3.0"
cookiejar "^2.1.3"
- debug "^4.3.3"
+ debug "^4.3.4"
fast-safe-stringify "^2.1.1"
form-data "^4.0.0"
formidable "^2.0.1"
methods "^1.1.2"
mime "^2.5.0"
- qs "^6.10.1"
+ qs "^6.10.3"
readable-stream "^3.6.0"
- semver "^7.3.5"
+ semver "^7.3.7"
supertest@^6.1.3, supertest@^6.1.6:
- version "6.2.2"
- resolved "https://registry.npmjs.org/supertest/-/supertest-6.2.2.tgz#04a5998fd3efaff187cb69f07a169755d655b001"
- integrity sha512-wCw9WhAtKJsBvh07RaS+/By91NNE0Wh0DN19/hWPlBOU8tAfOtbZoVSV4xXeoKoxgPx0rx2y+y+8660XtE7jzg==
+ version "6.2.3"
+ resolved "https://registry.npmjs.org/supertest/-/supertest-6.2.3.tgz#291b220126e5faa654d12abe1ada3658757c8c67"
+ integrity sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g==
dependencies:
methods "^1.1.2"
- superagent "^7.1.0"
+ superagent "^7.1.3"
supports-color@^2.0.0:
version "2.0.0"
@@ -23721,7 +23485,7 @@ swr@^1.1.2:
resolved "https://registry.npmjs.org/swr/-/swr-1.3.0.tgz#c6531866a35b4db37b38b72c45a63171faf9f4e8"
integrity sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==
-symbol-observable@1.2.0, symbol-observable@^1.0.4, symbol-observable@^1.1.0:
+symbol-observable@1.2.0, symbol-observable@^1.1.0:
version "1.2.0"
resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
@@ -23731,14 +23495,6 @@ symbol-tree@^3.2.4:
resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
-sync-fetch@0.3.0:
- version "0.3.0"
- resolved "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.3.0.tgz#77246da949389310ad978ab26790bb05f88d1335"
- integrity sha512-dJp4qg+x4JwSEW1HibAuMi0IIrBI3wuQr2GimmqB7OXR50wmwzfdusG+p39R9w3R6aFtZ2mzvxvWKQ3Bd/vx3g==
- dependencies:
- buffer "^5.7.0"
- node-fetch "^2.6.1"
-
sync-fetch@0.3.1, sync-fetch@^0.3.1:
version "0.3.1"
resolved "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.3.1.tgz#62aa82c4b4d43afd6906bfd7b5f92056458509f0"
@@ -23826,20 +23582,20 @@ tdigest@^0.1.1:
bintrees "1.0.1"
"techdocs-cli-embedded-app@link:packages/techdocs-cli-embedded-app":
- version "0.2.70-next.0"
+ version "0.2.70-next.1"
dependencies:
- "@backstage/app-defaults" "^1.0.1"
+ "@backstage/app-defaults" "^1.0.2-next.0"
"@backstage/catalog-model" "^1.0.1"
- "@backstage/cli" "^0.17.1-next.0"
+ "@backstage/cli" "^0.17.1-next.1"
"@backstage/config" "^1.0.0"
- "@backstage/core-app-api" "^1.0.1"
- "@backstage/core-components" "^0.9.3"
- "@backstage/core-plugin-api" "^1.0.1"
- "@backstage/integration-react" "^1.1.0-next.0"
- "@backstage/plugin-catalog" "^1.2.0-next.0"
- "@backstage/plugin-techdocs" "^1.1.1-next.0"
- "@backstage/plugin-techdocs-react" "^0.1.1-next.0"
- "@backstage/test-utils" "^1.0.2-next.0"
+ "@backstage/core-app-api" "^1.0.2-next.0"
+ "@backstage/core-components" "^0.9.4-next.0"
+ "@backstage/core-plugin-api" "^1.0.2-next.0"
+ "@backstage/integration-react" "^1.1.0-next.1"
+ "@backstage/plugin-catalog" "^1.2.0-next.1"
+ "@backstage/plugin-techdocs" "^1.1.1-next.1"
+ "@backstage/plugin-techdocs-react" "^0.1.1-next.1"
+ "@backstage/test-utils" "^1.1.0-next.1"
"@backstage/theme" "^0.2.15"
"@material-ui/core" "^4.11.0"
"@material-ui/icons" "^4.9.1"
@@ -23928,14 +23684,14 @@ test-exclude@^6.0.0:
minimatch "^3.0.4"
testcontainers@^8.1.2:
- version "8.6.1"
- resolved "https://registry.npmjs.org/testcontainers/-/testcontainers-8.6.1.tgz#a37b1eb938665f333594837caaed806ea51f7217"
- integrity sha512-yRRx55tVOwExivh6BSrbZXItmRUm5qdMks1nN3n2P7n4DIJOl4VHIcI3HiRucU4hMsbT8lXx68+xQFqz3W+ZSQ==
+ version "8.9.0"
+ resolved "https://registry.npmjs.org/testcontainers/-/testcontainers-8.9.0.tgz#20665caa7618e565e1d82850e73d658a0dfef010"
+ integrity sha512-q46N+P9wyLXmQ8QPM6+NxvvLW+A+0FxIPHl5/GF0s9mKApWB6eCGj73BMT+x7qv0/1JdtxKhcPNOYWTrfS2GeA==
dependencies:
"@balena/dockerignore" "^1.0.2"
- "@types/archiver" "^5.1.1"
- "@types/dockerode" "^3.2.7"
- archiver "^5.3.0"
+ "@types/archiver" "^5.3.1"
+ "@types/dockerode" "^3.3.8"
+ archiver "^5.3.1"
byline "^5.0.0"
debug "^4.3.4"
docker-compose "^0.23.17"
@@ -23945,6 +23701,11 @@ testcontainers@^8.1.2:
ssh-remote-port-forward "^1.0.4"
tar-fs "^2.1.1"
+testing-library__dom@^7.29.4-beta.1:
+ version "7.29.4-beta.1"
+ resolved "https://registry.npmjs.org/testing-library__dom/-/testing-library__dom-7.29.4-beta.1.tgz#dc755f485837e923efbe12c1b7ae43b0ed326f96"
+ integrity sha512-vb/SMg8rXYcYYFY2eQ2n2a0p2VWNAseM4WHLfsckIyLwxRz5fYqKysUzUYpAX8SwRfruRK+tZqLuL4ND+D1s7Q==
+
text-extensions@^1.0.0:
version "1.9.0"
resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26"
@@ -24328,25 +24089,15 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-tslib@^2, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@~2.3.0:
+tslib@^2, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@~2.3.0:
version "2.3.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
-tslib@~2.0.1:
- version "2.0.3"
- resolved "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
- integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
-
-tslib@~2.1.0:
- version "2.1.0"
- resolved "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
- integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
-
-tslib@~2.2.0:
- version "2.2.0"
- resolved "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
- integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
+tslib@^2.1.0, tslib@~2.4.0:
+ version "2.4.0"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
+ integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
tsutils@^3.21.0:
version "3.21.0"
@@ -24490,11 +24241,16 @@ typescript-json-schema@^0.53.0:
typescript "~4.5.0"
yargs "^17.1.1"
-typescript@~4.5.0, typescript@~4.5.2, typescript@~4.5.4:
+typescript@~4.5.0:
version "4.5.5"
resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3"
integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==
+typescript@~4.6.3, typescript@~4.6.4:
+ version "4.6.4"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9"
+ integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==
+
ua-parser-js@^0.7.18:
version "0.7.28"
resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31"
@@ -24737,17 +24493,12 @@ universalify@^0.1.0, universalify@^0.1.2:
resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
-universalify@^1.0.0:
- version "1.0.0"
- resolved "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d"
- integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==
-
universalify@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
-unixify@1.0.0, unixify@^1.0.0:
+unixify@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090"
integrity sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA=
@@ -24883,10 +24634,10 @@ url@^0.11.0, url@~0.11.0:
punycode "1.3.2"
querystring "0.2.0"
-use-immer@^0.6.0:
- version "0.6.0"
- resolved "https://registry.npmjs.org/use-immer/-/use-immer-0.6.0.tgz#ca6aa5ade93018e2c65cf128d19ada54fc23f70d"
- integrity sha512-dFGRfvWCqPDTOt/S431ETYTg6+uxbpb7A1pptufwXVzGJY3RlXr38+3wyLNpc6SbbmAKjWl6+EP6uW74fkEsXQ==
+use-immer@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.npmjs.org/use-immer/-/use-immer-0.7.0.tgz#e3bfbb806b5e3ff6e37441be74c306d91c1e0962"
+ integrity sha512-Re4hjrP3a/2ABZjAc0b7AK9s626bnO+H33RO2VUhiDZ2StBz5B663K6WNNlr4QtHWaGUmvLpwt3whFvvWuolQw==
use-memo-one@^1.1.1:
version "1.1.1"
@@ -25009,7 +24760,7 @@ v8-to-istanbul@^8.1.0:
convert-source-map "^1.6.0"
source-map "^0.7.3"
-valid-url@1.0.9, valid-url@^1.0.9:
+valid-url@^1.0.9:
version "1.0.9"
resolved "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=
@@ -25069,11 +24820,6 @@ value-or-promise@1.0.11, value-or-promise@^1.0.11:
resolved "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140"
integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==
-value-or-promise@1.0.6:
- version "1.0.6"
- resolved "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.6.tgz#218aa4794aa2ee24dcf48a29aba4413ed584747f"
- integrity sha512-9r0wQsWD8z/BxPOvnwbPf05ZvFngXyouE9EKB+5GbYix+BYnAwrIChCUyFIinfbf2FL/U71z+CPpbnmTdxrwBg==
-
vary@^1, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@@ -25313,9 +25059,9 @@ webpack-sources@^3.2.3:
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
webpack@^5, webpack@^5.66.0:
- version "5.70.0"
- resolved "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz#3461e6287a72b5e6e2f4872700bc8de0d7500e6d"
- integrity sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==
+ version "5.72.0"
+ resolved "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz#f8bc40d9c6bb489a4b7a8a685101d6022b8b6e28"
+ integrity sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==
dependencies:
"@types/eslint-scope" "^3.7.3"
"@types/estree" "^0.0.51"
@@ -25482,9 +25228,9 @@ winston-transport@^4.5.0:
triple-beam "^1.3.0"
winston@^3.2.1:
- version "3.6.0"
- resolved "https://registry.npmjs.org/winston/-/winston-3.6.0.tgz#be32587a099a292b88c49fac6fa529d478d93fb6"
- integrity sha512-9j8T75p+bcN6D00sF/zjFVmPp+t8KMPB1MzbbzYjeN9VWxdsYnTB40TkbNUEXAmILEfChMvAMgidlX64OG3p6w==
+ version "3.7.2"
+ resolved "https://registry.npmjs.org/winston/-/winston-3.7.2.tgz#95b4eeddbec902b3db1424932ac634f887c400b1"
+ integrity sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng==
dependencies:
"@dabh/diagnostics" "^2.0.2"
async "^3.2.3"
@@ -25606,17 +25352,12 @@ write-pkg@^4.0.0:
type-fest "^0.4.1"
write-json-file "^3.2.0"
-ws@7.4.5:
- version "7.4.5"
- resolved "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1"
- integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==
-
ws@8.5.0, ws@^8.4.2:
version "8.5.0"
resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
-"ws@^5.2.0 || ^6.0.0 || ^7.0.0", ws@^7.3.1, ws@^7.4.6, ws@^8.3.0:
+ws@^7.3.1, ws@^7.4.6, ws@^8.3.0:
version "7.5.7"
resolved "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67"
integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==